Este desafio é baseado neste vídeo . Eu recomendo que você assista antes de tentar este desafio.
Primeiro, definimos uma função. Esta função ( OEIS ) recebe um número inteiro n como entrada e gera o número de letras na representação em inglês de n (sem espaços ou hífens). Por exemplo, "três" tem 5 letras, portanto, 3 mapeia para 5.
Conforme demonstrado no vídeo, iniciando com qualquer número que se repita, esse processo resultará em quatro, que serão mapeados para si mesmos para sempre.
Aqui está um gráfico direcionado bruto mostrando as órbitas dos números menores que 16:
12 11
\|
15 2 6 1 10 14 13
\ \|/ / / /
7 3-/ 8--/
\| /
9 0 5--/
\ \|
\-4
Seu desafio é determinar o número de etapas que um número executará (ou o número de vezes que essa função deve ser aplicada a um número) antes de atingir quatro (ou seja, o nível no gráfico direcionado na foto).
Formando números em inglês
Aqui está uma breve explicação de como se deve formar palavras em inglês para este desafio:
Os números de um a dezenove são:
um, dois, três, quatro, cinco, seis, sete, oito, nove, dez, onze, doze, treze, quatorze, quinze, dezesseis, dezessete, dezoito, dezenove
Para números maiores que dezenove, o processo é o seguinte:
Se o número tiver centenas, comece com o nome do dígito na casa das centenas e "cem".
por exemplo
100 -> "onehundred"
Se o restante for menor que vinte, acrescente a representação em inglês do restante.
por exemplo
714 -> "sevenhundredfourteen"
Caso contrário, se o dígito das dezenas não for zero, acrescente a representação adequada:
2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety
por exemplo
470 -> "fourhundredseventy"
Finalmente, se houver um dígito, acrescente sua representação
por exemplo
681 -> "sixhundredeightyone"
Outras estipulações
Para números maiores que cem, você deve deixar de lado o "e" ao contar o número de letras. Por exemplo, 577 é "quinhentos e sete até sete", que tem 23 letras.
Seu programa deve aceitar todos os números inteiros maiores que 0 e menores que 1.000 como entrada por métodos padrão.
Seu programa deve gerar o número de etapas necessárias para os métodos de saída padrão.
Este é um codegolf, e a solução com o menor número de bytes vence.
Casos de teste
1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4
fonte
Respostas:
JavaScript (ES6), 106 bytes
As strings parecem ser a melhor maneira de codificar o comprimento, apesar da sobrecarga de conversão numérica.
fonte
Python, com num2words,
97 113 115 94 9392 bytes+16 bytes (esqueceu o hifenação que num2words aplica-se que na verdade não alterar os resultados de qualquer um dos casos de teste, embora
23
e577
cada um tem um hífen)+2 bytes (esqueceu de incluir
f=
embora recursiva)-20 bytes (uso
re
)-8 bytes graças ao @Wheat Wizard (use
~
, substituan!=4
porn-4
e ... importação de uma linha> _ <)-1 byte graças a @Cyoce (espaço de
4 and
)Apenas conta o número de etapas; também funciona para números inteiros grandes e negativos (
\W
encontra os espaços, vírgulas e hífens no resultado num2words):Aqui está o último caso, passo a passo:
fonte
f=
antes de sua função lambdaimport re,num2words as r
vez das duas declarações diferentes.n-4
é a mesma coisa quen!=4
num2words
éw
,re
ainda ére
- nota que tanto o módulo e função são chamadosnum2words
and 1+
pode ser substituído porand-~
salvar um bytePitão - 54 bytes
Tentará refatorar.
Conjunto de Teste .
fonte
Mathematica, 89 bytes
Mathematica típico: funções internas boas, nomes longos de funções ruins.
FixedPointList
aplica seu primeiro argumento (uma função) ao segundo argumento repetidamente até a resposta não mudar, listando todos os resultados; os resultados incluem a entrada original e duas cópias da saída repetida, daí a-2
no final. O built-in do MathematicaIntegerName
contém espaços e hífens, por isso precisamos nos livrar deles manualmente.Irritantemente,
IntegerName
a saída de contém o caractere "-" (Unicode # 8208) em vez de hífens normais; é por isso que esse envio é de 89 bytes em vez de 88. (E eu não poderia preceder o código acima com quatro espaços e aceitar o caractere Unicode - alguma ajuda? -, o código acima não funcionará exatamente se for recortado e colado .)fonte
Python 2.7,
344216208 bytes:Não usa bibliotecas externas, ao contrário de outras respostas do Python. Leva a entrada
stdin
e a saída parastdout
.Repl.it com todos os casos de teste!
Explicação
Primeiro, cria 3 dicionários, cada um emparelhando o comprimento das representações da palavra em inglês de cada número com o número que representa no intervalo fechado,
[1,9]
no local unidades, dezenas e centenas, respectivamente. Por exemplo, a primeira entrada no dicionáriod
é1:3
como1
está escritaone
em inglês e tem3
letras.Em seguida, cada local de dígitos em alguma entrada de sequência
x
é atribuído ao seu dicionário correspondente, após o qual cada número em cada local é correspondido com seu valor no dicionário correspondente. Por exemplo, suponha que o número de entrada seja23
. O local20
na casa das dezenas seria emparelhado com o dicionárioe
, no qual ele é correspondido6
, e o3
local na casa seria emparelhado com o dicionáriod
, no qual ele é correspondido5
. Esses dígitos correspondentes são então adicionados juntos para representar o comprimento da representação em inglês do número, que é atribuídox
como uma string e,x!='4'
enquanto o loop while continuar, incrementandoc
em1
cada vez para representar o número de etapas realizadas até agora. Portanto,23
corresponderia a11
, o que por sua vez corresponderia a6
qual se voltaria para3
e depois para5
e finalmente para4
, resultando em5
etapas totais.Finalmente, uma vez que o loop termina, a
c
saída éstdout
para representar a "Distância para quatro", que nesse caso seria5
.fonte
Java,
556295 bytesObrigado a @KevinCruijssen por salvar 261 bytes
Ungolfed:
fonte
s++
não é possível em uma corda-array ..: Ss
.. Btw, você pode golfe o seu código por uma quantidade bastante grande assim:int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}