Bien que Thoreau ait jeté, Troll jette à travers des creux difficiles

19

À chacun de ces neuf mots prêtant à confusion , attribuez un nombre de 1 à 9 comme vous le souhaitez:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Écrivez un programme qui accepte une chaîne. Si l'entrée est l'un de ces neuf mots, sortez le numéro que vous lui avez attribué. Si l'entrée n'est pas l'un des mots ci-dessus, le programme peut faire n'importe quoi (y compris une erreur ou une boucle pour toujours).

Les mots sont sensibles à la casse, par exemple Thoreau, devraient produire un nombre compris entre 1 et 9 mais thoreaune feront pas nécessairement la même chose.

Exemple

Supposons que vous attribuez les numéros comme suit:

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

Alors quand toughest entrée, 1devrait être sortie.
Quand throughest entrée, 2devrait être sortie.
Quand throwest entrée, 3devrait être sortie.
. . .
Quand thoughest entrée, 9devrait être sortie.

Toutes les autres entrées peuvent faire n'importe quoi.

Détails

  • Prenez la chaîne d'entrée via stdin ou la ligne de commande et sortez-la vers stdout.
  • La sortie peut contenir une seule nouvelle ligne de fin.
  • Au lieu d'un programme, vous pouvez écrire une fonction qui prend une chaîne et imprime le résultat normalement ou le renvoie.
  • La soumission la plus courte en octets l'emporte .
Loisirs de Calvin
la source
1
Mince! J'ai eu une solution intelligente pour sortir zéro quand il n'est pas trouvé en utilisant la findméthode de chaîne Python . Ensuite, les règles ont changé. Idée intelligente pas si intelligente maintenant.
Logic Knight
@CarpetPython Mon mauvais vraiment. N'hésitez pas à voter si vous n'êtes pas satisfait du changement. (Bien que je promette à tout le monde qu'il n'y aura plus de changements.)
Calvin's Hobbies
C'est bon. Je pense que ma réponse est toujours valable (même si je suis peu verbeuse).
Logic Knight
Puis-je le faire fonctionner indépendamment de la capitalisation?
ASCIIThenANSI
2
@ASCIIThenANSI tant que cela fonctionne pour les 9 cas
Calvin's Hobbies

Réponses:

19

CJam, 11 9 7 octets

q1b2+B%

Comment ça marche :

Nous utilisons le fait que la somme des codes ASCII + 2 modulés avec 11 donne un très bel ordre de 1 à 9 puis 10 pour les neuf mots concernés. Voici la commande:

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

Explication du code :

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 octets enregistrés grâce à user23013

Essayez-le en ligne ici

Optimiseur
la source
Comment sommes-nous censés l'essayer? (tout le monde ne parle pas CJam, certains d'entre nous parlent lolcode)
Behrooz
@Behrooz Il y a un lien. Cliquez dessus, mettez votre entrée dans la section d'entrée, Exécuter. Je ne sais pas comment cela peut être plus facile :)
Optimizer
Holly merde, je pensais comment je suis censé lui donner la liste des mots. belle
Behrooz
1
@ user23013 Merde! A chaque fois!
Optimizer
2
Ou q1b2+B%.
jimmy23013
18

Pyth, 8 caractères

e%Cz8109

Essayez-le en ligne: Démonstration ou suite de tests

J'utilise le devoir:

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

Explication:

   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

BTW, j'ai trouvé le nombre magique 8109 en utilisant ce script: fqr1 10Sme%CdT.z1.

Jakube
la source
Cela n'aura-t-il pas de faux positifs?
alexander-brett
5
@ alexander-brett Que voulez-vous dire exactement? La sortie de toutes les autres entrées n'est pas spécifiée dans l'OP. Nous pouvons produire tout ce que nous voulons.
Jakube
Désolé, j'ai raté cette modification de l'OP. C'est dommage: P
alexander-brett
11

Python 2, 92 54 octets

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

