Sumário
Um professor foi instruído a preparar problemas de palavras para os alunos. Ela recebe uma lista de equações e é instruída a escrevê-las como o problema da palavra correspondente. No entanto, ela é muito preguiçosa, por isso não coloca muita criatividade nisso. Em vez disso, ela simplesmente escreve literalmente. Por exemplo, quando ela lê 1+1
, ela escreve one plus one
, 47 * 2
se tornaria forty seven times two
e 56.2 / 7.4
se tornaria fifty six point two divided by seven point four
.
Escreva um código para ajudar esse professor preguiçoso.
Detalhes
- Os números podem incluir um ponto decimal e um sinal negativo.
- Os números devem ser escritos em pequena escala. (ou seja,
1,000,000,000
éone billion
) - Os números podem chegar a 999.999.999.999.999.999 (
nine hundred ninety nine quadrillion...nine hundred ninety nine
). - Grupos de zeros devem ser deixados de fora. por exemplo, não
1,000,000
é .one million
one million zero thousand zero hundred
- Arbitrariamente, pode haver muitos dígitos além do ponto decimal.
- Os dígitos após o ponto decimal devem ser listados dígito por dígito. por exemplo, não
12.34
étwelve point three four
twelve point thirty four
. - Dois números são sempre separados por um operador.
- Os operadores válidos são mais (
+
), menos (-
), vezes (*
) e divididos por (/
). - Não há parênteses.
- Números como
1234
opcionalmente podem incluir umand
em sua saída, como emone thousand two hundred *and* thirty four
. - Vírgulas e espaços em branco na entrada podem ser ignorados.
Exemplos
Entrada: 24 + 65
Saída:twenty four plus sixty five
Entrada: 3.33333 - 0
Saída:three point three three three three three minus zero
Entrada: 3.6 * 18.18 / 999.0
Saída:three point six times eighteen point one eight divided by nine hundred ninety nine point zero
Entrada: 1-1
Saída:one minus one
Entrada: 1+-1
Saída:one plus negative one
Entrada: 1,000,000,000 + 0.2
Saída:one billion plus zero point two
Entrada: 123,000,456,789,012,345.6789
Saída:one hundred twenty three quadrillion four hundred fifty six billion seven hundred eighty nine million twelve thousand three hundred forty five point six seven eight nine
Entrada: -4.3 * 7
Saída:negative four point three times seven
Entrada: -1-1--1
Saída:negative one minus one minus negative one
123,456,789,012,345.6789
aos exemplos? Deve cobrir muitos casos de teste.minus
vez denegative
?/
éover
e número negativo éminus
, portanto, ele precisa de alguma manipulação.Respostas:
JavaScript (ES6),
552532 bytesEste monstro imundo vem direto das profundezas do inferno do código de golfe.
Espera uma sequência de entrada sem nenhum espaço em branco.
Experimente online!
fonte
btoa`ÍêèÒ‰ÞÒÜ(ÒØkyí¢êô~+ÞÒȱÒǯz}ŠmÒx§{K^ŸG¥z÷§ÒÜ–÷´¶«ÓGâM4z(!ÓKpz}-†*ô~Šô~'ôÓG¢‚4¶.±©ÝÒmÒÚôªæ�¯IÞ�«b½í)–ë4š)î³Kb™ë4v+âuçu×Vò`.replace(111,' ')
.Perl 6 ,
434 401 387359 bytesExperimente online!
Definitivamente espaço para melhorias aqui. Eu digo isso, mas continuo percebendo casos extremos que não lidei
:(
. Supõe que a entrada tenha operadores separados por espaços em branco e o negativo de um número não seja separado.Explicação:
fonte
Ruby + Swift 4,
283279270 bytesExperimente online!
Devo estar louco de propor uma solução desse tipo Frankenstein, mas, por um lado, é muito tentador usar a funcionalidade interna do Swift para esta tarefa e, por outro lado, processar seqüências de caracteres com Regexes no Swift parece ser uma catástrofe no golfe.
Portanto, decidi fazer o processamento básico de strings no Ruby, mas para soletrar números, eu os armazeno em um arquivo de origem Swift, execute o Swift em um comando shell e colete a saída.
Acontece que o formatador de números "spellOut" do Swift faz quase exatamente o que precisamos, exceto inserindo hífens desnecessários para números de dois dígitos, como em
twenty-two
. De fato, mesmo a saída de ponto flutuante no formato deinteger part point digit digit...
é boa, mas aqui vem a ressalva - não há precisão infinita e, com números grandes o suficiente ou muitos dígitos decimais, os resultados dão errado. Portanto, tive que separar as partes inteiras e fracionárias e alimentar a fração dígito por dígito.fonte
sfk , 853 bytes
Experimente online!
Requer que operadores e números sejam separados por pelo menos um caractere de espaço.
fonte
Limpo ,
766... 687 bytesExperimente online!
Espera uma string sem espaço em branco.
fonte
05AB1E ,
315295282276 bytesRecebe entrada sem espaços.
Experimente online ou verifique todos os casos de teste .
Explicação:
Veja este 05AB1E ponta do meu (seções ? Como usar o dicionário , ? Como cordas comprimir não parte do dicionário , e ? Como comprimir grandes inteiros ) para entender o porquê:
'¢…
é"negative"
;'¡×
é"zero"
;“†ìˆÈŒšï¿Ÿ¯¥Š“
é"four five six seven eight nine"
;'…§
é"teen"
;…€µ‚•„í
é"one two three"
;…—¿áÓÁÏ
é"ten eleven twelve"
;'°¡
é"hundred"
;'¾ß
é"ion"
;…¡›‡È±°
é"billion million thousand"
;'…®
é"point"
; e“‰´Øè„ƺߓ
é"plus minus times divided"
..•6b©•
is"thir"
;.•4º»Ÿć'Rþн•
é"twenthirforfif"
; e.•cG3₅¦„¥F•
é"quadrilltrill"
.ŽH$
é4433
.fonte
Python 2 ,
790774 bytesExperimente online!
Tantas más práticas. Isso quase doeu escrever ....
Espera uma string não unicode sem espaço em branco como entrada.
Explicação:
Reduzi em cerca de 150 bytes enquanto escrevia a explicação. Nunca se diga que comentar / revisar seu código não é útil!
fonte