Benché Thoreau abbia lanciato, Troll lancia attraverso trogoli difficili


19

A ognuna di queste nove parole confuse , assegna un numero 1-9 nel modo che preferisci:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Scrivi un programma che accetta una stringa. Se l'input è una di queste nove parole, emetti il ​​numero che ti è stato assegnato. Se l'input non è una delle parole sopra, il programma può fare qualsiasi cosa (incluso errore o loop per sempre).

Le parole fanno distinzione tra maiuscole e minuscole, ad esempio Thoreau, dovrebbero produrre un numero compreso tra 1 e 9 ma thoreaunon necessariamente faranno lo stesso.

Esempio

Supponiamo di assegnare i numeri come segue:

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

Quindi, quando toughviene immesso, 1dovrebbe essere emesso.
Quando throughviene immesso, 2deve essere emesso.
Quando throwviene immesso, 3deve essere emesso.
. . .
Quando thoughviene immesso, 9deve essere emesso.

Tutti gli altri input possono fare qualsiasi cosa.

Dettagli

  • Prendi la stringa di input tramite stdin o la riga di comando e l'output su stdout.
  • L'output può contenere una nuova riga finale finale.
  • Invece di un programma, è possibile scrivere una funzione che accetta una stringa e stampa il risultato normalmente o lo restituisce.
  • Vince l'invio più breve in byte .

1
Dannazione! Avevo una soluzione intelligente per produrre zero quando non lo trovavo usando il findmetodo della stringa Python . Quindi le regole sono cambiate. Un'idea intelligente non è così intelligente ora.
Logic Knight,

@CarpetPython Il mio male davvero. Non esitare a sottovalutare se non sei soddisfatto del cambiamento. (Anche se lo prometto a tutti, non ci saranno più cambiamenti.)
Calvin's Hobbies

Va bene. Penso che la mia risposta sia ancora valida (anche se sono poco dettagliata).
Logic Knight,

Posso farlo funzionare indipendentemente dalla capitalizzazione?
ASCIIThenANSI

2
@ASCIIThenANSI fintanto che funziona per i 9 casi
Calvin's Hobbies

Risposte:


19

CJam, 11 9 7 byte

q1b2+B%

Come funziona :

Stiamo sfruttando il fatto che la somma dei codici ASCII + 2 modificati con 11 fornisce un ordine molto gradevole da 1 a 9 e quindi 10 per le nove parole interessate. Ecco l'ordinamento:

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

Spiegazione del codice :

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 byte salvati grazie all'utente23013

Provalo online qui


Come dovremmo provarlo? (non tutti parlano CJam, alcuni di noi parlano lolcode)
Behrooz,

@Behrooz C'è un collegamento. Cliccaci sopra, metti i tuoi input nella sezione input, Esegui. Non sono sicuro di come possa essere più semplice :)
Optimizer,

Merda di agrifoglio, stavo pensando come dovrei dargli l'elenco delle parole. bello
Behrooz,

1
@ user23013 Accidenti! Ogni singola volta!
Ottimizzatore

2
Or q1b2+B%.
jimmy23013,

18

Pyth, 8 caratteri

e%Cz8109

Provalo online: Dimostrazione o Test Suite

Sto usando il compito:

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

Spiegazione:

   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, ho trovato il numero magico 8109 utilizzando questo script: fqr1 10Sme%CdT.z1.


Questo non avrà falsi positivi?
alexander-brett,

5
@ alexander-brett Cosa intendi esattamente? L'uscita di tutti gli altri ingressi non è specificata nell'OP. Siamo in grado di produrre tutto ciò che vogliamo.
Jakube,

Spiacente, ho perso quella modifica all'OP. È un peccato: P
alexander-brett,

11

Python 2, 92 54 byte

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

La stringa di indice viene creata con for word in words: print chr(hash(word)%95+32),. Come sottolineato nella risposta di Jakube, la funzione hash darà risultati diversi a seconda della versione di Python. Questa stringa di indice viene calcolata su Python 2.7.6 a 64 bit.

Risposta più lunga (92 byte) ma meno criptica:

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

Il programma ritorna 1-9, anche se attraverso un accurato lancio di Thoreau ha lanciato un forte troll in quell'ordine. Quando l'ingresso non viene trovato, find restituirà un -1 che si trasforma convenientemente in uno zero dopo il +1.


Si noti che il 0materiale non è più necessario. Ci scusiamo per averlo cambiato.
Calvin's Hobbies,

Grazie per aver notato lo sforzo. È stata una buona soluzione per un po '...
Logic Knight

3
@CarpetPython Un buon uso della divisione del pavimento - funziona sorprendentemente in modo ordinato.
xnor

7

Python 2.7.9 versione a 32 bit, 22 byte

lambda x:hash(x)%78%10

Nota, la versione è davvero importante qui. Otterrai risultati diversi se stai utilizzando una versione a 64 bit di Python. Poiché il hashmetodo calcolerà i valori hash a 64 bit anziché a 32 bit.

Il compito è:

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

Provalo online: http://ideone.com/Rqp9J8


2
Wow, quindi per tutto questo tempo, hai ripetuto le versioni della lingua e i bit del sistema operativo? : P
Ottimizzatore

1
Risposta molto bella. Hai trovato la costante 78 attraverso la matematica, l'iterazione automatizzata o alcune ipotesi?
Logic Knight,

3
@CarpetPython Solo un semplice ciclo di forza bruta che attraversa tutti i moduli possibili. Una volta sorted(...)==range(1,10)mi sono fermato.
Jakube,

5

Pyth, 7 byte

et%Cz31

Sto usando il seguente incarico:

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

Czinterpreta l'input come numero 256 di base. Quindi prendiamo questa mod 31, sottraiamo 1 e prendiamo il risultato mod 10. Pseudocodice equivalente:

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

Dimostrazione , cablaggio di prova .


1

Python 2, 27 byte

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

Con questo incarico:

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

Sono possibili diverse varianti, ad es

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

1

Japt , 6 byte

nH %BÉ

Provalo | Controlla tutte le parole


Spiegazione

Sfrutta il fatto che, durante l'analisi di una nstringa di base in un numero intero, JavaScript interromperà l'analisi se incontra una cifra maggiore di ne restituisce il risultato fino a quel punto. Usando la base-32 qui (cifre 0-v) le ws in "lancio" e "lancio" sono essenzialmente ignorate.

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

JavaScript, 22 byte

Una traduzione diretta - non sembra valga la pena pubblicarla separatamente.

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>



0

Java 8, 53 25 byte

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

o

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

Porto di @Optimizer CJam risposta s', perché è (molto probabilmente) non può essere fatto in qualsiasi più breve in Java ..

Provalo online.


Java ha parseInt, no? Una porta della mia soluzione non sarebbe più corta?
Shaggy,

@Shaggy Java ha effettivamente parseIntcon una base data, ma sfortunatamente è abbastanza eccessivo per byte a causa del requisito di classe statica: Long.parseLong(...,32)come variante più breve. Inoltre, per qualche motivo sembra non riuscire "throw"(e "threw"anche) in Java . wsembra al di fuori dell'intervallo base-32 (e l'utilizzo di 33 fornisce risultati errati).
Kevin Cruijssen,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.