Problème:
Vous créez un nouveau téléphone où les gens peuvent taper des numéros de téléphone spécialisés, par exemple 1-800-program
, et ils seraient convertis automatiquement en un numéro de téléphone utilisable, comme1-800-7764726
(pour l'exemple précédent).
Votre programme recevra une chaîne s'il y a une longueur avec des chiffres, des lettres et des tirets, et convertira toutes les lettres en leurs nombres correspondants.
Voici un clavier, pour référence:
Règles:
- Votre programme recevra une chaîne
- Il le traitera et retournera / imprimera une autre chaîne
- N'importe quelle langue est acceptée
- Puisqu'il s'agit de code-golf , le code le plus court l'emporte
Réponses:
GolfScript, 24 caractères
Entrée de test:
Sortie de test:
Explication:
{ }%
applique le code entre les accolades à chaque caractère de l'entrée..96>{ }*
exécute le code entre les accolades intérieures si et seulement si le code ASCII du caractère est supérieur à 96 (c'est-à-dire qu'il s'agit d'une lettre minuscule).Le premier
,
transforme le caractère en une liste de tous les caractères avec des codes ASCII inférieurs et91,'qx'+-
filtre tous les caractères avec des codes ASCII inférieurs à 91, ainsi que les lettresq
etx
, de la liste. Ainsi, par exemple, le caractèrea
est transformé en liste à 6 caractères[\]^_`
, tandis quez
se transforme en liste à 29 caractères[\]^_`abcdefghijklmnoprstuvwy
.Le second
,
compte les éléments restants dans la liste et3/
divise ce nombre par trois (arrondi vers le bas). Enfin, le`
transforme le nombre résultant (compris entre 2 et 9) en chaîne.Ainsi, selon la spécification, les tirets et les chiffres restent inchangés, tandis que les lettres minuscules sont mappées en chiffres conformément au diagramme du clavier de référence. Le code passera en fait proprement à travers tous les caractères ASCII imprimables à l'exception des lettres minuscules (qui sont mappées comme décrit) et des caractères
{
,|
et}
(qui sont mappés à la chaîne de deux caractères10
). L'entrée 8 bits non ASCII produira toutes sortes de sorties numériques étranges.Après tout cela, il est un peu décevant que cela ne bat la solution triviale de bash que par six caractères.
la source
Bash, 30
Edit: Merci Doorknob pour avoir éliminé 3 caractères
Exemple:
la source
9
secondes?C,
837877656362http://ideone.com/qMsIFQ
la source
~(c=getchar())
getch()
place degetchar()
?getch()
n'est pas la norme C, par conséquent je suppose que cela ne fait pas de lien avec l'idéone. Je l'ai quand même testé dans MSVC et cela ne fonctionne pas vraiment malheureusement - car il consomme directement les entrées du clavier, il n'y a aucun moyen de quitter le programme, bien qu'il traduise ce que vous tapez à la volée, ce qui est plutôt bien.Javascript - 103 caractères
la source
charCodeAt(0)
parcharCodeAt()
et vous pouvez utiliser la fonction flèche pourfunction(y)...
économiser quelques octets et pour~~(y/3)
vous pouvez utilisery/3|0
Rubis, 75 caractères
Utilise le
chars
bloc obsolète avec et imprime chaque lettre individuellement avec$><<
. J'aime aussi[[*?a..?z].index(c)||-1]
; il saisit le caractère correspondant à cette lettre de l'alphabet s'il s'agit d'une lettre, et le dernier caractère (qui se trouve être le caractère de test inchangé) sinon.Ruby, 43 (ou 35) caractères
Vol flagrant de @ace;)
Raser 8 caractères si je peux exécuter en IRB avec la variable
s
comme chaîne:la source
C ++ - 222 caractères
La solution la plus longue à ce jour:
la source
Frink, 92
Une langue assez verbeuse, je sais. Cela vérifie 8 valeurs au lieu de 26 sans avoir à taper les comparaisons. Est-ce qu'une des solutions ci-dessus "222333444 .." peut être réduite de la même manière?
Utilisation de structures intégrées, 107
Utilisation d'une fonction récursive personnalisée, 92
la source
Smalltalk,
7970l'entrée est s:
probablement pas un candidat pour être le plus court - mais peut être intéressant pour une vieille astuce pour éviter un test pour une condition non trouvée (indexOf: renvoie 0 dans ce cas). Aucun test spécial pour les lettres n'est donc nécessaire. Cependant, certains Smalltalks ont des chaînes immuables et nous avons besoin de 4 caractères supplémentaires ("copie").
Oh, une meilleure version, qui traite même des chaînes immuables en 70 caractères:
la source
Mathematica 90
Cela suit la logique de la solution de @ ace:
Exemple
la source
1
dans#1
:)1
. Toujours 90 chars mais couper et coller fonctionnera. Vous comprenez bien sûr la motivation à utiliser la flèche à caractère unique.Perl, 50
Une autre copie évidente de la réponse bash d'Ace
la source
-p
plutôt switch qui vous permet de bien parcourir chaque ligne de stdin. Pendant que nous y sommes, la plage en y /// n'a pas besoin d'être mise entre crochets. Nous pouvons également nous débarrasser de trois 9 en ne laissant qu'un seul et supprimer le dernier point-virgule:-p y/a-z/22233344455566677778889/
Voilà, 30 + 1 pour-p
. Merci d'utiliser les services d'optimisation et de golf Enterprise Chinese Perl et bonne journée.R, très long mais amusant
la source
k [32 caractères]
Usage
la source
JavaScript, 85
JavaScript ne gagnera jamais les guerres de golf, mais j'aime ça et je voulais faire quelque chose de différent que de sauter dans le train @ace.
la source
PHP, 141
Pas le plus court, mais le plus amusant:
Plus lisible:
la source
strtolower
Python 2.7, 80
Je suis nouveau sur python, donc je suis sûr qu'il doit y avoir un moyen de jouer au golf encore plus loin , c'est une approche différente, j'espère que vous l'aimez, mon dieu, le python est joli!
Exemple d'exécution:
la source
T-SQL, 216 octets
J'ai passé pas mal de temps au cours des deux dernières nuits à créer minutieusement une fonction de séquence mathématique qui arrondirait correctement pour générer les codes ASCII appropriés pour les nombres à partir des codes ASCII alphabétiques. Il y avait un nombre ridicule de décimales dans les coefficients, mais cela a fonctionné.
Cependant, l'approche rationnelle de mattnewport fonctionne également en SQL, à un coût d'octets beaucoup plus bas, donc je suis sans vergogne abandonnant mes propres calculs en faveur des siens. Montez le voter, c'est une solution élégante!
Voilà le mien:
Cela utilise un CTE récursif pour créer une pile impromptue des caractères du numéro de téléphone et traduire les lettres à la volée, puis un peu de ruse SQL (SELECT @ p = @ p + columnValue) pour recomposer la chaîne du CTE sans nécessiter une autre construction de récursivité.
Sortie:
la source
Python 2.7,
6665L'original d'Anakata
Golfé plus loin
Je n'ai pas assez de réputation pour commenter la réponse de @ anakata, j'ai donc fait un post séparé ici. J'ai eu la même idée (en prenant le module d'ordonnance 3) mais je n'ai pas réussi à savoir comment imprimer les bons nombres pour s - z .
Quoi qu'il en soit, les améliorations que j'ai apportées au golf:
changé
raw_input
eninput
supprimé les
'\b'
parenthèses superflues et simplessupprimé le
+2
décalage et placé celui-ci dans la soustraction d'origine (97 - (3 * 2) = 91)Testé avec l'interpréteur Python 2.7.6. Suppose, selon les règles, une entrée de chaîne.
la source
PHP, 87
la source
q [38 caractères]
Inspiré par la solution de @ ace
Exemple
la source
XQuery, 71
BaseX a été utilisé comme processeur XQuery.
$i
est entrée.Pas la réponse la plus courte, mais assez courte et très lisible.
la source
Python, très non golfé
Comme tout le monde copie Ace, j'ai décidé de publier le code que j'ai inventé avant de soumettre la question:
la source
EcmaScript 6 (103 octets):
S'attend
i
à contenir la chaîne.Essayez-le dans n'importe quelle version récente de Firefox. Je n'ai pas essayé Google Chrome.
la source
Python 3, 121
la source
Haskell, 93C
Usage
la source
C # 140
la source
Python
la source
ECMASCRIPT, 101 (avec entrée)
Ajout d'une nouvelle ligne pour plus de clarté. 85 caractères si l'entrée est dans une variable.
la source
Perl, 54
Shoot, @RobHoare m'a toujours battu de 4 personnages. :)
la source
QBasic, 155
Ah, les souvenirs ...
Cela aurait dû être plus court, mais je testais avec repl.it , qui ne permet pas les
IF
instructions sur une seule ligne et se comporte étrangement si vous laissez la variable hors deNEXT i
. Il ne reconnaît pas non plus laASC
fonction, donc pour exécuter le code, vous devrez ajouter cette solution de contournement au début:(La deuxième fois que vous l'exécutez, l'interprète se plaindra à moins que vous ne supprimiez la
DECLARE FUNCTION
ligne, allez comprendre.)la source
R, 110
Exemple:
la source