Completamente embora Thoreau tenha jogado, Troll joga através de valas difíceis

19

Para cada uma dessas nove palavras semelhantes e confusas , atribua um número de 1 a 9 da maneira que desejar:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Escreva um programa que aceite uma string. Se a entrada for uma dessas nove palavras, imprima o número que você atribuiu a ela. Se a entrada não for uma das palavras acima, o programa poderá fazer qualquer coisa (incluindo erro ou loop para sempre).

As palavras diferenciam maiúsculas de minúsculas, por exemplo Thoreau, devem produzir um número de 1 a 9, mas thoreaunão necessariamente fazem o mesmo.

Exemplo

Suponha que você atribua os números da seguinte maneira:

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

Então, quando toughé entrada, 1deve ser emitida.
Quando throughé entrada, 2deve ser saída.
Quando throwé entrada, 3deve ser saída.
. . .
Quando thoughé entrada, 9deve ser saída.

Todas as outras entradas podem fazer qualquer coisa.

Detalhes

  • Pegue a string de entrada via stdin ou na linha de comando e envie para stdout.
  • A saída pode conter uma única nova linha à direita.
  • Em vez de um programa, você pode escrever uma função que pega uma string e imprime o resultado normalmente ou o retorna.
  • O menor envio em bytes vence .
Passatempos de Calvin
fonte
11
Droga! Eu tinha uma solução inteligente para gerar zero quando não encontrado usando o findmétodo de string Python . Então as regras mudaram. Idéia inteligente, não tão inteligente agora.
Logic Knight
@CarpetPython My bad really. Não hesite em votar novamente se não estiver satisfeito com a mudança. (Embora eu prometo a todos que não haverá mais mudanças.)
de Calvino Hobbies
Isso está ok. Eu acho que minha resposta ainda é válida (embora eu seja pouco detalhada).
Logic Knight
Posso fazê-lo funcionar independentemente da capitalização?
ASCIIThenANSI
2
@ASCIIThenANSI enquanto ele trabalha para os 9 casos
Passatempo de Calvino

Respostas:

19

CJam, 11 9 7 bytes

q1b2+B%

Como funciona :

Estamos fazendo uso do fato de que a soma dos códigos ASCII + 2 modificados com 11 fornece uma ordem muito agradável de 1 a 9 e, em seguida, 10 para as nove palavras em questão. Aqui está o pedido:

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

Explicação do 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 salvos graças ao user23013

Experimente online aqui

Optimizer
fonte
Como devemos tentar? (nem todo mundo fala CJam, alguns de nós falam lolcode)
Behrooz
@Behrooz Existe um link. Clique nele, coloque sua entrada na seção de entrada, Executar. Não tenho certeza como ele pode ser mais fácil :)
Optimizer
Merda Holly, eu estava pensando em como devo dar a lista de palavras. bom #
Behrooz
11
@ user23013 Porra! Toda vez!
Optimizer
2
Or q1b2+B%.
Jimmy23013
18

Pitão, 8 caracteres

e%Cz8109

Experimente on-line: Demonstration or Test Suite

Estou usando a tarefa:

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

Explicação:

   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, eu encontrei o número mágico 8109 usando este script: fqr1 10Sme%CdT.z1.

Jakube
fonte
Isso não terá falso-positivos?
Alexander-brett
5
@ alexander-brett O que exatamente você quer dizer? A saída de todas as outras entradas não está especificada no OP. Podemos produzir o que quisermos.
Jakube 17/05
Desculpe, eu perdi essa edição no OP. É uma pena: P
alexander-brett
11

Python 2, 92 54 bytes

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

A cadeia de índice é criada com for word in words: print chr(hash(word)%95+32),. Como apontado na resposta de Jakube, a função hash fornecerá resultados diferentes, dependendo da versão do Python. Essa string de índice é calculada no Python 2.7.6 de 64 bits.

Resposta mais longa (92 bytes), mas menos enigmática:

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

Os programas retornam de 1 a 9 para que, por meio de um arremesso completo de Thoreau, joguei trolls difíceis nessa ordem. Quando a entrada não for encontrada, find retornará um -1 que convenientemente se transforma em zero após o +1.

Cavaleiro Lógico
fonte
Observe que o 0material não é mais necessário. Desculpe por mudar isso em você.
Hobbies de Calvin
Obrigado por perceber o esforço. Foi uma boa solução para um pouco de tempo ...
Logic Cavaleiro
3
@CarpetPython Bom uso da divisão de pisos - funciona surpreendentemente bem.
Xnor 17/05
7

Python 2.7.9 versão de 32 bits, 22 bytes

lambda x:hash(x)%78%10

Observe que a versão é realmente importante aqui. Você obterá resultados diferentes se estiver usando uma versão de 64 bits do Python. Como o hashmétodo calculará valores de hash de 64 bits em vez de 32 bits.

A atribuição é:

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

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

Jakube
fonte
2
Uau, então, durante todo esse tempo, você estava repetindo versões de idiomas e bits do sistema operacional? : P
Optimizer
11
Resposta muito boa. Você encontrou a constante 78 através da matemática, iteração automatizada ou algumas suposições?
Logic Knight
3
@CarpetPython Apenas um loop de força bruta simples que percorre todos os módulos possíveis. Uma vez sorted(...)==range(1,10)eu parei.
Jakube 17/05
5

Pitão, 7 bytes

et%Cz31

Estou usando a seguinte atribuição:

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

Czinterpreta a entrada como um número 256 básico. Então, pegamos esse mod 31, subtraímos 1 e pegamos o resultado mod 10. Pseudocódigo equivalente:

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

Demonstração , equipamento de teste .

isaacg
fonte
1

Python 2, 27 bytes

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

Com esta tarefa:

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

São possíveis várias variações, por exemplo

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

Japonês , 6 bytes

nH %BÉ

Experimente | Verifique todas as palavras


Explicação

Aproveita o fato de que, ao analisar uma nstring de base em um número inteiro, o JavaScript para de analisar se encontrar um dígito maior que ne retornar o resultado até esse ponto. Ao usar a base-32 aqui (dígitos 0-v), os ws em "jogou" e "jogou" são, essencialmente, ignorados.

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

JavaScript, 22 bytes

Uma tradução direta - não parece valer a pena publicá-la separadamente.

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>

Shaggy
fonte
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;}

Experimente online!

gastropner
fonte
Pode exigir o -Osinalizador do 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

ou

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

Porto de @Optimizer resposta CJam 's, porque ele (o mais provável) não pode ser feito a qualquer menor em Java ..

Experimente online.

Kevin Cruijssen
fonte
Java tem parseInt, não é? Uma porta da minha solução não seria mais curta?
Salsicha
O @Shaggy Java de fato possui parseIntuma base específica, mas infelizmente é excessivo de bytes devido ao requisito de classe estática: Long.parseLong(...,32)como a variante mais curta. Além disso, parece falhar "throw"(e "threw"também) em Java por algum motivo . westá fora do intervalo da base 32, ao que parece (e usar 33 fornece resultados incorretos).
Kevin Cruijssen 31/01
0

Geléia , 7 bytes

OS+2%11

Experimente online!

Porta chata Jelly da fantástica resposta CJam.

Camarada SparklePony
fonte