Obwohl Thoreau warf, wirft Troll durch harte Täler

19

Ordnen Sie jedem dieser neun verwirrend ähnlichen Wörter eine Zahl von 1 bis 9 zu, wie Sie möchten:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Schreiben Sie ein Programm, das einen String enthält. Wenn der Eingang eines dieser neun Wörter ist, geben Sie die Nummer aus, die Sie ihm zugewiesen haben. Wenn die Eingabe nicht eines der obigen Wörter ist, kann das Programm alles tun (einschließlich Fehler oder Endlosschleife).

Bei den Wörtern muss die Groß- und Kleinschreibung Thoreaubeachtet werden. Sie sollten beispielsweise eine Zahl von 1 thoreaubis 9 ergeben, müssen jedoch nicht dasselbe tun.

Beispiel

Angenommen, Sie weisen die Nummern wie folgt zu:

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

Wann toughdann eingegeben wird, 1sollte ausgegeben werden.
Wann througheingegeben wird, 2sollte ausgegeben werden.
Wann throweingegeben wird, 3sollte ausgegeben werden.
. . .
Wann thougheingegeben wird, 9sollte ausgegeben werden.

Alle anderen Eingaben können alles tun.

Einzelheiten

  • Nehmen Sie die Eingabezeichenfolge über stdin oder die Befehlszeile und geben Sie sie an stdout aus.
  • Die Ausgabe kann eine einzelne nachgestellte Zeile enthalten.
  • Anstelle eines Programms können Sie auch eine Funktion schreiben, die einen String aufnimmt und das Ergebnis normal ausgibt oder zurückgibt.
  • Die kürzeste Übermittlung in Bytes gewinnt .
Calvins Hobbys
quelle
1
Verdammt! Ich hatte eine clevere Lösung, um Null auszugeben, wenn sie nicht mit der Python-String- findMethode gefunden wurde. Dann haben sich die Regeln geändert. Kluge Idee jetzt nicht so klug.
Logic Knight
@ CarpetPython Mein schlechtes wirklich. Zögern Sie nicht, Ihre Meinung abzugeben, wenn Sie mit der Änderung nicht zufrieden sind. (Obwohl ich jedem verspreche, dass es keine Änderungen mehr geben wird.)
Calvins Hobbys
Das ist ok. Ich denke, meine Antwort ist immer noch gültig (obwohl ich wenig ausführlich bin).
Logic Knight
Kann ich es unabhängig von der Groß- und Kleinschreibung zum Laufen bringen?
ASCIIThenANSI
2
@ASCIIThenANSI solange es für die 9 Fälle funktioniert
Calvins Hobbys

Antworten:

19

CJam, 11 9 7 Bytes

q1b2+B%

Wie es funktioniert :

Wir machen uns die Tatsache zunutze, dass die Summe der mit 11 modifizierten ASCII-Codes + 2 eine sehr schöne Reihenfolge von 1 bis 9 und dann 10 für die neun betroffenen Wörter ergibt. Hier ist die Bestellung:

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

Code Erklärung :

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 gespart dank user23013

Probieren Sie es hier online aus

Optimierer
quelle
Wie sollen wir es versuchen? (Nicht jeder spricht CJam, einige von uns sprechen lolcode)
Behrooz
@Behrooz Es gibt einen Link. Klicken Sie darauf und geben Sie Ihre Eingaben in den Eingabebereich Ausführen ein. Nicht sicher, wie es einfacher sein kann :)
Optimierer
Holly Scheiße, ich dachte, wie soll ich ihm die Liste der Wörter geben. nett
Behrooz
1
@ user23013 Verdammt! Jedes Mal!
Optimierer
2
Oder q1b2+B%.
Jimmy23013
18

Pyth, 8 Zeichen

e%Cz8109

Probieren Sie es online aus: Demo oder Test Suite

Ich benutze die Aufgabe:

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

Erläuterung:

   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, fand ich die magische Zahl 8109 durch dieses Skript: fqr1 10Sme%CdT.z1.

Jakube
quelle
Wird dies nicht falsch-positiv sein?
Alexander-Brett
5
@ Alexander-Brett Was genau meinst du? Der Ausgang aller anderen Eingänge ist im OP nicht spezifiziert. Wir können alles ausgeben, was wir wollen.
Jakube
Tut mir leid, ich habe diese Bearbeitung verpasst. Das ist eine Schande: P
Alexander-Brett
11

Python 2, 92 54 Bytes

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

