Aunque Thoreau lanzó bien, Troll tira a través de comederos difíciles

19

Para cada uno de estos nueve confusamente similares palabras , asigne un número 1-9 de la forma que desee:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Escribe un programa que tome una cadena. Si la entrada es una de estas nueve palabras, envíe el número que le asignó. Si la entrada no es una de las palabras anteriores, el programa puede hacer cualquier cosa (incluso error o bucle para siempre).

Las palabras distinguen entre mayúsculas y minúsculas, por ejemplo Thoreau, deben producir un número del 1 al 9 perothoreau no necesariamente harán lo mismo.

Ejemplo

Suponga que asigna los números de la siguiente manera:

though   9
through  2
thorough 7
Thoreau  6
throw    3
threw    5
trough   4
tough    1
troll    8

Entonces cuando toughes entrada, 1debe salir.
Cuando throughes entrada, 2debe salir.
Cuando throwes entrada, 3debe salir.
. . .
Cuando thoughes entrada, 9debe salir.

Todas las demás entradas pueden hacer cualquier cosa.

Detalles

  • Tome la cadena de entrada a través de stdin o la línea de comando y salida a stdout.
  • La salida puede contener una nueva línea final.
  • En lugar de un programa, puede escribir una función que tome una cadena e imprima el resultado normalmente o lo devuelva.
  • La presentación más corta en bytes gana .
Pasatiempos de Calvin
fuente
1
¡Maldita sea! Tuve una solución inteligente para generar cero cuando no se encuentra utilizando el findmétodo de cadena Python . Entonces las reglas cambiaron. Idea inteligente, no tan inteligente ahora.
Logic Knight
@CarpetPython My bad realmente. No dude en hacer un voto negativo si no está satisfecho con el cambio. (Aunque les prometo a todos que no habrá más cambios).
Calvin's Hobbies
Está bien. Creo que mi respuesta sigue siendo válida (aunque poco detallado).
Logic Knight
¿Puedo hacer que funcione independientemente de la capitalización?
ASCIIThenANSI
2
@ASCIIThenANSI siempre y cuando funcione para los 9 casos
Calvin's Hobbies

Respuestas:

19

CJam, 11 9 7 bytes

q1b2+B%

Cómo funciona :

Estamos haciendo uso del hecho de que la suma de los códigos ASCII + 2 modelados con 11 da un orden muy agradable de 1 a 9 y luego 10 para las nueve palabras en cuestión. Aquí está el pedido:

through -> 1
thorough -> 2 
tough -> 3 
Thoreau -> 4 
throw -> 5 
threw -> 6 
trough -> 7 
though -> 8 
troll -> 9

Explicación del código :

q               e# Read the input
 1b             e# Sum the ASCII code values of all characters in this word
   2+           e# Increment the sum by 2
     B%         e# Mod by 11 and automatically print the mod result at the end

4 bytes guardados gracias a user23013

Pruébalo en línea aquí

Optimizador
fuente
¿Cómo se supone que lo intentemos? (no todos hablan CJam, algunos de nosotros hablamos lolcode)
Behrooz
@Behrooz Hay un enlace. Haga clic en él, ponga su entrada en la sección de entrada, Ejecutar. No estoy seguro de cómo puede ser más fácil :)
Optimizer
Mierda, estaba pensando cómo se supone que debo darle la lista de palabras. agradable
Behrooz
1
@ user23013 ¡Maldición! ¡Cada vez!
Optimizador
2
O q1b2+B%.
jimmy23013
18

Pyth, 8 caracteres

e%Cz8109

Pruébelo en línea: Demostración o conjunto de pruebas

Estoy usando la tarea:

though   5
through  9
thorough 4
Thoreau  7
throw    3
threw    2
trough   8
tough    6
troll    1

Explicación:

   z       input()
  C        convert to int (convert each char to their ASCII value
           and interprete the result as number in base 256)
 %  8109   modulo 8109
e          modulo 10

Por cierto, he encontrado el número mágico 8109 mediante el uso de este script: fqr1 10Sme%CdT.z1.

Jakube
fuente
¿Esto no tendrá falsos positivos?
alexander-brett
55
@ alexander-brett ¿Qué quieres decir exactamente? La salida de todas las demás entradas no se especifica en el OP. Podemos generar lo que queramos.
Jakube
Lo siento, me perdí esa edición en el OP. Es una pena: P
alexander-brett
11

Python 2, 92 54 bytes

print'K{7j)yE<}'.find(chr(hash(raw_input())%95+32))+1

La cadena de índice se crea con for word in words: print chr(hash(word)%95+32),. Como se señaló en la respuesta de Jakube, la función hash dará diferentes resultados dependiendo de la versión de Python. Esta cadena de índice se calcula en Python 2.7.6 de 64 bits.

