Concept
Se souvenir des chiffres peut être difficile. Se souvenir d'un mot peut être plus facile. Afin de mémoriser de grands nombres, j'ai créé un moyen de les prononcer d'une manière semblable à un leetspeak.
Règles
Chaque chiffre est d'abord remplacé par sa lettre correspondante:
0 => O
1 => I
2 => R
3 => E
4 => A
5 => S
6 => G
7 => T
8 => B
9 => P
Après le remplacement, deux choses supplémentaires sont effectuées pour améliorer la prononciation:
Entre deux consonnes, un
U
est ajouté.Entre deux voyelles, un
N
est ajouté.
Exemples / cas de test
512431 => SIRANENI
834677081 => BENAGUTUTOBI
3141592 => ENINANISUPUR
1234567890 => IRENASUGUTUBUPO
6164817 => GIGABIT
Ce qui est impossible
- Lettres et chiffres mélangés dans le même mot
- Deux consonnes successives ou deux voyelles successives
- Lettres qui ne figurent pas dans la liste ci-dessus
- Autres personnages
Règles
Le but de ce code-golf est de créer un traducteur bidirectionnel pour ce concept.
- Votre programme doit d'abord comprendre par lui-même s'il s'agit d'une traduction de lettre à numéro ou de numéro à lettre.
- Il doit vérifier que l'entrée est correctement formée.
- Si tout est correct, affichez la traduction.
- Sinon, afficher un message d'erreur, rien, retourner une valeur de falsey ou planter le programme.
Détails
- Le numéro / la chaîne d'entrée peut être entré dans le format de votre choix (stdin, argument, ...)
- C'est le code-golf , donc la réponse la plus courte l'emporte.
- Les failles standard sont interdites.
GIGATESTER
êtreGIGATESUTER
?AB23
;AEI
;BB
;Z
;ACE
;giga
;!@#$
;-123
; etc. En outre, sur la base des règles de validation, nous pouvons convertir6164735732 => GIGATESTER
, maisGIGATESTER
entraînera une fausse valeur, à cause deST
(règle des deux consonnes successives). La façon dont votre défi est actuellement configuré, la partie principale du défi est la validation, au lieu de la conversion. Je suis d'accord avec ça, mais la validation devrait être définie un peu mieux dans ce cas.Réponses:
JavaScript (ES6), 130 octets
Prend l'entrée sous forme de chaîne dans les deux sens de traduction. Renvoie la traduction sous forme de chaîne ou
false
en cas d'entrée non valide.Démo
Afficher l'extrait de code
la source
Japt ,
6159928584 octetsPrend entrée comme une chaîne pour les deux opérations et renvoie une chaîne pour les deux aussi bien ou
false
pour les entrées invalides nombre input.Assumes toujours contenir plusieurs chiffres, ajouter 1 octet remplacerUÉ
avecUn<space>
si ce n'est pas valide. Renvoiefalse
pour le cas de testGIGATESTER
mais, selon les règles, cela devrait être une entrée non valide.Essayez-le: chiffres -> lettres ou lettres -> chiffres
24 octets économisés grâce à obarakon , qui m'a également convaincu de reprendre cela après l'avoir abandonné plus tôt. Je souhaite qu'il ne l'ait pas fait!332625 (!) Octets sacrifiés en implémentant une solution rapide (c'est-à-dire, encore à jouer au golf) pour vérifier la validité des entrées.Explication
(Encore à mettre à jour vers la dernière version)
la source
AEI
Python 3 , 147 octets
Essayez-le en ligne!
la source
Java (OpenJDK 8) ,
416410399382376370 octets-2 octets grâce à @Cyoce
-17 octets de plus grâce à une idée de @Cyoce
-6 octets grâce à @KevinCruijssen
Essayez-le en ligne!
Ugh, le remplacement de java est tellement verbeux.
Fonction qui prend une chaîne et renvoie la chaîne traduite de chiffre -> lettre ou vice versa. Plantage sur une entrée non valide (vous pouvez le voir dans l'exemple tio où il génère les valeurs correctes pour les 10 premiers cas de test, puis se bloque avec une erreur de division par zéro qui apparaît dans la vue de débogage)
Non golfé (les premier et dernier termes de la boucle for sont retirés pour plus de lisibilité)
Le regex pour faire correspondre les nombres est simple, mais voici le regex pour faire correspondre les lettres aux nombres
la source
(s)->
if
instruction sont des affectations (qui renvoient une valeur), essayez de remplacer leif
...else if
...else
par l'opérateur conditionnel?:
, en le faisant précéder deObject _=
pour en faire une instruction valide. Je ne sais pas si cela aiderait réellement le nombre d'octets, mais je pense que oui.t
, car vous ne l'utilisez qu'une seule fois. Devientt.charAt(i)+""
alors"OIREASGTBP".charAt(i)+""
( -4 octets ). Et vous pouvez placer la dernière ligne à l'intérieur de la boucle for après l'i<9;
intérieur de la déclaration for-loop. Il devient doncfor(;i<9;s=b?s.replace(v,c):s.replace(c,v)){
( -1 octet ). Oh, et vous pouvez également mettre celuis=b?...
qui vient juste après l'int i=-1;
intérieur de la boucle for:for(s=b?...;i<9;...
( -1 octet ).PHP;
129 127 267 259228 octetsExécuter en tant que pipe avec
-nR
ou l' essayer en ligne .panne
la source
Java 8,
312308304301294290 octets-4 octets (308 → 304) pour un bug-fix (n'arrive pas souvent que le nombre d'octets diminue quand je corrige un bug dans mon code ..: D)
EDIT: utilise une approche différente de la réponse Java de @ PunPun1000 en créant d'abord la chaîne de retour dans une boucle for sur les caractères, puis utilise une expression rationnelle plus abstraite pour la valider dans le retour-ternaire (l'entrée est soit tous les chiffres, ou les voyelles et consonnes données sont-elles alternées (donc sans voyelles ni consonnes adjacentes).
Explication:
Essayez-le ici.
L'expression rationnelle de validation:
la source
05AB1E , 76 octets
Essayez-le en ligne!
Renvoie la valeur falsifiée
0
pour une entrée non valide.la source
Bash ,
241 238235 octetsEssayez-le en ligne!
Moins golfé:
la source
PHP, 268 octets
Essayez-le en ligne!
la source
Perl, 127 octets
126 octets + 1 octet de ligne de commande
Usage:
Devrait suivre toutes les règles du défi - peut accepter des lettres ou des chiffres et commettra une erreur (division par zéro) si la validation échoue
la source
NO
etUS
.Rubis , 205 + 1 = 206 octets
Utilise l'
-p
indicateur pour +1 octet. Maintenant avec un système exhaustif de validation des entrées.Essayez-le en ligne!
la source
Python 3, 741 octets
Essayez-le en ligne!
Il y a beaucoup de place pour l'amélioration, je sais.
la source
sed, 123 octets
Explication
Tout d' abord, nous entourent chiffres avec
_
(pour les voyelles) ou=
(pour les consonnes).Si nous n'avons effectué aucune substitution, nous convertissons les lettres en chiffres, c'est donc une simple substitution, et supprimons
U
etN
. Alors quittez.Sinon, nous passons à l'étiquette
a
, où nous traitons des voyelles consécutives, puis des consonnes consécutives. Transformez ensuite les chiffres en lettres et supprimez les caractères marqueurs que nous avons introduits dans la première étape.la source
Python3, 246 octets
explication:
dict, plus l'élément actueldictest une table de vérité basée sur deux éléments, être une voyelle ou nonla source
JavaScript (ES6), 120
Une fonction prenant l'entrée comme une chaîne. Il renvoie la chaîne correctement traduite si l'entrée est valide, sinon false ou la fonction se bloque.
Moins golfé
Tester
la source