Convertissez une chaîne contenant des chiffres sous forme de mots en un entier, en ignorant les zéros de tête.
Exemples
"four two"
->42
."zero zero zero one"
->1
.
Hypothèses
Les soumissions peuvent supposer que:
- La chaîne d'entrée est composée de mots numériques séparés par des espaces.
- Tous les mots sont valides (dans la plage "zéro" .. "neuf") et en minuscules. Le comportement pour une entrée vide n'est pas défini.
- La chaîne d'entrée représente toujours un nombre non signé dans la plage de
int
et n'est jamais une chaîne vide.
Notation
Les réponses seront notées en octets avec moins d'octets étant mieux.
code-golf
string
number
conversion
Cierge magique
la source
la source
range "zero".."nine"
n'est pas entièrement spécifié.Interpreter@"SemanticNumber"
fait exactement cela dans Mathematica, sauf qu'elle échoue sur les chaînes commençant parzero zero
.Réponses:
PHP , 74 octets
Essayez-le en ligne!
J'ai essayé d'obtenir une solution qui ne copie pas les réponses existantes. J'obtiens un polynôme de somme de contrôle de redondance cyclique de longueurs 32 bits ( crc32 ) pour chaque mot, puis je fais un mod 20 et un mod 11 dessus pour obtenir des valeurs uniques mélangées de 0 à 10 (6 manquantes) pour chaque chiffre. Ensuite, en utilisant cette valeur unique, je trouve le chiffre réel.
Une autre alternative CRC32 de 74 octets utilisant
%493%10
: Essayez-le en ligne!Une autre alternative CRC32 de 74 octets utilisant
%2326%11
: Essayez-le en ligne!PHP , 74 octets
Essayez-le en ligne!
Une autre alternative avec la même longueur, prend le 22ème caractère dans le
md5
mot (seul caractère qui donne une valeur unique pour chaque mot) et utilise ensuite ce caractère pour mapper à un chiffre.la source
Python 2 ,
7170 octets-1 grâce aux ovs (utilisation
find
à la place deindex
)Essayez-le en ligne!
la source
JavaScript (ES6),
70 67 6662 octetsSauvegardé 3 octets grâce à @ovs
Essayez-le en ligne!
la source
'2839016547'[parseInt(s,36)%204%13]
est de 3 octets plus court.Gelée ,
1917 octetsUn lien monadique acceptant une liste de caractères qui donne un entier.
Essayez-le en ligne!
À peu près un portage de ma réponse Python 2.
précédent
Essayez-le en ligne!
Il existe
peut-êtreun moyen plus court, mais c'est un moyen qui m'est venu à l'esprit.la source
Python 3 ,
107,91,77, 90 octets-16 octets par Sriotchilism O'Zaic
+13 octets pour supprimer les zéros non significatifs
Essayez-le en ligne!
la source
lstrip
méthode supprime chaque caractère de la chaîne qui est donnée comme argument, donc "huit deux" devient "ight deux", car "e" est supprimé. De plus, "zéro zéro zéro" devrait imprimer "0", et non pas donner une erreur.Perl 6 ,
3532 octetsEssayez-le en ligne!
Explication
la source
C (gcc) , 89 octets
Essayez-le en ligne!
Grâce aux astuces les plus intelligentes de @Ceilingcat:
la source
05AB1E ,
1816 octetsEssayez-le en ligne.
Explication:
Voir cette astuce de mes 05AB1E (section Comment chaînes Compresser ne font pas partie du dictionnaire? ) Pour comprendre pourquoi
.•ƒ/ÿßÇf•
est"rothuvsein"
.la source
05AB1E ,
1716 octetsEssayez-le en ligne!
Lien parfait avec l'autre réponse 05AB1E , mais en utilisant une approche complètement différente.
la source
Retina 0.8.2 ,
4645 octetsEssayez-le en ligne! Le lien inclut des cas de test. Explication:
Mettez chaque mot sur sa propre ligne et tripliquez-le.
Translittérer le 7e caractère de chaque ligne en utilisant la chaîne de @ UnrelatedString.
Supprimez tous les caractères non numériques restants.
Supprimez les zéros non significatifs (mais laissez au moins un chiffre).
Solution plus traditionnelle de 46 octets:
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Les mots
zero
,two
,four
,six
eteight
contiennent uniquement les lettreszwuxg
. Translittérez-les aux chiffres pairs.Pour les chiffres impairs, faites correspondre les deux premières lettres de chaque mot individuellement.
Supprimez tous les caractères non numériques restants.
Supprimez les zéros non significatifs (mais laissez au moins un chiffre).
la source
Gelée ,
201817 octetsEssayez-le en ligne!
-2 octets de l'exécution de "rothuvsein" via le compresseur de cordes de user202729 .
-1 octet pour avoir volé la chaîne d'enklact zéro-libre de Jonathan Allan et l'avoir placée dans un programme légèrement différent.
la source
C ++ (gcc) ,
478218142 octets- (beaucoup) merci à Jo King
Essayez-le en ligne!
la source
Japt , 13 octets
Essayez-le
On dirait que tout le monde m'a battu à la même idée - j'aurais pu me épargner les tracas de l'écriture d'un script pour forcer brutalement la chaîne optimale pour la compression, seulement pour trouver cela, jusqu'à l'index
1,000,000
(c'était tôt, je n'avais pas eu mon caféine encore!), "rothuvsein" est la seule chaîne possible!La chaîne compressée contient les caractères à codepoints
206
,168
,117
,118
,160
et136
.la source
Ruby ,
63 octets,52 octets, 50 octets-2 grâce à la pointe de l'encre de valeur
la source
$*
est un alias pourARGV
, alors n'hésitez pas à l'utiliser pour économiser des octets supplémentaires.T-SQL, 110 octets
Le saut de ligne est uniquement pour la lisibilité.
L'entrée est prise via la tableje , selon nos règles IO . J'aurais pu économiser 14 octets en préremplissant une variable de chaîne, mais cela n'est autorisé que si la langue n'a pas d'autres méthodes d'entrée.
Explication:
STRING_SPLIT
prend la chaîne d'entrée et la sépare dans les espacesCHARINDEX
prend les 2 premiers caractères et renvoie la position (basée sur 1) dans la chaîne'_ontwthfofisiseeini'
.'ze'
pour zéro n'est pas dans la chaîne et renvoie 0 pour "non trouvé". Le trait de soulignement garantit que nous n'obtenons que des multiples de deux.STRING_AGG
écrase les chiffres sans séparateur0+
force une conversion implicite en INT et supprime tous les zéros non significatifs.1*
fonctionnerait également.la source
code machine x86, 46 octets
Hexdump:
C'est un
fastcall
fonction - reçoit un pointeur sur la chaîneecx
et retourne le résultat danseax
.La fonction de hachage se multiplie par un nombre magique
1856645926
, fait unXOR
octet d'entrée et se décale de 2 bits vers la droite.Sauvegarde et restauration des registres noclobber (
edi
etebx
) ont pris 4 octets, mais je n'ai pas trouvé de moyen plus efficace de l'implémenter. Stockage de la constante 10 poucesebx
était particulièrement ennuyeux!Démontage avec octets de code correspondants:
Code C équivalent:
la source
Nettoyer , 88 octets
Essayez-le en ligne!
Fortement basé sur la réponse de Jonathan Allan .
Utilise une compréhension pour l'indexation au lieu de
indexOf
/elemIndex
.la source
J , 38 octets
Essayez-le en ligne!
la source
VBA, 160 octets
Correspond aux deux premiers caractères d'une chaîne, zéro exclu.
la source
" "
dansSplit
car c'est la valeur par défaut,Lbound(s)
sera toujours zéro et vous pouvez supprimer(...)+1
si vous ajoutez un espace au début desInStr
données. En plus de cela, il vaut mieux utiliser une chaîne ou une variante pour gérer la conservation des données provenant de l'InStr
instruction car vous n'avez pas besoin d'utiliser(i)
ouJoin(s,"")
. Oh etInt(a/b)
c'est la même chose quea\b
.for each
boucle, vous pouvez réduire votre fonction à 101 octets en tant queFunction G(x):For Each c In Split(x):G=10*G+InStr(" ontwthfofisiseeini",Left(c,2))\2:Next:End Function
ou 101 octets en tant que sous-ensemble imprime implicitement la sortie dans la fenêtre de débogage en tant queSub F(x):For Each c In Split(x):v=10*v+InStr(" ontwthfofisiseeini",Left(c,2))\2:Next:Debug.?v:End Sub
. Si vous limitez votre réponse, vous pouvez même l'obtenir à 81 octets en tant que fonction de fenêtre immédiate Excel VBAFor Each c In Split([A1]):v=10*v+InStr(" ontwthfofisiseeini",Left(c,2))\2:Next:?v
.Fusain , 19 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Port de la réponse 05AB1E de @ KevinCruijssen. Explication:
la source
PowerShell , 48 octets
Essayez-le en ligne!
Utilise la même
rothuvsein
astuce que les autres, grâce à Jonathan Allan. Attend les arguments d'entrée via l'éclatement, qui sur TIO se manifeste sous forme d'arguments de ligne de commande distincts.la source
Kotlin, 83 octets
+1 octet si vous voulez prendre en charge les longs avec
toLong()
Même astuce rothuvsein que les autres, économisant de précieux octets grâce à nice
toInt()
et kotlinfold()
. Je ne peux tout simplement pas me débarrasser du sentiment que certains octets supplémentaires peuvent être rasés, bien que ...la source
sed -re , 78 octets
la source
Windows Batch, 169 octets
la source
Perl 6 , 45 octets
Essayez-le en ligne!
la source
BaCon ,
8372 octetsEn supposant que la chaîne est fournie en w $, ce code recherche l'index dans "zeontwthfofisiseeini" en utilisant une expression régulière basée sur les 2 premiers caractères uniques de chaque mot. L'index est ensuite divisé par 2 fournissant le résultat correct.
la source