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 .

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


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.


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.


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


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 .


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

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>



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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.