Esse desafio é semelhante a esse outro , no entanto, fiz uma restrição (veja o texto em negrito abaixo) que acho que tornaria muito diferente e (espero) divertido também.
O desafio
Escreva um programa ou uma função em qualquer linguagem de programação que tome como entrada o nome em inglês de um número inteiro positivo que n
não exceda 100
e retorne n
como um número inteiro.
As brechas padrão são proibidas e você não pode usar nenhuma função interna, ferramenta externa ou biblioteca que já faça esse trabalho .
O código-fonte mais curto em bytes vence.
Teste
Aqui estão todos os input->output
casos:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Respostas:
C, 160 bytes
Teste-o
Como funciona
Depois de algumas tentativas, eu encontrei uma função que mapeia os números "excepcionais"
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, para os caracteres ASCII imprimíveisk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
, Respectivamente.Esta função é:
O programa golfed calcula a
hash
função da entrada até atingir o final da string ou do caractere-
. Em seguida, ele pesquisa o hash na stringk.[<* cKwye(S_-C)7=4&o]sYgmN
e determina o número correspondente. Se o final da sequência de entrada for atingido, o número será retornado; se, em vez disso, for-
atingido, será retornado o número mais o resultado do programa de golfe aplicado ao restante da sequência de entrada.fonte
JavaScript (ES6),
175166163156 156153147 bytesGuardado 7 bytes graças a @Neil
Verifique aqui:
Mostrar snippet de código
Como funciona
A idéia básica é dividir cada número em suas palavras-dígito e depois mapear cada palavra para o dígito correspondente. Quase todas as palavras são configuradas para serem correspondidas corretamente com uma regex simples, mas existem algumas anomalias:
eleven
throughnineteen
: se a palavra contiver umel
, ou ate
no meio (para evitarten
), adicionamoson-
a ao início, alterando-os paraon-eleven
throughon-nineteen
.twenty
,thirty
, Etc .: substituindo um arrastoy
com-d
mudanças para estestwent-d
,thirt-d
etc.Agora nos dividimos em hífens, espaços
dr
es. Isso divide tudo de 11 a 99 em suas palavras-dígito correspondentes e"one hundred"
em[one,hun,ed]
. Em seguida, mapeamos cada uma dessas palavras por meio de uma matriz de expressões regulares e mantemos o índice daquele que corresponde primeiro.Até agora, cada entrada será a matriz dos dígitos adequados. Tudo o que precisamos fazer é juntá-los
join``
, converter para um número com unário+
e pronto.fonte
.findIndex(y=>x.match(y))
funciona?replace
.sh + coreutils, 112 bytes
Pode ser executado em todos os casos de teste de uma só vez, um por linha.
Explicação
O backticked é
awk
avaliado para osed
scriptque transforma partes de números em sua representação numérica.
As linhas adicionais do script sed
cuidar de
-ty
s eone hundred
.Por fim, remova os iniciais
+
e tudo o que não é+
,*
ou um dígito.Apenas expressões matemáticas permanecem
e pode ser canalizado
bc
.fonte
Pitão,
79767568 bytesObrigado @ETHproductions por 7 bytes.
Basicamente, primeiro verifique a caixa do canto 100 e, em seguida, use uma matriz das duas primeiras letras dos números de 0 a 11 para determinar a semântica da entrada e modifique o valor de acordo com o sufixo ("-ty" e "-teen"; " lv "em 12 é outro caso de canto). Primeiro, divida a entrada em uma lista de palavras, depois mapeie cada uma delas com um valor e as resuma.
No pseudocódigo pitônico:
Suíte de teste
Python 3, 218 bytes
Basicamente idêntico à resposta Pyth.
Fora do assunto:
Acabei de descobrir uma versão significativa da resposta à vida, ao universo e tudo mais: são galhos sedentos de chá. Uau, galhos que anseiam por chá! Não tenho certeza de quantas outras respostas fazem isso, mas para minha resposta, se a entrada for "chá com sede", a saída é 42.
fonte
"ontwthfofisiseeiniteel"
deste programa.Python 3,
365361310303 caracteresGolfe
Ungolfed
fonte
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
Mas, como eu vejo, deve funcionar sem atribuí-lo à variável n, basta chamá.index()
-lo diretamente."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell,
252231 bytesIsso cria uma lista de todos os nomes de números em inglês de "um" a "noventa e nove" e, em seguida, consulta o índice da entrada. Se não existir, estamos no caso da borda "cem", então ele retorna
100
, caso contrário, ele retornará o índice.Ungolfed
fonte
Python 2, 275 caracteres
Simples cria uma lista de todos os números e encontra o índice.
fonte
Japt, 82 bytes
Cada
¿
um representa um caractere não imprimível. Teste online!Com base na minha resposta JS. Subtraia um byte se a saída não precisar ser um número inteiro, pois pareceria exatamente o mesmo que uma string.
Como funciona
fonte
JavaScript,
214199 bytesComo sempre: acontece que isso é muito longo para competir, mas agora que eu terminei, seria um desperdício não publicar isso.
Talvez exista uma maneira óbvia de jogar golfe mais que eu tenha esquecido?
JSFiddle para casos de teste
fonte
f
paraf=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? Além disso, um argumento de cadeia única pode ser passado para uma função da seguinte maneira:s.indexOf`lv`
Perl, 158 bytes
É executado a partir da linha de comando.
one hundred
deve ser inserido"one hundred"
para impedir que seja interpretado como duas entradas.fonte