Nous sommes tous habitués au clavier téléphonique de la vieille école, non? Pour référence, voici à quoi ça ressemble:
Étant donné une chaîne composée uniquement de lettres ASCII minuscules et d'espaces simples , votre tâche consiste à renvoyer le nombre d'appuis que vous devez effectuer afin de taper la chaîne complète avec un clavier téléphonique comme celui ci-dessus.
Pour ceux qui ne connaissent pas cela, voici comment cela fonctionne:
La clé avec le chiffre
2
, par exemple, a également la chaîneabc
écrite dessus. Pour tapera
, vous devez appuyer une fois sur cette touche, carb
vous devez appuyer deux fois etc
vous devez appuyer trois fois.Pour les lettres consécutives qui sont sur la même touche, vous devez attendre 1 seconde avant d'appuyer à nouveau. Donc, si vous voulez taper
cb
, vous devez appuyer 3 fois surc
, attendre une seconde puis appuyer deux fois surb
, donc toujours 5 taps.Il en va de même pour toutes les autres touches, à l'exception d'un seul espace, qui ne nécessite qu'une seule pression. Notez également que les clés
7
et9
ont quatre lettres sur eux. Le même algorithme est appliqué, la seule différence étant le nombre de lettres. Les chaînes correspondant à chaque clé se trouvent dans l'image ci-dessus (mais en minuscules), ou dans la liste suivante, qui contient tous les caractères que vous pourriez recevoir:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Cas de test
Entrée -> Sortie (explication) "" -> 0 (rien ne doit être tapé) "eau" -> 8 ("w, a, t" nécessitent chacun 1 robinet (sur les touches 9, 2 et 8), "e" nécessite 2 robinets (sur la touche 3), "r" nécessite 3 robinets (sur la touche 7 ), 1 + 1 + 1 + 2 + 3 = 8) "savon" -> 9 (4 + 3 + 1 + 1) "candela" -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) "code golf" -> 20 (3 + 3 + 1 + 2 + 1 (pour l'espace) + 1 + 3 + 3 + 3) "roi de la colline" -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Spécifications
Les règles d'E / S standard et les failles par défaut s'appliquent.
Vous ne pouvez prendre en entrée que le type de chaîne natif de votre langue. La sortie peut être soit un entier, soit une représentation sous forme de chaîne de cet entier.
C'est le code-golf , la réponse la plus courte dans toutes les langues l' emporte.
Réponses:
JavaScript (ES6)
77666460 octets(Enregistré quelques octets grâce à @Johan Karlsson et @Arnauld).
Afficher l'extrait de code
la source
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
pour 71 octetsf=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 octetsEssayez-le en ligne!
Explication
la source
Python 2 , 56 octets
Utilise le même algorithme que la solution Javascript de @ RickHitchcock
Essayez-le en ligne!
la source
'...'.find(c)
retourne-1
. En ajoutant 2, nous obtenons une pression sur une touche.-1
, mais je ne savais pas que vous aviez un+2
après le passe-partout ... Quoi qu'il en soit, la solution Python la plus courte de loin.Python 3 ,
69676564 octets1 octet merci à M. Xcoder.
1 octet merci à Felipe Nardi Batista.
Essayez-le en ligne!
la source
i==" "
pari<"a"
, car vous ne recevez que des lettres et des espacesDyalog APL, 37 octets
Essayez-le en ligne!
Comment?
Obtenez le
⍳
ndex de chaque caractère de l'entrée dans la chaîne'adgjmptw behknqux~cfilorvy~'
(s
etz
sera par défaut à 28), divisez par 9, arrondissez et additionnez.la source
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
pour enregistrer quelques octetsf←
, c'est donc 47 octetsJavaScript (ES6), 71 octets
Ne cherchez pas de tables à lettres! Je ne comprenais pas très bien la formule de @ LeakyNun alors j'ai trouvé la mienne.
la source
s=>[...s]
pourquoi pas seulements=>s.map()...
s
est une chaîne, vous ne pouvez donc pas lemap
faire directement....s
itère surs
, tandis que[...s]
convertit l'itération en un tableau, se divisant efficacements
en un tableau de caractères.C,
211196 octetsLa première soumission ici ... semble assez longue et je vois que ce n'est pas une approche efficace, mais au moins ça marche :)
Version non golfée:
la source
*(k+i)
peut êtrek[i]
.*
(par exemplechar*n
), et ajouter vos déclarations à votrefor
déclaration vide (au lieu queint s=0,j=0;(for(;
vous auriezfor(int s=0,k=0;
) et au lieu d'i==0
utiliser!i
s
dans la boucle for car je l'utilise plus tard, mais j'ai rassemblé lesint
déclarations et utilisé les assignemts là où j'en avais besoin.Haskell -
747162 octetsEdit: supprimé 3 octets en utilisant une compréhension de liste au lieu d'un filtre
Edit: économisez 9 octets grâce à Siracusa, Laikoni et Zgarb!
Usage
Essayez-le en ligne!
la source
f
àf=length.(=<<)(\x->x:[y|y<-l,y==x])
, où(=<<)
estconcatMap
ici.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
ne l' utilisez qu'une seule fois, il peut être inséré.Gelée , 25 octets
Essayez-le en ligne!
la source
Clojure,
8276 octetsOh , il est plus simple de
filter
etcount
que l' utilisationfrequencies
. Original:La chaîne encode combien de fois plus qu'une seule fois vous devez appuyer sur la touche d'un caractère donné :)
la source
Python 3 , 91 octets
Essayez-le en ligne!
la source
Python 3 , 60 octets
Probablement sous-optimal, car c'est mon premier golf en Python.
Essayez-le en ligne!
la source
Rétine ,
4636 octetsMerci à CalculatorFeline pour avoir économisé 6 octets.
Essayez-le en ligne!
la source
Java,
9573 octetsMerci à Kevin Cruijssen d'avoir fait de la fonction une expression lambda (où
a
est de typeString
). 95 octets sont devenus 73 octets!Une expression lambda résume le nombre de presse de chaque caractère utilisant
map()
.map()
convertit chaque caractère (ASCII dans la plage minuscule est 97-122) dans le flux à la valeur appropriée ( qui ressemble à simple , vague de scie, mais en prenant en compte les 4 cycles est ennuyeux) en utilisant ce calcul:1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Voici un graphique desmos de ce modèle.la source
interface Z{static void main(String a){System.out.print(a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum());}}
a->{return a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum();}
est autorisé. Et comme il s'agit d'une seule déclaration de retour,a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 octets ) serait votre réponse. En outre, voici un lien TryItOnline de votre réponse que vous voudrez peut-être ajouter à votre réponse. Encore une fois: bienvenue et bonne réponse. +1 de moi.f=
ni le premier point-virgule;
. Et vous n'avez pas non plus à ajouter le type du paramètre tant que vous mentionnez ce qu'est le type (donc au lieu de(String a)->
vous pouvez utilisera->
et mentionner que l'entréea
est unString
dans votre réponse). Oh, et des conseils pour jouer au golf en Java et des conseils pour jouer au golf dans <toutes les langues> pourraient être intéressants à lire, au cas où vous ne l'auriez pas encore fait.Mathematica, 83 octets
la source
a
manquant au début de"bc1..."
?)QBIC , 94 octets
Explication
la source
Bash ,
6968 octetsEssayez-le en ligne!
Plie un caractère par ligne, translitère chaque nouvelle ligne avec
+
, chaque espace avec1
et chaque lettre avec le nombre correspondant de poussées. bc fait la somme.la source
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C,
9288 octetsla source
s=n
pour remplacerreturn n
et combiners++;
avecc=*s
. Il pourrait être plus court de 9 octets.s=n
ne fonctionnerait pas, car ils
s'agit d'un local. Et*s=n
cela ne fonctionnerait pas car il n'y a que desCHAR_BIT
bits*s
, ce qui ne serait pas suffisant pour certains messages. Mais vous avez raisons++
. Merci.APL (Dyalog) , 36 octets
Essayez-le en ligne!
Trouve les mod-3 indices dans l'alphabet sans S et Z . Puisque l'espace, S et Z ne sont pas trouvés, ils "ont" un indice 25 (un de plus que l'indice max), ce qui est bon pour l'espace. Ensuite , nous avons juste besoin d'ajouter 3 pour chaque S ou Z .
{
fonction anonyme où l'argument est représenté par ⍵ :⎕A~'SZ'
l' alphabet majuscule A , sauf pour S et Z819⌶
minuscule⍵⍳⍨
les ɩ ndices de l'argument en ce que¯1+
ajouter un négatif3|
mod-31+
ajouter un (cela convertit tous les 0-mods en 3)(
…),
Ajouter:⍵∊'sz'
Booléen où l'argument est s ou z3×
multiplier par 3+/
sommela source
C (gcc) , 75
77octetsLa chaîne non imprimable
""
est une table de04 01 02 03 01 02 03 04
.Essayez-le en ligne!
la source
Pip ,
10090 octetsVérifiez chaque caractère de l'entrée pour une correspondance dans chaque élément de b. L'index de cette correspondance plus 1 est ajouté au total.
Essayez-le en ligne!
la source