Choć Thoreau rzucił, Troll rzuca trudne koryta

19

Każdemu z tych dziewięciu myląco podobnych słów przypisz cyfrę 1-9 w dowolny sposób:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Napisz program, który pobiera ciąg znaków. Jeśli wejście jest jednym z tych dziewięciu słów, wypisz numer, który mu przypisałeś. Jeśli dane wejściowe nie są jednym z powyższych słów, program może zrobić wszystko (w tym błąd lub pętlę na zawsze).

W słowach rozróżniana jest wielkość liter, np. ThoreauPowinny dawać liczbę od 1 do 9, ale thoreauniekoniecznie będą robić to samo.

Przykład

Załóżmy, że przypisujesz liczby w następujący sposób:

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

Wtedy kiedy toughjest wprowadzane, 1powinno być wyprowadzane.
Kiedy throughjest wprowadzane, 2powinno być wyprowadzane.
Kiedy throwjest wprowadzane, 3powinno być wyprowadzane.
. . .
Kiedy thoughjest wprowadzane, 9powinno być wyprowadzane.

Wszystkie inne dane wejściowe mogą coś zrobić.

Detale

  • Weź ciąg wejściowy za pomocą stdin lub wiersza poleceń i wyślij na standardowe wyjście.
  • Dane wyjściowe mogą zawierać pojedynczy znak nowej linii.
  • Zamiast programu możesz napisać funkcję, która pobiera ciąg znaków i wypisuje wynik normalnie lub zwraca go.
  • Najkrótsze przesłanie w bajtach wygrywa .
Hobby Calvina
źródło
1
Cholera! Miałem sprytne rozwiązanie wyjścia zerowego, gdy nie zostało znalezione przy użyciu findmetody łańcuchowej Python . Potem zasady się zmieniły. Sprytny pomysł już nie taki sprytny.
Logic Knight
@CarpetPython Mój zły naprawdę. Nie wahaj się głosować, jeśli poczujesz się niezadowolony ze zmiany. (Obiecuję wszystkim, że nie będzie więcej zmian.)
Hobby Calvina
W porządku. Myślę, że moja odpowiedź jest nadal aktualna (choć trochę gadatliwie).
Logic Knight
Czy mogę sprawić, by działał niezależnie od wielkich liter?
ASCIIThenANSI
2
@ASCIIThenANSI, o ile działa w 9 przypadkach
hobby Calvina

Odpowiedzi:

19

CJam, 11 9 7 bajtów

q1b2+B%

Jak to działa :

Korzystamy z faktu, że suma kodów ASCII + 2 z modulacją 11 daje bardzo ładną kolejność od 1 do 9, a następnie 10 dla dziewięciu zainteresowanych słów. Oto zamówienie:

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

Objaśnienie kodu :

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 bajty zapisane dzięki user23013

Wypróbuj online tutaj

Optymalizator
źródło
Jak mamy to wypróbować? (nie wszyscy mówią po CJamie, niektórzy z nas mówią po lolcode)
Behrooz
@Behrooz Istnieje link. Kliknij na niego, umieść swój wpis w sekcji wprowadzania, Uruchom. Nie jestem pewien, jak może być łatwiej :)
Optymalizator
Holly cholera, zastanawiałem się, jak mam podać listę słów. fajny
Behrooz
1
@ user23013 Cholera! Za każdym razem!
Optymalizator
2
Lub q1b2+B%.
jimmy23013
18

Pyth, 8 znaków

e%Cz8109

Wypróbuj online: pakiet demonstracyjny lub testowy

Korzystam z zadania:

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

Wyjaśnienie:

   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, znalazłem magiczną liczbę 8109 za pomocą tego skryptu: fqr1 10Sme%CdT.z1.

Jakube
źródło
Czy to nie będzie miało fałszywych trafień?
Alexander-Brett
5
@ Alexander-Brett Co dokładnie masz na myśli? Dane wyjściowe wszystkich innych danych wejściowych nie są określone w PO. Możemy wydać wszystko, co chcemy.
Jakube,
Przepraszam, przegapiłem tę zmianę w OP. Szkoda: P
Alexander-Brett
11

Python 2, 92 54 bajty

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

Ciąg indeksu jest tworzony za pomocą for word in words: print chr(hash(word)%95+32),. Jak wskazano w odpowiedzi Jakube'a, funkcja skrótu da różne wyniki w zależności od wersji Pythona. Ten ciąg indeksu jest obliczany w 64-bitowym języku Python 2.7.6.

