Inspiré par le Google Code Challenge :
L'alphabet latin contient 26 caractères et les téléphones n'ont que dix chiffres sur le clavier. Nous aimerions faciliter l'écriture d'un message à votre ami en utilisant une séquence de touches pour indiquer les caractères souhaités. Les lettres sont mappées sur les chiffres comme indiqué ci-dessous. Pour insérer le caractère B par exemple, le programme doit appuyer sur 22. Afin d'insérer deux caractères en séquence à partir de la même touche, l'utilisateur doit faire une pause avant d'appuyer une deuxième fois sur la touche. Le caractère espace '' doit être imprimé pour indiquer une pause. Par exemple, 2 2 indique AA tandis que 22 indique B.
Chaque message sera composé uniquement de caractères minuscules az et d'espaces ''. Appuyer sur zéro émet un espace.
Votre défi consiste à écrire la plus petite fonction qui prend la chaîne d'entrée et renvoie la séquence de touches nécessaire pour produire l'entrée sous forme de chaîne ou la sortir vers stdout. La fonction qui a le moins d'octets gagne.
Exemple d'entrée / sortie
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Autres clarifications
- Les pauses ne doivent être ajoutées que lorsque cela est nécessaire et doivent être un espace ''.
- Chaque message sera composé uniquement de caractères minuscules az et d'espaces ''. Imprimez
0
pour signifier les espaces. - Pas de bibliothèques externes.
- Seule la chaîne d'entrée peut être transmise à votre fonction.
- Pour rendre d'autres langages compétitifs, la déclaration de fonction principale ne compte pas, pas plus que l'importation d'autres bibliothèques standard.
#include
s,import
s etusing
s ne comptent pas. Tout le reste fait. Cela inclut les fonctions#define
s et d'assistance. Voir la règle 2 dans cette question si vous êtes confus. - Plusieurs espaces peuvent être notés comme
00
ou0 0
puisque vous n'avez pas vraiment besoin de faire une pause entre un espace
{}
partie de la signature de la fonction? Par exemple, si mon code estfunction f(){alert('hi');}
, dois-je compter les caractères dealert('hi');
ou{alert('hi');}
?t9
fonctionne différemment: vous devez cliquer une fois sur chaque touche pour obtenir un mot.Réponses:
Rubis,
129122115111108107105Fait avec le golf ...
Oups, j'ai complètement oublié de supprimer les espaces inutiles - corrigé ...
Enregistrement de 2 caractères grâce à Peter Taylor.
Version en ligne
Explication:
l'espace est traduit au caractère avec l'ordinal 96
les caractères sont d'abord mappés sur une série de nombres: - a à 2 - b à 22 - d à 3222 - h à 444333222
une expression régulière correspond alors au premier groupe de chiffres égaux
le tableau est joint
tous les espaces dans les occurrences de "digit digit different_digit" sont supprimés
la source
6666
6 ne devrait jamais avoir besoin d'être pressé 4 fois de suite.\2
ce regex final? Assurément, le deuxième groupe est une affirmation de largeur nulle?REBEL -
154110103Cette «fonction» accepte les entrées de stdin et envoie les résultats à stdout.
Test s'exécute (vous n'avez donc pas besoin d'installer l'interpréteur):
la source
JavaScript (124)
Exécutez dans Firefox.
la source
GolfScript, 46 caractères
Comme d'habitude, lit l'entrée de stdin, imprime sur stdout. Voir la démo en ligne (avec entrée standard).
Notez que ce code repose sur une interprétation très stricte de la spécification d'entrée (uniquement les lettres minuscules et les espaces): en particulier, toute nouvelle ligne dans l'entrée la plantera! Ce problème peut être résolu, au prix de deux caractères supplémentaires, en ajoutant
n-
au code pour filtrer les nouvelles lignes.la source
C ++ - 365 caractères sans
int main(){}
Utilise le même raisonnement que ma réponse ici , en utilisant uniquement des
for
boucles pour sortir chaque lettre le nombre approprié de fois.la source
s[i]==32
place des[i]==' '
. La valeur ASCII de l'espace est de 32.Perl - 107
110Voici ma solution précédente dans 120
128 130 155:Tests:
la source
VBA
220253/258/219Sans compter les
Function
lignes ici:Avec
String
, 253 :Avec une
For
boucle 258 :Ajout de corrections pour la clé 7/9 (merci, Danny), qui a ajouté beaucoup de caractères.
Utilisation de
Choose
219 :Je ne voulais pas courir avec celui - ci, depuis est plus basique dans la fonctionnalité, mais il est le code plus court ...
la source
yes
devrait être999337777
. J'utilise10338
votre fonction.C,
165 163 153 149138 caractèresMa première tentative de golf de code, toutes les suggestions sont appréciées.
la source
C ++ -
170168160Golfé:
Non golfé
la source
C: 136 caractères
Et légèrement non golfé (oui, c'est comme ça que c'était écrit):
Je pourrais peut-être le réduire un peu en appliquant de la récursivité, de la magie noire et une bonne quantité de poudre de chili.
la source
Java - 243
Solution java assez naïve. Merci aux commentateurs pour leurs suggestions.
Correction d'un bug qui insérait parfois des espaces inutiles, par exemple pour l'entrée "hello worlds sup".
la source
java
. Pouvez-vous mettre cela dans votre titre, comme le font les autres réponses?t.length
par10
i
n'est utilisé que pour itérer à travers leString
, supprimez-le et faites une boucle foreach:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
àif(c==' ')o+='0';else{
et ajouter le approprié}
.CoffeeScript - 202 (210 - 8)
la source
APL, 77 caractères
Explication
2+⌊y←7.99,⍨.315×⍳25
ou, sans golf,y←(0.315×⍳25),7.99 ◇ 2+⌊y
échantillonne une ligne convenablement inclinée (y = 0,315 x) sur les points de 1 à 25; la ligne est inclinée de telle sorte que le plancher de ces valeurs y suit le motif répétitif 000111 ... 777 à l'exception du sixième groupe de chiffres 5555; un nombre est ajouté à la fin pour obtenir le quatrième 7, de sorte que le tableau final plus 2 est 22233344455566677778889999;⌈3.1×y-⌊y
amplifie la différence entre ces valeurs y et leurs étages, de sorte que les plafonds des différences donnent le motif 123123 ... avec un 4 sur les derniers chiffres des deux groupes de 4 chiffres;'0',⍨( ... )/¨⍕¨ ...
ou(( ... ) /¨ ⍕¨ ...),'0'
utilise le dernier résultat pour dupliquer les chiffres du premier, de sorte que la sortie soit le tableau de chaînes "2" "22" "222" "3" "33" "333" ... avec les bons "7777" et " 9999 "en place et un" 0 "ajouté à la fin;⍵⍳⍨⎕UCS 96+⍳26
ou(⎕UCS 96+⍳26)⍳⍵
calcule l'indice de chaque caractère d'entrée, où "a" est 1, "z" est 26 et l'espace (et tous les autres caractères) est 27;{ ... }/( ... )[ ... ]
prend le dernier résultat, l'index pour chaque caractère d'entrée, pour traduire chaque caractère dans la chaîne de chiffres respective, puis concatène les chaînes en utilisant la fonction entre accolades;{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
ou{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
ajoute chaque nouvelle chaîne ⍺ à l'accumulateur ⍵, en interposant un seul espace uniquement si les deux arguments commencent par le même caractère.Exemples
la source
Python
155150Je souhaite que je sois meilleur dans ce XD. Définition de fonction non comptée. Le premier niveau d'indentation est un espace, le deuxième est un onglet et le troisième 2 onglets.
la source
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
la source
R 224
Je suis sûr qu'il existe une meilleure façon de procéder, donc je vais continuer à y travailler.
la source