Objectif
Ecrivez un programme ou une fonction qui convertit un numéro de téléphone numérique en texte facilitant la prononciation. Lorsque les chiffres sont répétés, ils doivent être lus comme "double n" ou "triple n".
Exigences
Contribution
Une chaîne de chiffres.
- Supposons que tous les caractères sont des chiffres de 0 à 9.
- Supposons que la chaîne contienne au moins un caractère.
Sortie
Des mots, séparés par des espaces, expliquant comment ces chiffres peuvent être lus à voix haute.
Traduire les chiffres en mots:
0 "oh"
1 "un"
2 "deux"
3 "trois"
4 "quatre"
5 "cinq"
6 "six"
7 "sept"
8 "huit"
9 "neufLorsque le même chiffre est répété deux fois de suite, écrivez " numéro double ".
- Lorsque le même chiffre est répété trois fois de suite, écrivez "triple numéro ".
- Lorsque le même chiffre est répété quatre fois ou plus, écrivez " numéro double " pour les deux premiers chiffres et évaluez le reste de la chaîne.
- Il y a exactement un espace entre chaque mot. Un seul espace de début ou de fin est acceptable.
- La sortie n'est pas sensible à la casse.
Notation
Code source avec le moins d'octets.
Cas de test
input output
-------------------
0123 oh one two three
4554554 four double five four double five four
000 triple oh
00000 double oh triple oh
66667888 double six double six seven triple eight
19999999179 one double nine double nine triple nine one seven nine
code-golf
kolmogorov-complexity
Hand-E-Food
la source
la source
Réponses:
05AB1E ,
5352515049 octetsEssayez-le en ligne!
Explication:
la source
M
regarde aussi à l'intérieur des listes lors de la détermination du nombre entier maximal sur la pile? Je ne savais pas ça. Cela ressemble à quelque chose à retenir. :)8088 Assembly, IBM PC DOS,
164159156155 octetsBinaire:
Construisez et testez le fichier exécutable à
xxd -r
partir d’en haut, ou téléchargez PHONE.COM .Liste non assemblée:
TL; DR:
La chaîne d'entrée est lue de droite à gauche pour faciliter la recherche d'un triple. La sortie est poussée sur la pile x86 pour simplifier l'inversion de l'ordre d'affichage et faciliter la réorganisation des mots "double" et "triple" pour précéder le nom du chiffre.
Si le chiffre suivant est différent du dernier, le nom est recherché dans la liste de mots et inséré dans la pile. En l'absence de concept formel de "tableau indexé de chaînes de longueur variable" dans le code machine, la liste de mots est analysée
i
(l'index du mot) plusieurs fois pour que le délimiteur de chaîne ($
) recherche le mot correspondant. Utilement, x86 a une paire d’instructions courtes (REPNZ SCASB
similaires à cellesmemchr()
en C), ce qui simplifie les choses (merci à l’ ICCI !).Si le chiffre est identique au précédent, le compteur de la longueur d'une "exécution" est incrémenté et continue à boucler vers la gauche sur l'entrée. Une fois la course terminée, le nom du chiffre est extrait de la pile car il devra être placé après le "double" ou le "triple" pour chaque groupe. Si la longueur de la séquence est impaire (et la longueur de la séquence est
> 1
), le nom du chiffre suivi de la chaîne "triple" est envoyé dans la pile et la longueur de la séquence est réduite de 3. Comme la longueur de la séquence sera désormais paire, le pas est répété pour "double" jusqu'à ce que la longueur de l'analyse soit 0.Lorsque la chaîne d'entrée a atteint la fin, la pile est vidée avec chaque chaîne enregistrée écrite à l'écran dans l'ordre inverse.
I / O:
Un exécutable PC DOS autonome, entré de la sortie de la ligne de commande vers la console.
Téléchargez et testez PHONE.COM .
la source
repne scasb
estmemchr
(oustrchr
si vous savez qu'il va y avoir un coup), passtrstr
.mov cl, byte[si]
équivaut àmovzx cx, byte [si]
. Je me demande si utiliser un registre différent, commeAH
, pour le compte avecdec ah / jnz
au lieu deloop
sauver quelque chose de ne pas avoir à pousser / pop CX. Probablement pas, et vous n'avez plus de registre 16 bits autorisant un octetdec
.CH=0
par exemple , allez sur fysnet.net/yourhelp.htm , qui, pour toute version raisonnable de DOS, est toujours à zéro, comme avecBX
. Bonne idée de l'extension à zéromov
, bien que, techniquement, je ne pense pas qu'ellemovzx
soit disponible sur le 808x (conserver la plate-forme cible sous IBM PC 5150 et tous). J'ai manipulé tous les registres du mieux que j'ai pu pour sauver les octets, mais si vous voyez quelque chose que j'ai probablement manqué, faites-le-moi savoir!memchr
IMO. L '"instruction de chaîne" qui donne un nom trompe les gens en leur faisant croire qu'ils travaillent sur des chaînes C de longueur implicite, mais qu'ils travaillent en réalité sur des chaînes de longueur explicite telles que desstd::string
tampons. Commememcpy
,memset
(movs / stos),memchr
/memrchr
(repne scas avec DF = 0 ou 1) etmemcmp
(repe cmps). Le seul équivalent en Crepe scas
eststrspn
parce que je ne pense pas qu’il existe unemem
fonction pour cela. Vous pouvez même décrirestosw
oustosd
commewmemset
par exemple.movzx
coûte un octet supplémentaire en opcode, et oui, il n'a été introduit qu'avec 386. Il était simplement plus facile de taper pour décrire le fait que vous effectuez une fusion à octets inférieurs et en supposant qu'elle est correctement étendue à zéro. Si vous connaissez CX ou au moins CH = 0, alors oui pour le golf, allez toujours avecmov
CL. Mais en dehors du golf, les instructions de chargement d'octets de x86 sontmovzx
etmovsx
: elles évitent toutes fausses dépendances ou autres manigances à registre partiel. Sur les processeurs modernes avec une destination dword, ils sont aussi rapides que lemov
chargement de dword .05AB1E ,
6156535251 octets-9 octets grâce à @Grimy .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir ce conseil 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi
… ‹¶½¿
est" double triple"
et“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
est"oh two three four five six seven eight nine"
.la source
if(length>=4)
avant d'ajouter le reste, mais bien sûr ce n'est pas nécessaire pour les entiers de taille1,2,3
, car;Å2¨3ª£
cela laissera les chaînes intactes (simplement enveloppées dans une liste que nous avons aplaties après la carte). Merci d'avoir remarqué! Et impatient de voir votre réponse avecÅγ
. J'avais en effet le sentiment que la première partie pourrait être beaucoup plus courte.Dg;LàäR
est toujours un octet plus court queāɨšJõK
, et beaucoup plus semblable à ce que vous aviez à l’origine.á
au lieu deõK
à la fin. :)á
! Voici un 51 et un autre . 50 se sent possible.QuadR , 137 octets SBCS
Casse de titre avec un espace principal.
Essayez-le en ligne!
∊
ε nlist (aplatir)¯2↑¨
prendre les deux derniers caractères (rembourrage sur la gauche avec un espace) de chacun des caractères@
à des positions où les(∊∘⎕A)
caractères sont membres de la majuscule A lphabet⍵
dans le résultat de l'opération ci - dessous PCRE Remplacer ...(.)
tout caractère\1
suivi par lui-même*
zéro ou plusieurs fois, est remplacé par le résultat de ce qui suit…{…}⍵M
"dfn";⍵
est le M atch du motif ci - dessus('OhOneTwoThreeFourFiveSixSevenEightNine'(
…)⎕A)
Applique la fonction tacite anonyme suivante avec la chaîne longue et l' alphabet majuscule Un alphabet de gauche:∊
appartenance (de lettres dans la longue chaîne dans l'alphabet majuscule)⊂
partitions (avec une nouvelle partition commençant chaque fois que is-a-member⊣
l'argument de gauche (c'est-à-dire la longue chaîne)(
…)⎕R
PCRE R eplace les motifs suivants avec des ces mots:⎕D
les chiffres 0 à 9,¨
traiter chacun comme un motif séparé⍺←
assigner cette fonction de remplacement à⍺
(pour une alphabétisation)⋄
puis,⊃⍵
le premier personnage du match,
comme une chaîne⍺
appliquer⍺
à ellew←
assigner ceci àw
(pour mot )' '∊
…:
Si l'espace en est un membre (c'est-à-dire si la correspondance était vide):⍬
ne renvoie rien (devient la chaîne vide)⋄
autre,1=≢⍵:
si on égal le décompte des caractères dans la correspondance (c'est-à-dire sa longueur):⍺⍵
alphabetiser ce chiffre⋄
autre,3=≢⍵:
si trois est égal au total des caractères de la correspondance (c'est-à-dire sa longueur):'Triple',w
préfixer « Triple » du w ord⋄
autre,2↓⍵
déposer aux chiffres du match∇
récidive à ce sujetw,
ajouter le mot'Double',
prepend "Double"la source
JavaScript (ES6),
161 160 152144 octetsLa sortie comprend un seul espace de début.
Essayez-le en ligne!
ou Voir le code source formaté
Comment?
La conversion est traitée en trois étapes:
"X X"
par"double X"
"double X X"
par"triple X"
Pour économiser des octets, nous utilisons la même expression régulière pour toutes les étapes:
qui fonctionne comme suit:
À l'étape 1, nous utilisons une fonction de rappel qui sélectionne le mot correct dans une table de recherche:
"799999"
→" seven nine nine nine nine nine"
A l'étape 2, nous remplaçons par
"$1 double$2"
:" (seven)( nine)( nine)"
→" seven double nine"
"( nine)( nine) nine"
→" double nine nine"
A l'étape 3, nous remplaçons par
"triple$2"
:" (double)( nine)( nine)"
→" triple nine"
la source
Wolfram Language (Mathematica) , 115 octets
Essayez-le en ligne!
Prend une liste de chiffres en entrée. La sortie comprend un espace principal.
la source
Stax , 56 octets
Exécuter et déboguer
la source
Python 2 ,
171169168 octetsEssayez-le en ligne!
-1 octet, merci à Jitse
la source
1312
;)['','double ','triple '][n]
à' eellpbiurotd'[-n:0:-2]
pour 168 octets: Essayez en ligne!Perl 5
-p
, 111 octetsEssayez-le en ligne!
Explication:
la source
Scala , 213 octets
Je l'ai. D'une manière ou d'une autre, la version récursive que j'essayais de construire était fortement plus prolixe que celle-ci (toujours récursive, mais dans un cas seulement). Function
f
prend comme chaîne d'entrée le numéro de téléphone et sort sa phonétique avec un espace de fin.Essayez-le en ligne!
modifier : -8b grâce à DrY Wit!
Scala , 215 octets
Et voici la version la plus avancée des espaces, deux octets de plus pour une raison quelconque (même avec un refactoring massif).
Essayez-le en ligne!
la source
(o(0)+"").toInt
paro(0)-48
.PHP ,
174169166159 octetsEssayez-le en ligne!
Pour chaque chiffre à l'indice de à
$i
partir de 0:$i
est égal à 3, imprime'triple '
et ajoute 2 à$i
l'itération suivante pour permettre à 2 chiffres de sauter.$i
est égal ou supérieur à 2 mais non égal à 3, imprime'double '
et ajoute 1 à$i
l'itération suivante, ce qui signifie qu'un chiffre est sauté.$i++
.la source
Retina 0.8.2 , 105 octets
Essayez-le en ligne! Sort un espace de premier plan. Explication: À l’origine, j’ai essayé une expression régulière qui correspond automatiquement à 2 ou 3 chiffres, mais l’approche de @ Arnauld s’est révélée être plus golfeuse. Explication:
Faites correspondre les paires de chiffres identiques et remplacez le premier par un
=
. Répétez ensuite l'opération, de sorte que pour un nombre impair, l'avant-dernier chiffre soit également remplacé par un=
.Espacez les chiffres (et
=
s).Traitez le cas de trois chiffres identiques.
Remplacez tous les caractères restants par des mots.
la source
Gelée , 59 octets
Essayez-le en ligne!
Un lien monadique qui prend une chaîne de caractères numériques comme argument et renvoie une chaîne Jelly de mots séparés par des espaces. Appelé en tant que programme complet, génère implicitement.
la source
T-SQL 2017, 238 octets
Ajout de quelques sauts de ligne pour le rendre lisible
Essayez-le en ligne
la source
C ++, 382 octets
Ce n'est pas super, mais quelqu'un a besoin d'écrire une version C ++. La fonction récursive R parcourt la chaîne en entrée et compte les valeurs répétées. S'il y a plus de 3 répétitions, il prétend qu'il y en a 2, puis rembobine et tente à nouveau.
Quelques caractères de source supplémentaires pourraient probablement être supprimés avec
#define
major, mais je suis sûr qu'un meilleur algo pourrait en extraire davantage.et vérification des cas de test:
la source
#include <sstream>
? Ou pourriez-vous déplacer cela après la partie golfée pour la fonction de test? Je pense que la saisiestd::ostream&s
prendrait moins de place queusing namespace std;
, sauf s’il existe d’autres endroits où vous auriez besoin d’unstd::
.Perl 6 ,
9693 octetsEssayez-le en ligne!
Ceci est un bloc de code anonyme qui prend un nombre et retourne une chaîne avec les nombres en majuscules, par exemple
0123 => oh ONE TWO THREE
avec un seul espace de fin.Cela a été supprimé pendant un certain temps jusqu'à ce que je découvre comment utiliser les captures dans un aperçu, mais cela devrait être corrigé maintenant.
la source
Rouge , 242 octets
Essayez-le en ligne!
la source
Scala , 253 octets
Essayez-le en ligne!
la source
Oracle SQL, 578 octets (sous forme formatée)
La solution n’est en aucun cas concise, vous devez donc l’afficher sous forme formatée.
Test en SQL * Plus
L'astuce principale est que les chiffres convertis en mots à l'aide de modèles au format Oracle au lieu de littéraux codés en dur "un" ... ... neuf ".
la source
union all
parselect regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
.JavaScript, 142 octets
Essayez-le en ligne!
la source
(Roblox) Lua 5.1 , 166 octets
Ensure
s
est une valeur de chaîne prédéfinie remplie uniquement de chiffres; ce sera la variable à modifier. Le résultat comprendra un caractère d' espacement[\u20]
.la source
s
d’avoir déjà l’entrée. En dehors de cela, vous avez un bon premier post! Je vous recommanderais d'inclure un lien vers un site de test en ligne, par exemple tio.run/#lua, afin que d'autres personnes puissent tester votre solution