Dłuższa (92 bajty), ale mniej tajemnicza odpowiedź:

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

Programy zwracają od 1 do 9, chociaż przez dokładny rzut Thoreau rzucił przez twardego trolla w tej kolejności. Gdy dane wejściowe nie zostaną znalezione, find zwróci -1, która wygodnie zamienia się w zero po +1.

Logic Knight
źródło
Pamiętaj, że 0rzeczy nie są już wymagane. Przepraszam, że to zmieniam.
Hobby Calvina
Dzięki za zauważenie wysiłku. To było dobre rozwiązanie na chwilę ...
Logic Knight
3
@CarpetPython Ładne wykorzystanie podziału podłogi - działa zaskakująco starannie.
xnor
7

Python 2.7.9 wersja 32-bitowa, 22 bajty

lambda x:hash(x)%78%10

Zauważ, że wersja jest tutaj naprawdę ważna. Otrzymasz różne wyniki, jeśli używasz 64-bitowej wersji Pythona. Ponieważ hashmetoda oblicza 64-bitowe wartości skrótu zamiast 32-bitowego.

Zadanie to:

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

Wypróbuj online: http://ideone.com/Rqp9J8

Jakube
źródło
2
Wow, więc przez cały ten czas powtarzałeś wersje językowe i bity systemu operacyjnego? : P
Optymalizator
1
Bardzo miła odpowiedź. Czy znalazłeś stałą 78 poprzez matematykę, automatyczną iterację lub jakieś domysły?
Logic Knight
3
@CarpetPython Po prostu prosta pętla siłowa, która przechodzi przez wszystkie możliwe moduły. Raz się sorted(...)==range(1,10)zatrzymałem.
Jakube,
5

Pyth, 7 bajtów

et%Cz31

Korzystam z następującego przypisania:

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

Czinterpretuje dane wejściowe jako podstawową liczbę 256. Następnie bierzemy ten mod 31, odejmujemy 1 i otrzymujemy wynik mod 10. Równoważny pseudokod:

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

Demonstracja , uprząż testowa .

isaacg
źródło
1

Python 2, 27 bajtów

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

Dzięki temu zadaniu:

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

Możliwych jest kilka odmian, np

f=lambda w:int(w,35)/159%10
ygramul
źródło
1

Japt , 6 bajtów

nH %BÉ

Wypróbuj | Sprawdź wszystkie słowa


Wyjaśnienie

Wykorzystuje fakt, że podczas parsowania nciągu podstawowego na liczbę całkowitą JavaScript przestanie parsować, jeśli napotka cyfrę większą niż, ni zwróci wynik do tego momentu. Korzystając z bazy-32 tutaj (cyfry 0-v), ws w „rzut” i „rzut” są zasadniczo ignorowane.

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

JavaScript, 22 bajty

Bezpośrednie tłumaczenie - nie wydaje się warte publikowania go osobno.

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>

Kudłaty
źródło
0

C (gcc) , 66 bajtów

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

Wypróbuj online!

gastropner
źródło
Może wymagać -Oflagi kompilatora. h;f(char*s){for(h=33;*s;)h^=*s++;h=index("(Z5qW]2@H",h)-"H"+9;}
ceilingcat
0

Java 8, 53 25 bajtów

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

lub

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

Port odpowiedzi CJam @Optimizer, ponieważ (najprawdopodobniej) nie można tego zrobić w Javie.

Wypróbuj online.

Kevin Cruijssen
źródło
Java ma parseInt, prawda? Czy port mojego rozwiązania nie byłby krótszy?
Kudłaty
@Shaggy Java rzeczywiście ma parseIntz podaną bazą, ale niestety jest dość nadmiernie bajtowy ze względu na wymaganie klasy statycznej: Long.parseLong(...,32)jako najkrótszy wariant. Ponadto wydaje się"throw""threw" , że z jakiegoś powodu nie działa (i również) w Javie . wwydaje się, że jest poza zakresem base-32 (użycie 33 daje nieprawidłowe wyniki).
Kevin Cruijssen
0

Galaretka , 7 bajtów

OS+2%11

Wypróbuj online!

Nudny port galaretki z fantastyczną odpowiedzią CJam.

Towarzyszu SparklePony
źródło