Défi CodeGolf
PWSSHHHH! Vous vous réveillez dans un laboratoire de cryogénie en l'an 3000. Après avoir été escorté au bureau des affectations pour recevoir votre puce de carrière, vraisemblablement celle d'un livreur, une sonde détecte que vous êtes à partir de l'an 2000. Pour cette raison, quelques les stéréotypes, vous supposiez stupide par rapport à aujourd'hui humain moderne et sont obligés de répéter les gradeschool.
Vous entrez dans votre classe de première année et l'enseignant donne un devoir. Elle dira ou écrira un nombre allant jusqu'à 50. Si elle écrit le nombre sur le tableau (par exemple: 25), vous devrez alors indiquer les nombres jusqu'à ce nombre "un, deux, trois, ..., vingt-cinq ". Si elle dit le numéro à haute voix (par exemple: "six"), vous devez écrire sur votre tablette les nombres jusqu'à ce que "1, 2, 3, 4, 5, 6"
Cela devient très fastidieux et vous décidez d’automatiser le processus avec vos connaissances en matière de programmation du 21ème siècle, qui fonctionnent encore mais restent archaïques.
Objectif:
Votre programme devrait prendre une entrée. Cette entrée sera soit un nombre décimal ( 1 thru 50
), soit un nombre écrit ( one thru fifty
).
• Si l'entrée est un nombre décimal, votre sortie doit compter de un à ce nombre, en utilisant le style écrit. (par exemple trente-deux )
• Si l'entrée est un nombre écrit, votre sortie doit compter de 1 à ce nombre, en utilisant un style décimal. (par exemple 32 )
Règles:
L'entrée et la sortie peuvent être dans n'importe quel cas de votre choix (vous pouvez donc créer un programme qui n'accepte que les majuscules si vous le souhaitez).
Les nombres décimaux en entrée ne doivent pas nécessairement être de type numérique (par exemple, int), ils peuvent être une chaîne en entrée contenant des nombres (25 vs "25"). Soit ça va et vous pouvez choisir lequel vous voulez que votre programme accepte. (Votre programme n'a pas besoin d'accepter les deux)
Le style écrit n'exige PAS un trait d'union entre les mots composés, mais vous pouvez le faire si vous le souhaitez.
Les valeurs de sortie doivent être séparées sous une forme quelconque, tout séparateur convient 1,2,3
1 2 3
etc
Vous ne pouvez pas ajouter de bibliothèques supplémentaires telles que num2words (python), etc. (les bibliothèques système conviennent toutefois)
Même si l'histoire raconte que vous êtes de l'an 2000, vous pouvez utiliser des langues créées après cette date (lol).
C'est du code-golf , alors le programme avec le plus petit décompte gagne!
Réponses:
Perl 6 ,
119113 octetsBase de données Unicode FTW!
Utilise les chiffres en majuscules sans chiffres, par exemple
TWENTYTWO
.Renvoie une liste de chaînes ou une plage de nombres. (Les deux utilisent l’espace comme séparateur lorsqu’ils sont imprimés avec
put
.)la source
Python3,
276271269243237235232217 octetsPrendre exemple sur la soumission de @smls perl ...
Je pense que cela pourrait être joué un peu plus loin.
Il utilise la bibliothèque système
unicodedata
pour rechercher des noms de nombres. Il nécessite des noms de nombres en majuscules (séparés par un espaceFORTY TWO
:) ou des nombres entiers décimaux en entrée.(Ceci est ma première soumission de code de golf.)
(Je viens aussi de remarquer que je calculais mal la longueur (encodage), donc c'est quelques octets de moins que prévu. J'ai cependant mis à jour le nombre d'octets le plus récent. Oups.)
la source
unicodedata
est une bibliothèque système fournie avec l'installation par défaut, pas une bibliothèque "supplémentaire" qui doit être installée séparément.for
boucle et en laissant des nouvelles lignes entre chaque sortie.print()
ne se soucie pas si c'est un entier ou une chaîne alors. Essayez-le en ligne!import*
au lieu deimport name
sauver quelques octetsCommon Lisp,
297253243242144128Détails
~[ 0 ~; 1 ~; ... ~:; else ~]
est un commutateur, basé sur la valeur du prochain argument disponible, qui passe au format de sous-contrôle approprié. Ici, je n'ai qu'un cas de "0" et pour "sinon". Ceci est utilisé pour insérer un séparateur avant chaque numéro sauf le premier, grâce à U à partir de zéro.~:[ FALSE ~; TRUE ~]
est un format conditionnel; Ici, nous produisons les choses différemment, que l’entrée s soit une chaîne ou non.~R
écrivez un nombre en tant que nombre anglais cardinal, alors~D
que le chiffre est simplement imprimé.Exemples
la source
f
comme "(f 2)" imprime "un, deux" et(f "two")
imprime "1, 2", est-ce que ça vous va?JavaScript ES6,
559 526 381 368 364 358 332 327315 octetsMerci à Kritixi Lithos pour l’idée de scinder le tableau et à Arnauld pour le tour 1 / n.
la source
var
et vous pouvez changer le tableau['one,'two',..]
en"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
par1/n
. Cela vous donneNaN
pour une chaîne (falsy), un float non nul pour un entier non nul (vérité) ouInfinity
pour 0 (également vérité).Python 2 ,
503499494490479 octets-5 grâce à @JonathanAllan
Essayez-le en ligne!
Entrez un nombre ou une espace séparée par l’orthographe d’un nombre.
Version légèrement moins jouée et plus lisible:
la source
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
.Schéma,
161,152, 149Non compressé:
la source
string->number
faire, j'ai vérifié rapidement et il semble être utilisé pour convertir par exemple de chaîne"4"
en nombre4
.(string->number "four")
retourne#f
.PHP -
397372349344329 octetsInspiré par la solution JS de TomDevs
Sauvegardé 25 octets en remplaçant
$a=[...]
par$a=explode(...)
Vous avez sauvegardé 23 autres octets en revenant dans un tableau sans séparateurs de chaînes et en les stockant
teen
dans une variable, grâce à @ user59178.Enregistré 5 autres octets en supprimant la
(int)
conversion de typageSauvegardé 15 octets supplémentaires en supprimant
$b
,$i
dans lesfor
déclarations et les accolades, grâce à @ user59178 à nouveauUngolfed:
Essayez-le pour une chaîne d'entrée ou pour un numéro d'entrée
la source
teen
une variable plutôt que de la répéter à chaque fois. En tant que tel, il deviendrait:$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
et en plaçant le second tableau directement dans le foreach, 6 octets supplémentaires en supprimant toutes les accolades (bien que vous deviez mettre le$a=$c
dans la configuration de la boucle for) et 6 octets supplémentaires en post-incrémentation.$i
lorsque vous l'utilisez plutôt que dans le bit "après" de la boucle for.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 octets
repl.it
Les chaînes d'entrée et de sortie sont en minuscules et concaténées *, aussi, pour tester une chaîne, saisissez, par exemple,
"thirtyfive"
à l'invite.Construit la liste de tous les mots (plus
"fiftyone"
à"fiftynine"
),x
puis teste siinput
est un mot avec le proxyv>50
(les chaînes sont plus grandes que les nombres dans Python 2, et tous les nombres de la plage d’entrée valide de la spécification sont<=50
) etprint
s les valeurs en découpant soit la liste,x[:v]
ou la construction d' une série de nombres entiers,range(1,x.index(v)+2)
.* Ajouter une césure sur les deux coûts coûte 11 octets, en le remplaçant
a+"ty"b
para+"ty"+'-'*(b>'')+b
.la source
Wolfram Language, 92 octets
(Je suis nouveau à cela, laissez-moi savoir si j'ai fait quelque chose de mal)
la source
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 octets
Remarque: la chaîne affectée à z est codée avec
atob
. Dans la chaîne codée, il y a 11 octets que je ne peux pas publier sur ce site, même s'il s'agit de caractères valides dans une chaîne javascript. J'ai donc utilisé un hex d'échappement sous la forme \ xHH. Chacune de ces échappées compte pour 1 octet.La chaîne originale non compressée est la version moins golfée .
Moins joué au golf
Tester
la source
ö\x89ÞöÜ(öØ...
hahaa, c'est génialPython 3 ,
305303 octetsConverti en Python 3 après avis de @ nedla2004. Maintenant, n’a plus d’espace entre les nombres écrits en entrée ou en sortie, par exemple, entrez vingt
Essayez-le en ligne 3!
Python 2 ,
327320313308 octetsEssayez-le en ligne 2!
163170177 octets plus court que ma réponse originale, je l’affiche donc comme alternative. Ceci utilisefor
sur les deux listes pour construire une liste complète de toutes les représentations sous forme de chaîne des nombres, puis identifie celle de droite dans la liste et affiche tout ce qui s’y passe, par valeur ou par index. Affiche une nouvelle ligne pour chaque valeur.la source
Python 2,
432 422 416403 octetsJe suis sûr que cela peut être amélioré. À tout le moins, si je peux me permettre de coder en dur la valeur sur laquelle travailler et de ne pas avoir besoin d'une fonction, je peux économiser 20. Il faut un espace pour séparer les mots dans la saisie de texte. Sauvegardé de 6 octets grâce au commentaire de JonathanAllan sur la réponse d'ElPedro, 4 pour avoir réarrangé les maths.
(NB: la version actuelle de this utilise des tabulations pour mettre en retrait au lieu d'espaces. QPaysTaxes a ajouté un seul espace, car le rendu n'était pas correct, pour assurer la compilation du code donné. Cela ne devrait pas changer le nombre d'octets.)
la source
len(`f`)>2
peut être...`f`[2:]
pour un autre 3 je crois. (...
Ignorez l'impossibilité de vous assurer que les backticks fonctionnent correctement)f>50
6 (et un autre en ne l'utilisant pasd
)TypeError: 'int' object has no attribute '__getitem__'
. Si je passe l'entrée numérique sous forme de chaîne,f[2:]
se rapproche mais échoue quand il est traité comme un booléen (print f[2:] and True
affiche une ligne vierge si len (f) <2, pasTrue
ouFalse
)f>50
fonctionne, merci. Le largaged
n’est pas aussi simple que je mets toujours la valeur finale de la boucle dans laf
ligne 8 pour ne pas pouvoir être modifiéeif f>50
car elle ne sera jamais vraie.C ++ 11,
484480477 octetsSaisie de texte en minuscule sans trait d'union.
la source
PowerShell , 362 octets
Essayez-le en ligne! mots saisis ou chiffres saisis
C'est un vrai gâchis et je n'en suis pas très content, mais le voici. Les suggestions de golf sont les bienvenues.
La première ligne
$z
est un tableau des mots anglais complets. Vous pouvez voir les-split0
nombres1
pour12
, et la boucle pour construire tous lesteen
s, puis il y a beaucoup de logique pour tout assembler correctement. Essayez-le en ligne!La deuxième ligne commence par une certaine logique. Nous prenons l'entrée
$args
(sous forme de chaîne),-split
celle - ci sur des espaces, nous l'enregistrons$n
pour une utilisation ultérieure, prenons le premier[0]
mot et le premier[0]
caractère de celui-ci et vérifions s'il s'agit d'-in
une plage48..57
(c'est-à-dire, de l'ASCII0
à9
). Donc, nous vérifions si nous avons une entrée décimale ou une entrée en anglais. Essayez-le en ligne!Dans le premier cas, nous construisons une plage basée sur les entrées décimales
$n[0]..$n[2]
et l'utilisons pour l'indexation$z[...]
. Dans l'autre cas, nous trouvons le.indexOf()
premier mot et le dernier mot et construisons une plage numérique à partir de cela. Dans les deux cas, nous avons maintenant un tableau d'objets sur le pipeline (soit des chaînes, soit des entiers), et un impliciteWrite-Output
à l'achèvement du programme nous donne un nouveau trait entre les éléments.la source
Swift3, 402 octets
Ungolfed:
Rien de spécial ici, juste en utilisant un tableau pour sauvegarder les nombres écrits.
J'ai initialement pensé à cette solution en utilisant cette autre façon de calculer le
values
tableau:Ce qui pourrait être joué au golf pour:
remplacement de la 3ème ligne du code golfé
J'aurais pu marquer 381 octets, mais il y a une erreur de compilation qui dit: "l'expression était trop complexe pour être résolue dans un délai raisonnable", plus d'informations sur l'erreur peuvent être trouvées ici
la source
R,
452430424 octetsPlace les numéros dans un data.frame avec des numéros écrits en tant que noms de colonnes, ce qui facilite la conversion entre les deux (et l'impression ultérieure).
La principale tentative de golf consistait à créer les numéros écrits pour les 20-49 ans, probablement beaucoup plus que pour jouer au golf ici.
J'ai essayé
as.matrix
d'imprimer le data.frame avec seulement les nombres, mais il me reste un en-tête de matrice. J'espère que ça va.Ungolfed:
la source
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 octetsEssayez-le en ligne!
la source
SAS, 179
La sortie est écrite dans le journal, séparée par des nouvelles lignes. SAS a un format intégré pour convertir les chiffres en mots, ce qui est un avantage majeur pour ce défi, mais il est ennuyeux de ne pas disposer d’informations permettant de faire l’inverse.
la source