Die Indexzeichenfolge wird mit erstellt for word in words: print chr(hash(word)%95+32),. Wie in Jakubes Antwort ausgeführt, liefert die Hash-Funktion je nach Python-Version unterschiedliche Ergebnisse. Diese Indexzeichenfolge wird auf 64-Bit-Python 2.7.6 berechnet.

Längere (92 Bytes) aber weniger kryptische Antwort:

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

Das Programm gibt 1-9 zurück, obwohl durch gründlichen Thoreau-Wurf durch harten Troll in dieser Reihenfolge geworfen . Wenn die Eingabe nicht gefunden wird, gibt find ein -1 zurück, das nach dem in eine Null verwandelt wird +1.

Logik-Ritter
quelle
Beachten Sie, dass das 0Zeug nicht mehr benötigt wird. Tut mir leid, dass du es geändert hast.
Calvins Hobbys
Vielen Dank, dass Sie die Mühe bemerkt haben. Es war eine gute Lösung für eine Weile ...
Logic Knight
3
@CarpetPython Netter Einsatz der Bodenteilung - es klappt überraschend ordentlich.
xnor
7

Python 2.7.9 32-Bit-Version, 22 Byte

lambda x:hash(x)%78%10

Beachten Sie, dass die Version hier wirklich wichtig ist. Sie erhalten unterschiedliche Ergebnisse, wenn Sie eine 64-Bit-Version von Python verwenden. Seit derhash Methode 64-Bit-Hash-Werte anstelle von 32-Bit berechnet.

Die Aufgabe ist:

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

Versuchen Sie es online: http://ideone.com/Rqp9J8

Jakube
quelle
2
Wow, also haben Sie die ganze Zeit durch Sprachversionen und Betriebssystembits iteriert? : P
Optimizer
1
Sehr nette Antwort. Haben Sie die Konstante 78 durch Mathematik, automatisierte Iteration oder einige Vermutungen gefunden?
Logic Knight
3
@CarpetPython Nur eine einfache Brute-Force-Schleife, die alle möglichen Module durchläuft. Einmal sorted(...)==range(1,10)hörte ich auf.
Jakube
5

Pyth, 7 Bytes

et%Cz31

Ich benutze die folgende Zuordnung:

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

Czinterpretiert die Eingabe als Basis-256-Zahl. Dann nehmen wir diesen Mod 31, subtrahieren 1 und nehmen das Ergebnis Mod 10. Äquivalenter Pseudocode:

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

Vorführung , Testgeschirr .

isaacg
quelle
1

Python 2, 27 Bytes

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

Mit dieser Aufgabe:

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

Es sind verschiedene Variationen möglich, z

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

Japt , 6 Bytes

nH %BÉ

Versuchen Sie es | Überprüfen Sie alle Wörter


Erläuterung

Nutzt die Tatsache aus, dass nJavaScript beim Parsen einer Basiszeichenfolge in eine Ganzzahl das Parsen beendet, wenn es auf eine Ziffer stößt, die größer als ist, nund das Ergebnis bis zu diesem Punkt zurückgibt. Durch die Verwendung von base-32 hier (Ziffern 0-v) werden die ws in "threw" und "throw" im Wesentlichen ignoriert.

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

JavaScript, 22 Byte

Eine direkte Übersetzung - scheint es nicht wert zu sein, sie separat zu veröffentlichen.

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>

Zottelig
quelle
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;}

Probieren Sie es online!

Gastropner
quelle
Erfordert möglicherweise das -OCompiler-Flag. 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

oder

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

Port der CJam -Antwort von @Optimizer , da es in Java (höchstwahrscheinlich) nicht kürzer geht.

Probieren Sie es online aus.

Kevin Cruijssen
quelle
Java hat parseInt, nicht wahr? Wäre ein Port meiner Lösung nicht kürzer?
Shaggy
@Shaggy Java hat zwar eine parseIntvorgegebene Basis, ist aber aufgrund der statischen Klassenanforderung leider ziemlich byteweit : Long.parseLong(...,32)als kürzeste Variante. Darüber hinaus scheint es aus irgendeinem Grund "throw"(und "threw"auch) in Java zu scheitern . wliegt anscheinend außerhalb des Basis-32-Bereichs (und die Verwendung von 33 führt zu falschen Ergebnissen).
Kevin Cruijssen
0

Gelee , 7 Bytes

OS+2%11

Probieren Sie es online!

Boring Jelly Port der fantastischen CJam-Antwort.

Genosse SparklePony
quelle