CodeGolf Challenge
PWSSHHHH! Você acorda em um laboratório de criogenia no ano 3000. Ao ser escoltado para o escritório de designação para receber seu chip de carreira, presumivelmente o de um entregador, uma sonda detecta que você é do ano 2000. Por causa disso, e alguns estereótipos, você é considerado estúpido em comparação com o ser humano moderno de hoje e é forçado a repetir a escola.
Você entra na sala de aula da primeira série e o professor está dando uma tarefa. Ela dirá ou escreverá um número até 50. Se ela escrever o número no quadro (por exemplo: 25), será necessário dizer os números até esse número "um, dois, três, ..., vinte e cinco " Se ela disser o número em voz alta (por exemplo: "seis"), em seu tablet, você deverá escrever os números até esse número "1, 2, 3, 4, 5, 6"
Isso se torna muito entediante e você decide que automatizará o processo com seu conhecimento de programação ainda em funcionamento, ainda que arcaico, do século XXI.
Objetivo:
Seu programa deve receber uma entrada. Essa entrada será um número decimal ( 1 thru 50
) ou um número gravado ( one thru fifty
).
• Se a entrada for um número decimal, sua saída deverá contar de um a esse número, usando o estilo gravado. (por exemplo, trinta e dois )
• Se a entrada for um número gravado, sua saída deverá contar de 1 a esse número, usando o estilo decimal. (por exemplo, 32 )
Regras:
A entrada e a saída podem ser escolhidas em qualquer caso (para que você possa criar um programa que aceite apenas maiúsculas, se desejar).
Os números decimais de entrada não precisam ser do tipo de número (por exemplo, int), podem ser uma sequência de entrada contendo números (25 vs "25"). Ou estão bem e você pode escolher qual deles deseja que seu programa aceite. (Seu programa não precisa aceitar os dois)
O estilo gravado NÃO requer um hífen entre as palavras compostas, mas você pode, se desejar.
Os valores de saída precisam ser separados de alguma forma, qualquer separador é bom 1,2,3
1 2 3
etc
Você não pode adicionar bibliotecas extras, como num2words (python) etc. (no entanto, as bibliotecas do sistema estão boas)
Embora a história anterior diga que você é do ano 2000, você pode usar os idiomas criados após essa data (risos)
Isso é código-golfe , então o programa com o menor número de bytes vence!
Respostas:
Perl 6 ,
119113 bytesBanco de dados Unicode FTW!
Usa números gravados em letras maiúsculas sem hífen, por exemplo
TWENTYTWO
.Retorna uma lista de seqüências de caracteres ou um intervalo de números. (Ambos usam espaço como separador quando impresso com
put
.)fonte
Python3,
276271269243237235232217 bytesTomando uma sugestão do envio @smls perl ...
Eu suspeito que possa ser jogado um pouco mais longe.
Utiliza a biblioteca do sistema
unicodedata
para procurar nomes por números. Requer nomes de números em maiúsculas (separados por espaçoFORTY TWO
:) ou números inteiros decimais como entrada.(Este é o meu primeiro envio de código de golfe.)
(Eu também acabei de notar que estava calculando mal o comprimento (codificação), portanto, são alguns bytes menos do que se pensava anteriormente. No entanto, só atualizei a contagem de bytes mais recente. Ops.)
fonte
unicodedata
é uma biblioteca de sistema que vem com a instalação padrão, não uma biblioteca "extra" que precisa ser instalada separadamente.for
loop e tendo novas linhas entre cada saída.print()
não se importa se é um número inteiro ou uma string então. Experimente online!import*
vez deimport name
salvar um par de bytesLisp comum,
297253243242144128Detalhes
~[ 0 ~; 1 ~; ... ~:; else ~]
é uma opção, com base no próximo valor do argumento disponível, que salta para o formato de subcontrole apropriado. Aqui, eu só tenho um caso de "0" e para "else". Isto é usado para inserir um separador antes de cada número, exceto o primeiro, graças a U começando do zero.~:[ FALSE ~; TRUE ~]
é um formato condicional; aqui mostramos as coisas de maneira diferente, independentemente de a entrada s ser uma string ou não.~R
escreva um número como um número cardinal em inglês, enquanto~D
simplesmente imprime o número.Exemplos
fonte
f
para que "(f 2)" imprima "um, dois" e(f "two")
imprima "1, 2", isso lhe parece bom?JavaScript ES6,
559 526 381 368 364 358 332 327315 bytesAgradecemos a Kritixi Lithos pela idéia de dividir o array e a Arnauld pelo truque 1 / n.
fonte
var
e alterar a matriz['one,'two',..]
para"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
por1/n
. Isso forneceNaN
uma cadeia de caracteres (falsy), uma flutuação diferente de zero para um número inteiro diferente de zero (truthy) ouInfinity
para 0 (também truthy).Python 2 ,
503499494490479 bytes-5 com graças a @JonathanAllan
Experimente online!
Digite um número ou a ortografia separada por espaço de um número.
Versão menos golfe e mais legível:
fonte
l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
e
denineteen
.Esquema,
161,152, 149Descomprimido:
fonte
string->number
, verifiquei rapidamente e parece ser usado para converter, por exemplo, de string"4"
para número4
.(string->number "four")
retorna#f
.PHP -
397372349344329 bytesInspirado na solução JS de TomDevs
Economizou 25 bytes substituindo
$a=[...]
por$a=explode(...)
Salvou outros 23 bytes retornando a uma matriz sem delimitadores de string e armazenando
teen
em uma variável, graças a @ user59178Salvou outros 5 bytes removendo a
(int)
conversão de letraSalvou outros 15 bytes ao largar
$b
,$i
nasfor
declarações e entre chaves, graças a @ user59178 novamenteUngolfed:
Experimente para uma sequência de entrada ou para um número de entrada
fonte
teen
em uma variável em vez de repeti-la a cada vez. Como tal, ele se tornaria:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
;)
$b
e colocando a segunda matriz diretamente no foreach, mais 6 bytes soltando todos os chavetas (embora seja necessário colocar$a=$c
na configuração do loop for) e mais 6 bytes pós-incrementando$i
quando você o usa, e não no bit 'after' dos loops for.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 bytes
repl.it
As seqüências de entrada e saída são minúsculas e concatenadas *; portanto, para testar uma entrada de sequência, digite, por exemplo,
"thirtyfive"
no prompt.Constrói a lista de todas as palavras (mais
"fiftyone"
para"fiftynine"
) ex
, em seguida, testa seinput
é uma palavra com o proxyv>50
(as strings são maiores que os números no Python 2 e todos os números no intervalo de entrada válido da especificação são<=50
)print
es são os adequados valores dividindo a listax[:v]
ou criando um intervalo de números inteirosrange(1,x.index(v)+2)
,.* A adição de hifenização em ambos custa 11 bytes, substituindo
a+"ty"b
pora+"ty"+'-'*(b>'')+b
.fonte
Wolfram Language, 92 bytes
(Eu sou novo nisso, deixe-me saber se fiz algo errado)
fonte
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 bytes
Nota: a sequência atribuída a z é codificada com
atob
. Na string codificada, existem 11 bytes que não posso postar neste site, mesmo que sejam caracteres válidos em uma string javascript. Então, eu usei um escape hexadecimal no formato \ xHH. Cada uma dessas escapes é contada como 1 byte.A sequência original não compactada é a versão menos golfe .
Menos golfe
Teste
fonte
ö\x89ÞöÜ(öØ...
essas coisas são ótimas hahaaPython 3 ,
305303 bytesConvertido para Python 3 após o conselho de @ nedla2004. Agora também não há espaço entre os números escritos na entrada ou na saída, por exemplo, digite vinte e dois
Experimente online 3!
Python 2 ,
327320313308 bytesExperimente online 2!
163170177 bytes mais curtos que a minha resposta original, por isso estou postando-a como uma alternativa. Isso é usadofor
nas duas listas para criar uma lista completa de todas as representações de seqüência de caracteres dos números, em seguida, identifica a correta na lista e imprime tudo nela, por valor ou por índice. Gera uma nova linha para cada valor.fonte
Python 2,
432 422 416403 bytesTenho certeza de que isso pode ser melhorado. No mínimo, se eu conseguir codificar o valor a ser trabalhado e não precisar de uma função, posso salvar 20. Ele precisa de um espaço para separar as palavras na entrada de texto. Economizou 6 bytes graças ao comentário de JonathanAllan na resposta do ElPedro, 4 por reorganizar a matemática.
(NB: A versão atual disso usa guias para recuar em vez de espaços. QPaysTaxes adicionou um espaço único porque não estava sendo renderizado corretamente, para garantir que o código fornecido seja compilado. Não deve alterar a contagem de bytes.)
fonte
len(`f`)>2
pode ser...`f`[2:]
por mais 3 eu acredito. (ignore o...
não consigo obter os acentos graves funcionando corretamente)f>50
para 6. (e outra por não usard
)TypeError: 'int' object has no attribute '__getitem__'
. Se eu passar entrada numérica como uma string,f[2:]
se aproxima, mas ainda falha quando trado como um boolean (print f[2:] and True
imprime uma linha em branco se len (f) <2, nãoTrue
ouFalse
)f>50
funciona, obrigado. Soltard
não é tão simples, como eu sempre coloco o valor final do loop paraf
que a linha 8 não possa ser alterada paraif f>50
, pois nunca será verdade.C ++ 11,
484480477 bytesEntrada de texto em letras minúsculas sem hífens.
fonte
PowerShell , 362 bytes
Experimente online! entrada de palavras ou entrada de números
Esta é uma bagunça certa, e não estou muito feliz com isso, mas aqui está. Sugestões de golfe são bem-vindas.
A primeira linha define
$z
como uma matriz de todas as palavras em inglês. Você pode ver a-split0
para números1
para12
, eo loop para construir todas asteen
s, e então há um monte de lógica para juntar tudo certo.Experimente online!A segunda linha começa com alguma lógica. Pegamos a entrada
$args
(como uma string),-split
em espaço em branco, a armazenamos$n
para uso posterior, pegamos a primeira[0]
palavra e o primeiro[0]
caractere e verificamos se é-in
um intervalo48..57
(por exemplo, ASCII0
para9
). Então, estamos verificando se temos entrada decimal ou entrada em inglês.Experimente online!No primeiro caso, criamos um intervalo com base nas entradas decimais
$n[0]..$n[2]
e o usamos para indexar$z[...]
. No outro caso, encontramos a.indexOf()
primeira e a última palavra e construímos apenas um intervalo numérico a partir disso. Em qualquer uma das situações, agora temos uma matriz de objetos no pipeline (cadeias ou números inteiros), e um implícitoWrite-Output
na conclusão do programa nos fornece uma nova linha entre os elementos.fonte
Swift3, 402 bytes
Ungolfed:
Nada de especial aqui, basta usar uma matriz para fazer backup dos números gravados.
Eu originalmente pensei que esta solução usando esta outra maneira de calcular a
values
matriz:Que poderia ser jogado para:
substituindo a terceira linha no código do golfe
Eu poderia ter marcado 381 bytes, mas há um erro do compilador que diz: "a expressão era muito complexa para ser resolvida em tempo razoável", mais informações sobre o erro podem ser encontradas aqui
fonte
R,
452430424 bytesColoca os números em um data.frame com números gravados como nomes de colunas, facilitando bastante a tradução entre os dois (e a impressão subsequente).
A principal tentativa de jogar golfe foi criar os números gravados para 20-49, provavelmente muito mais para jogar aqui.
Fiz uma tentativa
as.matrix
de imprimir o data.frame apenas com os números, mas ainda estou com um cabeçalho de matriz. Espero que esteja tudo bem.Ungolfed:
fonte
o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
C,
342331 bytesExperimente online!
fonte
SAS, 179
A saída é gravada no log separado por novas linhas. O SAS possui um formato interno para converter dígitos em palavras, o que é uma grande vantagem para esse desafio, mas irritantemente não possui informações para fazer o inverso.
fonte