PROBLEMA
Dadas dos palabras, encuentra al ganador en una batalla de raíz digital .
Defina la raíz digital de una palabra de esta manera:
- A cada letra del alfabeto se le asigna un número: A = 1, B = 2, C = 3, ..., Z = 26
- Agregue los valores para cada letra para totalizar la palabra. Tome "CAT", por ejemplo. C + A + T = 3 + 1 + 20 = 24
- Agregue todos los dígitos individuales que conforman ese resultado: 24 => 2 + 4 = 6
- Repita el paso 3 hasta llegar a un solo dígito. Ese solo dígito es la raíz digital de la palabra.
Reglas:
- Se declara un ganador si su raíz digital es más grande que la otra.
- Si los valores raíz digitales son iguales, acorte las palabras eliminando cada instancia de la letra del valor más alto de ambas palabras y recalculando.
- Repita los pasos 1 y 2 hasta que haya un ganador o una de las palabras tenga solo una letra (o ninguna letra) restante.
- Si los valores raíz digitales son iguales después de pasar por el proceso de acortamiento, la palabra más larga se declara ganadora.
- Si las palabras tienen la misma longitud y no se encuentra ningún ganador después de pasar por el proceso de acortamiento, no se declara ningún ganador.
Reglas especiales:
- No se permite el uso del módulo en el cálculo de la raíz digital en sí. Se puede usar en cualquier otro lugar.
- Suponga que las palabras consistirán solo en letras mayúsculas: sin puntuación, sin espacios, etc.
ENTRADA
Tire de las palabras a través de stdin (separadas por comas). parámetros del método, o como quieras. Deje claro en su solución o en el código cómo se analizan o preparan las palabras.
SALIDA
Muestra la palabra ganadora. Si no hay ganador, muestra "STALEMATE".
Ejemplos:
entrada: CAN, BAT
CAN = 18 = 9
BAT = 23 = 5
salida: CAN
entrada: ZOO, NO
ZOO = 56 = 11 = 2
NO = 29 = 11 = 2
OO = 30 = 3
N = 14 = 5
salida: NO
ACTUALIZACIÓN : La entrada debe leerse usando stdin con las palabras como una cadena separada por comas.
ACTUALIZACIÓN : se agregaron un par de ejemplos para probar.
ACTUALIZACIÓN : aclaró la eliminación de la letra de mayor valor en el caso de un empate, esto también altera ligeramente la condición de detención, si una palabra tiene una letra o cero letras, el proceso de acortamiento se detiene
fuente
Respuestas:
J, 100
funciona así:
no tiene todavía acepta la entrada exactamente como se le pide.
fuente
APL (Dyalog) (
9186)Explicación (en orden de ejecución):
⎕ML←3
: establece ML en 3 (esto hace⊂
una partición media, entre otras cosas).G←Z⊂⍨','≠Z←⍞
: lee la entrada, se separa por comas, se almacena en G y se pasa a la función.+/¨⎕A∘⍳¨⍵
: calcula la puntuación de cada palabra. (⎕A
es una lista que contiene el alfabeto).Z←{2>⍴⍕⍵:⍵⋄∇+/⍎¨⍕⍵}¨
: calcule la raíz digital para cada puntaje (sumando todos los dígitos siempre que haya más de un dígito) y guárdelos en Z.Z≡∪Z
: si todas las puntuaciones son únicas ...:G[↑⍒Z]
: ... luego muestra la palabra con la puntuación más alta (de la lista original).⋄1∊↑¨⍴¨⍵:'STALEMATE'
: de lo contrario (si hay un empate), si una de las palabras es de longitud 1, salida STALEMATE.⋄∇1∘↓¨⍵
: de lo contrario, quite la primera letra de cada palabra y vuelva a ejecutar la función.fuente
Rubí - 210
Pruebas:
fuente
d,e=(a,b=gets.split ?,).map{|w|w.bytes.sort}
."If the words are of equal length and no winner is found after going through the shortening process, no winner is declared."
Haskell, 205 caracteres
Ejecuciones de muestra:
w
, importado más antiguo, módulo más cortofuente
',':b
→_:b
(-2), si no está demasiado apegado al procesamiento multilíneainteract$unlines.map([...]).lines
→putStr.[...]=<<getLine
(-11), si se permite una salida laxaputStr
→print
(-1). Odio que la operación de negación tome tantos caracteres, pero no puedo encontrar una forma de evitarlo.Perl, 224
225229Golf básico (nada inteligente todavía):
Perl 5.10 y superior, corre con
perl -M5.010 <file>
operl -E '<code here>'
fuente
K, 106
Utiliza el manejo de excepciones para detectar errores de pila, que resultan en casos de estancamiento.
fuente
VBA (
242462)Resulta que el código a continuación no coincide con la especificación, por lo que tuve que volver a trabajar, agregando mucha longitud (ver arriba). : - / Es posible que esto pueda jugarse más, pero ya es bastante compacto y dudo que pueda volver a reducirlo a un puntaje competitivo.
El original (abajo) no eliminó la letra de mayor valor de las palabras cuando había un empate.
fuente
Esto realmente me gustó y es mi primer post. Aunque es viejo, noté que nadie había hecho una versión de PHP, así que aquí está la mía.
534 personajes.
Ahora no estoy seguro de las reglas para comenzar, así que comencé con $ f = 'CAN, CBN' como mi entrada. Espero que haya sido correcto. He realizado todas las pruebas y las supera todas, aunque no es particularmente elegante. Realmente debo dormir un poco ahora, pero me divertí mucho resolviendo esto, gracias por un gran rompecabezas.
Codificado en http://codepad.org/ZSDuCdin
fuente
$f=trim(fgets(fopen('php://stdin')));
para tomar la entrada.$w=fgetcsv(STDIN);
funciona mejor.D: 326 caracteres
Más legible:
fuente
Mathematica
Todavía faltan algunos detalles
fuente
Mathematica
220207Después de escribir esto, noté que esto sigue el mismo razonamiento que Belisario usó,
Uso
Debido a que la respuesta no es competitiva (por ser tan larga), decidí usar un formato de entrada más compatible con Mathematica.
fuente
CoffeeScript - 335
No estoy tan contento con este como podría haber estado, pero lo pondré de todos modos. La puntuación real es muy concisa (
y
función), pero laif
s para comparar resultados (enz
) son bastante largos.Para usarlo llame
z
con sus dos palabras (por ejemploz 'FOO','BAR'
). Anotará ambas palabras y devolverá la palabra de mayor puntuación. Si es un empate, se repetirá con las palabras modificadas (manteniendo que los originales vuelvan eventualmente, de ahí los dos parámetros adicionales) que obtiene de lax
función.El javascript equivalente (expandido) para los interesados:
fuente
Raqueta 479 bytes
Sin golf:
Pruebas:
Salida:
fuente
PHP,
339(no a las especificaciones),410382359339337 BytesEDITAR 1 : +71 bytes. Usando en
STDIN
lugar defopen('php://stdin','r');
y etiquetas cortas. Además, la plena conformidad con la especificación.EDITAR 2 : -28 bytes. Usando en
fgetcsv(STDIN)
lugar deexplode(',',trim(fgets(STDIN)))
yfor
bucle usado en lugar dewhile
bucle.EDITAR 3 : -23 bytes. Funciones fusionadas
a
yb
, fusionadas para bucles.EDITAR 4 : -20 bytes. Se convirtió
c
de un recursivo en un bucle. Luego, eliminó la funciónc
y colocó su código en el espacio de nombres global.EDITAR 5 : -2 bytes. Gracias a @Titus por la
-r
bandera.fuente
-r
banderaJAVA
fuente
C ++, 473 (estoy tomando prestado un curso de hierro)
Estoy seguro de que podría acortarlo de alguna manera, pero estoy cansado.
Editar: originalmente tomó el argumento de la línea de comando, modificado para usar cin. Probablemente sean algunos caracteres más largos ahora, pero estoy demasiado cansado para contarlo.
fuente
Python: 383 caracteres
ejecuta la función
c('CAN','BAT')
:fuente
F #,
559533530 bytesNo competitivo hasta el momento. Estoy seguro de que c se puede acortar, así como las últimas líneas. No tener un acceso más fácil a los argumentos de la línea de comandos también está sufriendo aquí.
Pruébalo en línea!
Versión sin golf
fuente
PHP,
296 281267 bytesejecutar
-n
o probarlo en línea (TiO incluye desglose).En febrero de 2011, la versión actual de PHP era 5.3.5; así que no pude
[$a,$b]=fgetcsv(...)
y talcount_chars
líneasubstr
Pero ninguno de los dos habría ahorrado mucho; así que no importa mucho.
Las cosas más costosas fueron los bucles (por supuesto) y la regla # 4 (
4036 bytes).fuente