Respuesta más larga (92 bytes) pero menos críptica:

print'though through thorough Thoreau throw threw trough tough troll'.find(raw_input())/7+1

Los programas devuelven 1-9, aunque a través de Thoreau a través de un troll duro en ese orden. Cuando no se encuentra la entrada, find devolverá un -1 que convenientemente se convierte en cero después de +1.

Caballero Lógico
fuente
Tenga en cuenta que las 0cosas ya no son necesarias. Perdón por haberte cambiado.
Calvin's Hobbies
Gracias por notar el esfuerzo. Fue una buena solución por un tiempo ...
Logic Knight
3
@CarpetPython Buen uso de la división de piso: funciona sorprendentemente bien.
xnor
7

Python 2.7.9 versión de 32 bits, 22 bytes

lambda x:hash(x)%78%10

Tenga en cuenta que la versión es realmente importante aquí. Obtendrá resultados diferentes si está utilizando una versión de Python de 64 bits. Dado que el hashmétodo calculará valores hash de 64 bits en lugar de 32 bits.

La tarea es:

though  => 5   through => 6   thorough => 8
Thoreau => 7   throw   => 3   threw    => 1
trough  => 9   tough   => 4   troll    => 2

Pruébelo en línea: http://ideone.com/Rqp9J8

Jakube
fuente
2
Wow, ¿entonces todo este tiempo estuviste iterando a través de versiones de idioma y bits del sistema operativo? : P
Optimizer
1
Muy buena respuesta. ¿Encontró la constante 78 a través de las matemáticas, la iteración automatizada o algunas conjeturas?
Logic Knight
3
@CarpetPython Solo un simple bucle de fuerza bruta que pasa por todos los módulos posibles. Una vez sorted(...)==range(1,10)me detuve.
Jakube
5

Pyth, 7 bytes

et%Cz31

Estoy usando la siguiente tarea:

though   8
through  3
thorough 1
Thoreau  5
throw    4
threw    7
trough   6
tough    2
troll    9

Czinterpreta la entrada como un número base 256. Luego, tomamos este mod 31, restamos 1 y tomamos el resultado mod 10. Pseudocódigo equivalente:

((base_256(input()) % 31) - 1) % 10

Demostración , prueba de arnés .

isaacg
fuente
1

Python 2, 27 bytes

f=lambda w:int(w,34)%444/46

Con esta tarea:

>>> for w in "though through thorough Thoreau throw threw trough tough troll".split(): print f(w),w
...
9 though
7 through
3 thorough
8 Thoreau
2 throw
5 threw
6 trough
1 tough
4 troll

Son posibles varias variaciones, p. Ej.

f=lambda w:int(w,35)/159%10
ygramul
fuente
1

Japt , 6 bytes

nH %BÉ

Pruébalo | Revisa todas las palabras


Explicación

Aprovecha el hecho de que, al analizar una ncadena base a un entero, JavaScript dejará de analizar si encuentra un dígito mayor que ny devolverá el resultado a ese punto. Al usar base-32 aquí (dígitos 0-v), las ws en "arrojar" y "arrojar" son, esencialmente, ignoradas.

nH      :Convert from base-32
   %B   :Modulo 11
     É  :Subtract 1

JavaScript, 22 bytes

Una traducción directa: no parece que valga la pena publicarla por separado.

f=
U=>parseInt(U,32)%11-1
o.innerText=["through","tough","troll","trough","though","throw","threw","thorough","Thoreau"].map(s=>f(s)+": "+s).join`\n`
<pre id=o><pre>

Lanudo
fuente
0

C (gcc) , 66 bytes

h,k;f(char*s){for(h=33;*s;)h^=*s++;h=strchr(k="(Z5qW]2@H",h)-k+1;}

Pruébalo en línea!

gastropner
fuente
Puede requerir la -Obandera del compilador. h;f(char*s){for(h=33;*s;)h^=*s++;h=index("(Z5qW]2@H",h)-"H"+9;}
ceilingcat
0

Java 8, 53 25 bytes

s->(s.chars().sum()+2)%11

o

s->-~-~s.chars().sum()%11

Puerto de @Optimizer Cjam respuesta 's, ya que (probablemente) no se puede hacer más corto en Java ..

Pruébalo en línea.

Kevin Cruijssen
fuente
Java tiene parseInt, ¿no? ¿Un puerto de mi solución no sería más corto?
Shaggy
@Shaggy Java, de hecho, tiene parseIntuna base dada, pero desafortunadamente es demasiado byte debido al requisito de clase estática: Long.parseLong(...,32)como la variante más corta. Además, parece fallar "throw"(y "threw"también) en Java por alguna razón . wparece estar fuera del rango de base 32 (y usar 33 da resultados incorrectos).
Kevin Cruijssen