La chaîne d'index est créée avec for word in words: print chr(hash(word)%95+32),. Comme indiqué dans la réponse de Jakube, la fonction de hachage donnera des résultats différents selon la version de Python. Cette chaîne d'index est calculée sur Python 2.7.6 64 bits.

Réponse plus longue (92 octets) mais moins cryptique:

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

Les programmes renvoient 1-9 car, bien que Thoreau ait jeté un troll dur dans cet ordre. Lorsque l'entrée n'est pas trouvée, find renverra un -1 qui se transforme en zéro après le +1.

Logic Knight
la source
Notez que le 0truc n'est plus nécessaire. Désolé de l'avoir changé.
Calvin's Hobbies
Merci d'avoir remarqué l'effort. C'était une bonne solution pour un petit moment ...
Logic Knight
3
@CarpetPython Belle utilisation de la division au sol - cela fonctionne étonnamment bien.
xnor
7

Python 2.7.9 version 32 bits, 22 octets

lambda x:hash(x)%78%10

Remarquez que la version est vraiment importante ici. Vous obtiendrez des résultats différents si vous utilisez une version 64 bits de Python. Étant donné que la hashméthode calcule les valeurs de hachage 64 bits au lieu de 32 bits.

La mission est:

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

Essayez-le en ligne: http://ideone.com/Rqp9J8

Jakube
la source
2
Wow, donc pendant tout ce temps, vous parcouriez les versions linguistiques et les bits du système d'exploitation? : P
Optimizer
1
Très belle réponse. Avez-vous trouvé la constante 78 grâce aux mathématiques, à l'itération automatisée ou à quelques suppositions?
Logic Knight
3
@CarpetPython Juste une simple boucle de force brute qui passe par tous les modules possibles. Une fois sorted(...)==range(1,10), je me suis arrêté.
Jakube
5

Pyth, 7 octets

et%Cz31

J'utilise l'attribution suivante:

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

Czinterprète l'entrée comme un nombre de base 256. Ensuite, nous prenons ce mod 31, soustrayons 1, et prenons le résultat mod 10. Pseudocode équivalent:

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

Démonstration , test du harnais .

isaacg
la source
1

Python 2, 27 octets

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

Avec cette mission:

>>> 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

Plusieurs variantes sont possibles, par exemple

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

Japt , 6 octets

nH %BÉ

Essayez-le | Vérifier tous les mots


Explication

Profite du fait que, lors de l'analyse d'une nchaîne de base en un entier, JavaScript arrêtera l'analyse s'il rencontre un chiffre supérieur à net retournera le résultat jusqu'à ce point. En utilisant ici la base 32 (chiffres 0-v), les ws dans "jeté" et "jet" sont, pour l'essentiel, ignorés.

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

JavaScript, 22 octets

Une traduction directe - ne semble pas utile de la publier séparément.

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>

Hirsute
la source
0

C (gcc) , 66 octets

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

Essayez-le en ligne!

gastropner
la source
Peut nécessiter l' -Oindicateur du compilateur. h;f(char*s){for(h=33;*s;)h^=*s++;h=index("(Z5qW]2@H",h)-"H"+9;}
Plafond du
0

Java 8, 53 25 octets

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

ou

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

Port de @Optimizer réponse CJAM de, parce qu'il ( le plus probable) ne peut se faire une plus courte en Java ..

Essayez-le en ligne.

Kevin Cruijssen
la source
Java l'a parseInt, n'est-ce pas? Un port de ma solution ne serait-il pas plus court?
Shaggy
@Shaggy Java a en effet parseIntune base donnée, mais malheureusement, il est assez excessif en octets en raison de l'exigence de classe statique: Long.parseLong(...,32)comme variante la plus courte. De plus, il semble échouer pour "throw"(et "threw"aussi) en Java pour une raison quelconque . west en dehors de la plage de base 32, semble-t-il (et l'utilisation de 33 donne des résultats incorrects).
Kevin Cruijssen
0

Gelée , 7 octets

OS+2%11

Essayez-le en ligne!

Boring Jelly port de la fantastique réponse CJam.

Camarade SparklePony
la source