Tâche
Soit une chaîne de noms anglais de chiffres «collapsed» ensemble, comme ceci:
zeronineoneoneeighttwoseventhreesixfourtwofive
Fractionner la chaîne en chiffres:
zero nine one one eight two seven three six four two five
Règles
L'entrée est toujours une chaîne. Il se compose toujours d’un ou de plusieurs noms de chiffres anglais minuscules, regroupés et rien d’autre.
- Les noms de chiffres anglais sont
zero one two three four five six seven eight nine
.
- Les noms de chiffres anglais sont
La sortie peut être une liste de chaînes ou une nouvelle chaîne dont les chiffres sont délimités par des chaînes non alphabétiques et non vides. (Votre sortie peut aussi éventuellement avoir de telles chaînes au début ou à la fin, et les délimiteurs ne doivent pas nécessairement être cohérents. Ainsi, même quelque chose comme
{{ zero0one$$two );
est une réponse valide (si absurde) pourzeroonetwo
.)La réponse la plus courte en octets l'emporte.
Cas de test
three -> three
eightsix -> eight six
fivefourseven -> five four seven
ninethreesixthree -> nine three six three
foursixeighttwofive -> four six eight two five
fivethreefivesixthreenineonesevenoneeight -> five three five six three nine one seven one eight
threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight -> three seven seven six nine nine nine five eight two five eight six three eight
zeroonetwothreefourfivesixseveneightnine -> zero one two three four five six seven eight nine
Réponses:
Rétine , 20 octets
Essayez-le en ligne!
la source
C (gcc) ,
89 80 76 75 72 71 7069 octetsEssayez-le en ligne!
(89) Crédit à gastropner pour le hachage XOR.
(76) Nous remercions Toby Speight d’ avoir eu l’idée d’utiliser 1st et 3rd.
(75) Nous remercions Michael Dorgan pour
'0'
→48
.(72) Nous remercions Michael Dorgan et Lynn pour des littéraux avec des caractères de contrôle.
(69) Nous remercions Lynn pour
x?y:0
→x&&y
la source
Python 2 , 50 octets
Essayez-le en ligne!
-3 merci à Lynn .
-4 grâce à la réponse rationnelle d ' Uriel .
la source
import re;re.compile('…').findall
devrait sauver quelques octets. Je m'attendais à ce que cela se transforme en regex golf :)Befunge,
87858176 octetsEssayez-le en ligne!
Befunge ne contient aucune instruction de manipulation de chaîne, nous créons donc une sorte de hachage des trois derniers caractères rencontrés, lors de leur traitement.
Ce hachage est essentiellement un nombre à trois chiffres, base 104. Chaque fois qu'un nouveau caractère est lu, nous modifions le hachage avec 104 2 pour supprimer le caractère le plus ancien, nous le multiplions par 104 pour faire de la place pour le nouveau caractère, puis nous ajoutons la valeur ASCII du nouveau caractère mod 27 (pour être sûr il ne déborde pas).
À des fins de comparaison, prenons cette valeur mod 3817, écrivons-la en mémoire (en la tronquant à 8 bits), ce qui donne des nombres plus petits, plus faciles à gérer par Befunge. Les hachages avec lesquels nous devons alors comparer sont 0, 38, 59, 64, 88, 92, 114, 117 et 123. Si cela correspond, nous savons que nous avons rencontré une séquence de caractères marquant la fin d'un nombre, donc nous sortons un espace supplémentaire et réinitialisons le hachage à zéro.
Si vous vous demandez pourquoi la base 104 ou le mod 3817, ces valeurs ont été soigneusement choisies afin que la liste de hachage avec laquelle nous devions faire la comparaison puisse être représentée avec le moins d’octets possible.
la source
Java (OpenJDK 8) ,
554643 octetsÉconomisez 9 octets grâce à Forty3 / FrownyFrog
Économiser 3 octets grâce à Titus
Essayez-le en ligne!
edit: Merci pour l'accueil et l'explication de lambdas!
la source
g
suffixe regex au lieu deAll
).f=(s)=>
lieu des->
, qui est de 4 octets plus court.C (gcc) ,
179159146139137 137116107103102 octetsEdit 1: (Ajout des suggestions de M. Xcoder - merci! - Ma version macro a la même taille que la vôtre, mais j’aime mieux la vôtre.)
Éditer 2: Le caractère modifié se compare aux appels à
strchr()
Edit 3: Les déclarations de K & R's (Eww!)
Edit 4: Quand 1 macro ne suffit pas ...
Edit 5: Redone avec le nouvel algorithme suggéré ci-dessus. Merci à James Holderness pour cette idée géniale!
Edit 6: Suppression de 0 set car il semble y aller automatiquement - Techniques de golf de niveau maître utilisées (virgules, astuce printf, etc.) - Merci gastropner !
Edit 7: utilisez memchr et corrigez un bug signalé par James Holderness .
Edit 7: Utilisez
&&
le contrôle final pour remplacer?
- merci jxh .Essayez-le en ligne!
Non-golfé (qui est toujours très golfy honnêtement ...)
Solution de grep-esqe simple et ancienne:
Ancienne version plus propre.
Essayez-le en ligne!
la source
#define
insérantputchar
et en supprimant une paire de crochets inutiles.#define p putchar(
place (notez la parenthèse ouverte).c,h=0;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,c=h%3817,printf(" "+!(c&&strchr("&;@X\\ru{",c)));}
JavaScript,
6657524441 octetss=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")
Assez naïf, mais ça marche.
FrownyFrog attrape bien 2 caractères .. à l'exception de "un" pour lequel un contrôle pur de 2 caractères pourrait gâcher la zéronine. Edit: le simple
f
ets
ont été de bonnes prises par FrownyFrog que j'ai négligé mes deux premiers golfs.Merci, Neil, pour la suggestion d’un lambda non nommé et le fait d’utiliser un seul caractère pour
z
descendre à 52.Titus propose un RegEx plus petit. Je sens que nous nous dirigeons éventuellement vers la regex d'Uriel.
la source
z|tw|th|f|s|ei|ni|on
on|t[wh]|.i|[fsz]
(-4 bytes)on|
correspondra auzeronine
renduzer onine
Retina ,
2423 octetsEssayez-le en ligne! Edit: 1 octet enregistré grâce à @FrownyFrog.
la source
.....
->.{5}
travailler?C,
10399 octetsCela fonctionne pour tout encodage de caractères (y compris les encombrants comme EBCDIC), car il n'utilise pas la valeur numérique des caractères saisis. Au lieu de cela, il localise les première et troisième lettres dans une chaîne magique. La distance entre ceux-ci indique le nombre de lettres à avancer avec chaque impression.
Programme de test
la source
J ,
3735 octetsEssayez-le en ligne!
la source
f=:[:>'..[eox]|[tse]?....'&rxall
et cela a fonctionné dans interpeter, mais ne fonctionne pas dans TIO.C (gcc) ,
106 octets104102 octets-2 octets grâce à @jxh -2 octets grâce à ceilingcat
Essayez-le en ligne!
XOR est vraiment notre plus grand allié.
la source
s[1]
sera plus courte.Retina , 28 octets
Essayez-le en ligne!
la source
Pyth ,
35 2723 octetsÉconomiser beaucoup d'octets en reportant l'approche d'Uriel .
Essayez-le ici! Approche initiale
la source
Pip , 27 octets
Prend l'entrée en tant qu'argument de ligne de commande. Essayez-le en ligne!
Remplacement de regex simple, insère un espace avant chaque match de
[zfs]|one|[ent][iwh]
.Sautant dans le train de
voler enempruntant la regex d'Uriel donne 23 octets (avec-s
drapeau):la source
Gelée ,
2321 octetsUn programme complet imprimant une sortie séparée par une ligne. Remarque: une fois que cela est fait, il imprime de manière répétée des lignes vides "pour toujours" (jusqu'à une limite de récursion énorme ou un seg-fault)
Essayez-le en ligne!(La sortie du TIO est accumulée, une implémentation locale imprimera ligne par ligne)
Comment?
En commençant par une liste de caractères, le programme répète:
La longueur du premier mot est déterminée en inspectant les trois premiers caractères de la liste de caractères actuelle (nécessairement partie du premier mot). Le programme les convertit en ordinaux, les multiplie ensemble, modulos le résultat par 953, modulos par sept, modulos par trois et en ajoute trois:
la source
C
168,145,144, 141 octetsEDIT: essayé init 'i' à 1 comme si
Pour se débarrasser des grands espaces,
mais cela commence par trois, sept ou huit
141
Essayez-le en ligne
144
Essayez-le en ligne
168
Essayez-le en ligne!
Ungolfed
Les constantes int deviennent inutiles en déplaçant un << 8,
mais si vous pouvez les comparer aux chaînes, cela devrait être le plus naturel
146 Utilisation de la comparaison de chaînes
Utilisation de la comparaison de chaîne
Obscurci
la source
Gelée , 44 octets
Essayez-le en ligne!
la source
Un assez long. Vous êtes invités à jouer au golf.
R , 109 octets
Essayez-le en ligne!
la source
intToUtf8
! 90 octets seraient possibles en utilisant une approche différente en utilisant l'expression rationnelle:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Haskell , 81 octets
Essayez-le en ligne!
Explication:
la source
Python 3 (sans regex) , 85 octets
Essayez-le en ligne!
la source
while s[i:]
, puis vous pouvez réduire ce nombre à 93 octets en soumettant un message récursiflambda
(les fonctions doivent simplement renvoyer le résultat plutôt que l’imprimer elles-mêmes).Excel, 181 octets
Place un espace devant:
z
,on
,tw
,th
,f
,s
,ei
,ni
la source
Z80 Assembly,
4645 bytes(C'était amusant d'adapter la regex cool d'Uriel à un environnement peu favorable aux regex).
la source
Gelée ,
40 à39 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
QuadS ,
21 à20 octetsEssayez-le en ligne!
Ceci est un port de ma réponse rétine .
la source
APL (Dyalog Unicode) , 25 octets
Essayez-le en ligne!
la source
Python 3 , sans regex,
83 68 6563 octets-15 grâce à Lynn (refactorisation dans une seule fonction)
-3 plus grâce à Lynn (éviter l'indexation dans une liste avec plus d'arithmétique)
... menant à une autre sauvegarde de 2 octets (évitant les parenthèses avec des modulos négatifs) :)
Une fonction qui imprime les mots séparés par des nouvelles lignes puis soulève un
IndexError
.Essayez-le en ligne! (supprime les exceptions pour autoriser plusieurs exécutions dans la suite de tests)
la source
def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
h(s)
eth(s)
comment n'ai-je pas remarqué?! Merci Lynn!h=(ord(s[0])*ord(s[1])%83%7+1)%3+3
c'est 65 octets! :)Gelée , 36 octets
Essayez-le en ligne!
Algorithme:
Je parie que nous pouvons faire encore mieux.
la source
Mathematica, 125 octets
Essayez-le en ligne!
TIO génère un message d'erreur à propos de "CountryData" (???).
Je ne sais pas pourquoi cela se produit, mais tout fonctionne bien pour Mathematica.
la source
Perl 6 ,
4230 octetsEssaye-le
Testez-le
(Traduit d'autres réponses)
la source
q / kdb +,
5951 octetsSolution:
Exemple:
Explication:
Solution rapide, probablement des approches meilleures et plus golfables.
Remarques:
46 octets avec un peu de golf, remplaçant q appels par k, tout en restant une solution lourde.
asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:
la source