Ce défi est basé sur cette vidéo . Je vous recommande de le regarder avant d'essayer ce défi.
Nous définissons d'abord une fonction. Cette fonction ( OEIS ) prend un entier n en entrée et génère le nombre de lettres dans la représentation anglaise de n (sans espaces ni tirets). Par exemple, "trois" a 5 lettres, donc 3 correspond à 5.
Comme démontré dans la vidéo en commençant par un nombre répétitif, ce processus aboutira finalement à un quatre, qui se mappera pour lui-même pour toujours.
Voici un graphique orienté brut montrant les orbites des nombres inférieurs à 16:
12 11
\|
15 2 6 1 10 14 13
\ \|/ / / /
7 3-/ 8--/
\| /
9 0 5--/
\ \|
\-4
Votre défi est de déterminer le nombre d'étapes qu'un nombre prendra (ou le nombre de fois que cette fonction doit être appliquée à un nombre) avant d'atteindre quatre (c'est-à-dire le niveau sur le graphique dirigé illustré).
Former des nombres anglais
Voici une brève explication sur la façon de former des mots anglais pour ce défi:
Les nombres de un à dix-neuf sont:
un, deux, trois, quatre, cinq, six, sept, huit, neuf, dix, onze, douze, treize, quatorze, quinze, seize, dix-sept, dix-huit, dix-neuf
Pour les nombres supérieurs à dix-neuf, le processus est le suivant:
Si le nombre contient des centaines, commencez par le nom du chiffre à la place des centaines et «cent».
par exemple
100 -> "onehundred"
Si le reste est inférieur à vingt, ajoutez la représentation anglaise du reste.
par exemple
714 -> "sevenhundredfourteen"
Sinon, si le chiffre des dizaines n'est pas nul, ajoutez la représentation appropriée:
2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety
par exemple
470 -> "fourhundredseventy"
Enfin, s'il y a un chiffre, ajoutez sa représentation
par exemple
681 -> "sixhundredeightyone"
Autres stipulations
Pour les nombres supérieurs à cent, vous devez omettre le "et" lors du comptage du nombre de lettres. Par exemple, 577 est "fivehundredseventyseven" qui contient 23 lettres.
Votre programme doit accepter tous les entiers supérieurs à 0 et inférieurs à 1 000 en entrée via des méthodes standard.
Votre programme doit générer le nombre d'étapes requises pour les méthodes de sortie standard.
Il s'agit de codegolf, donc la solution avec le moins d'octets est gagnante.
Cas de test
1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4
la source
Réponses:
JavaScript (ES6), 106 octets
Les chaînes semblent être le meilleur moyen d'encoder la longueur, malgré la surcharge de conversion numérique.
la source
Python, avec num2words, 97113115
94 9392 octets+16 octets (oublié la césure que num2words applique qui ne change pas les résultats de l' un des cas de test, même si
23
et577
ont chacun un trait d' union)+2 octets (oublié d'inclure
f=
bien récursive)-20 octets (utilisation
re
)-8 octets grâce à @Wheat Wizard (utiliser
~
, remplacern!=4
parn-4
et ... importation d'une ligne> _ <)-1 octet grâce à @Cyoce (espace depuis
4 and
)Compte juste le nombre d'étapes; fonctionne aussi pour les entiers énormes et négatifs (
\W
trouve les espaces, les virgules et les tirets dans le résultat num2words):Voici ce dernier cas, étape par étape:
la source
f=
import re,num2words as r
au lieu des deux instructions différentes.n-4
est la même chose quen!=4
num2words
estw
,re
est toujoursre
- notez que le module et la fonction sont appelésnum2words
and 1+
peut être remplacé parand-~
pour économiser un octetPyth - 54 octets
Va essayer de refactoriser.
Suite de tests .
la source
Mathematica, 89 octets
Mathematica typique: les fonctions intégrées sont bonnes, les noms de fonctions longs sont mauvais.
FixedPointList
applique son premier argument (une fonction) au deuxième argument à plusieurs reprises jusqu'à ce que la réponse ne change pas, répertoriant tous les résultats; les résultats incluent l'entrée d'origine et deux copies de la sortie répétée, d'où la-2
la fin. Intégré de MathematicaIntegerName
contient des espaces et des tirets, nous devons donc nous en débarrasser à la main.De façon ennuyeuse,
IntegerName
la sortie de contient le caractère "-" (Unicode # 8208) plutôt que des tirets normaux; c'est pourquoi cette soumission est de 89 octets au lieu de 88. (Et je ne pouvais pas faire précéder le code ci-dessus avec quatre espaces et lui faire accepter le caractère Unicode - toute aide? - donc le code ci-dessus ne fonctionnera pas exactement s'il est coupé et collé .)la source
Python 2.7,
344216208 octets:N'utilise pas de bibliothèques externes contrairement aux autres réponses Python. Prend l'entrée
stdin
et les sorties dansstdout
.Repl.it avec tous les cas de test!
Explication
Crée d'abord 3 dictionnaires, chacun associant la longueur des représentations de mots anglais de chaque nombre au nombre qu'il représente dans l'intervalle fermé
[1,9]
, respectivement à la place des dizaines et des centaines. Par exemple, la première entrée du dictionnaired
est1:3
telle qu'elle1
est orthographiéeone
en anglais et comporte des3
lettres.Ensuite, chaque place de chiffres dans une certaine chaîne
x
est attribuée à son dictionnaire correspondant, après quoi chaque numéro de chaque place correspond à sa valeur dans le dictionnaire correspondant. Par exemple, supposons que le numéro d'entrée était23
. L'20
endroit dans les dizaines serait apparié avec le dictionnairee
, dans lequel il est apparié6
, et l'3
endroit dans les un serait apparié avec le dictionnaired
, dans lequel il est apparié5
. Ces chiffres appariés sont ensuite additionnés pour représenter la longueur de la représentation anglaise du numéro, qui est attribué àx
une chaîne et, àx!='4'
la boucle while continue, incrémentéec
de1
chaque fois pour représenter le nombre de mesures prises jusqu'à présent. Par conséquent,23
correspondrait à nombre total d'étapes.11
, qui à son tour correspondrait à6
ce qui se tournerait vers3
, puis vers5
et enfin vers4
, résultant en5
Enfin, une fois la boucle terminée,
c
est émis pourstdout
représenter la "Distance à quatre", ce qui serait le cas dans ce cas5
.la source
Java,
556295 octetsMerci à @KevinCruijssen pour avoir économisé 261 octets
Non golfé:
la source
s++
n'est pas possible sur un String-array ..: Ss
.. BTW, vous pouvez jouer au golf votre code par une grande quantité tout à fait comme ceci: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;}