Ce défi est similaire à cet autre , mais j'ai fait une restriction (voir le texte en gras ci-dessous) qui, je pense, le rendrait très différent et (j'espère) amusant aussi.
Le défi
Écrivez un programme ou une fonction dans n'importe quel langage de programmation qui prend en entrée le nom anglais d'un entier positif n
ne dépassant pas 100
et retourne n
comme un entier.
Les failles standard sont interdites et vous ne pouvez pas utiliser de fonction intégrée, d'outil externe ou de bibliothèque qui fait déjà ce travail .
Le code source le plus court en octets gagne.
Tester
Voici tous les input->output
cas:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Réponses:
C, 160 octets
Essaye-le
Comment ça fonctionne
Après quelques tentatives, j'ai trouvé une fonction qui les numéros "exceptionnels"
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, aux caractères ASCII imprimablesk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
Respectivement.Cette fonction est:
Le programme golfé calcule la
hash
fonction de l'entrée jusqu'à ce qu'il atteigne la fin de la chaîne ou du caractère-
. Il recherche ensuite le hachage dans la chaînek.[<* cKwye(S_-C)7=4&o]sYgmN
et détermine le nombre correspondant. Si la fin de la chaîne d'entrée a été atteinte, le nombre est renvoyé, si à la place un a-
été atteint, alors il est renvoyé le nombre plus le résultat du programme joué appliqué au reste de la chaîne d'entrée.la source
JavaScript (ES6),
175166163156153147 octets7 octets enregistrés grâce à @Neil
Vérifiez-le ici:
Afficher l'extrait de code
Comment ça fonctionne
L'idée de base est de diviser chaque nombre en ses mots numériques, puis de mapper chaque mot au chiffre correspondant. Presque tous les mots sont configurés pour correspondre correctement à une simple expression régulière, mais il y a quelques anomalies:
eleven
throughnineteen
: si le mot contient unel
, ou unte
au milieu (pour éviterten
), nous ajoutons unon-
au début, en les changeant enon-eleven
throughon-nineteen
.twenty
,thirty
, Etc .: le remplacement d' une fuitey
avec les-d
changements à ceux - citwent-d
,thirt-d
etc.Nous séparons maintenant les traits d'union, les espaces et les
dr
s. Cela divise tout de 11 à 99 en ses mots numériques correspondants, et"one hundred"
en[one,hun,ed]
. Ensuite, nous mappons chacun de ces mots à travers un tableau d'expressions régulières, et gardons l'index de celui qui correspond en premier.À ce jour, chaque entrée sera le tableau des bons chiffres. Tout ce que nous avons à faire est de les rejoindre
join``
, de les convertir en nombre avec unaire+
, et nous avons terminé.la source
.findIndex(y=>x.match(y))
marche pas ?replace
.sh + coreutils, 112 octets
Peut être exécuté sur tous les cas de test à la fois, un par ligne.
Explication
Le backticked
awk
évalue lesed
scriptqui transforme des parties de nombres en leur représentation numérique.
Les lignes supplémentaires du script sed
prendre soin de
-ty
s etone hundred
.Enfin, supprimez les
+
s en tête et tout ce qui ne l'est pas+
,*
ou un chiffre.Seules les expressions mathématiques restent
et peut être canalisé
bc
.la source
Pyth,
79767568 octetsMerci @ETHproductions pour 7 octets.
Fondamentalement, vérifie d'abord le cas de coin de 100, puis utilise un tableau des deux premières lettres des chiffres 0 à 11 pour déterminer la sémantique de l'entrée et modifier la valeur en fonction du suffixe ("-ty" et "-teen"; " lv "dans 12 est un autre cas d'angle). Divise d'abord l'entrée en une liste de mots, puis mappez chacun à une valeur et résumez-les.
En pseudocode pythonique:
Suite de tests
Python 3, 218 octets
Fondamentalement identique à la réponse Pyth.
Hors sujet:
Je viens de découvrir une version significative de la réponse à la vie, à l'univers et à tout: ce sont des brindilles assoiffées de thé. Wow, des brindilles qui aspirent au thé! Je ne sais pas combien d'autres réponses font cela, mais pour ma réponse si l'entrée est "brindilles assoiffées de thé", la sortie est 42.
la source
"ontwthfofisiseeiniteel"
ce programme.Python 3,
365361310303 caractèresGolfé
Non golfé
la source
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
Mais comme je le vois, devrait fonctionner sans l'assigner à la variable n, il suffit d'appeler.index()
directement dessus."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell,
252231 octetsCela crée une liste de tous les noms de nombres anglais de "un" à "quatre-vingt-dix-neuf", puis regarde l'index de l'entrée vers le haut. S'il n'existe pas, nous sommes dans le cas de bord "cent", donc il revient
100
, sinon ça va retourner l'index.Non golfé
la source
Python 2, 275 caractères
Il construit simplement une liste de chaque nombre et trouve l'index.
la source
Japt, 82 octets
Chacun
¿
représente un caractère non imprimable.Testez-le en ligne!Basé sur ma réponse JS. Soustrayez un octet si la sortie n'a pas besoin d'être un entier, car elle apparaît exactement comme une chaîne.
Comment ça fonctionne
la source
JavaScript,
214199 octetsComme toujours: il s'avère que c'est trop long pour concourir, mais maintenant que j'ai fini, ce serait un gaspillage de ne pas poster ça.
Peut-être y a-t-il un moyen évident de jouer au golf plus loin que j'ai négligé?
JSFiddle pour les cas de test
la source
f
pourf=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? De plus, un seul argument de chaîne peut être passé à une fonction comme ceci:s.indexOf`lv`
Perl, 158 octets
S'exécute à partir de la ligne de commande.
one hundred
doit être entré de façon"one hundred"
à ne pas être interprété comme deux entrées.la source