Wir sind alle an die alte Telefontastatur gewöhnt, oder? Als Referenz sehen Sie hier, wie es aussieht:
Bei einer Zeichenfolge, die nur aus ASCII-Kleinbuchstaben und einzelnen Leerzeichen besteht , müssen Sie die Anzahl der Abgriffe zurückgeben, die erforderlich sind, um die gesamte Zeichenfolge mit einer Telefontastatur wie der oben angegebenen abzutippen.
Für diejenigen, die damit nicht vertraut sind, ist hier, wie es funktioniert:
Auf dem Schlüssel mit der Ziffer
2
ist beispielsweise auch die Zeichenfolgeabc
geschrieben. Um zu tippena
, müssen Sie diese Taste einmal drücken, dennb
Sie müssen zweimal drücken undc
Sie müssen dreimal drücken.Bei aufeinanderfolgenden Buchstaben, die sich auf derselben Taste befinden, müssen Sie eine Sekunde warten, bevor Sie erneut drücken. Wenn Sie also tippen möchten
cb
, müssen Sie 3 Mal drückenc
, eine Sekunde warten und dann zweimal drückenb
, sodass Sie immer noch 5 Mal tippen müssen .Gleiches gilt für alle anderen Tasten, mit Ausnahme einer einzelnen Leerstelle, für die nur ein Tastendruck erforderlich ist. Beachten Sie auch, dass die Tasten
7
und9
vier Buchstaben haben. Es wird derselbe Algorithmus angewendet, der einzige Unterschied besteht in der Anzahl der Buchstaben. Die Zeichenfolgen für die einzelnen Tasten finden Sie in der Abbildung oben (jedoch in Kleinbuchstaben) oder in der folgenden Liste, die alle Zeichen enthält, die Sie möglicherweise erhalten:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Testfälle
Eingabe -> Ausgabe (Erläuterung) "" -> 0 (nichts sollte getippt werden) "Wasser" -> 8 ("w, a, t" erfordern jeweils 1 Tippen (auf die Tasten 9, 2 und 8), "e" erfordern 2 Tippen (auf die Taste 3), "r" erfordern 3 Tippen (auf die Taste 7) ), 1 + 1 + 1 + 2 + 3 = 8) "Seife" -> 9 (4 + 3 + 1 + 1) "candela" -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) "Code Golf" -> 20 (3 + 3 + 1 + 2 + 1 (für das Leerzeichen) + 1 + 3 + 3 + 3) "König des Hügels" -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Technische Daten
Es gelten Standard-E / A-Regeln und Standard-Regelungslücken.
Sie können nur Eingaben in den systemeigenen String-Typ Ihrer Sprache vornehmen. Die Ausgabe kann entweder eine Ganzzahl oder eine Zeichenfolgendarstellung dieser Ganzzahl sein.
Dies ist Code-Golf , die kürzeste Antwort in jeder Sprache gewinnt.
Antworten:
JavaScript (ES6)
77666460 Bytes(Sparte einige Bytes dank @Johan Karlsson und @Arnauld).
Code-Snippet anzeigen
quelle
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
für 71 Bytesf=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 BytesProbieren Sie es online!
Erläuterung
quelle
Python 2 , 56 Bytes
Verwendet den gleichen Algorithmus wie die JavaScript-Lösung von @ RickHitchcock
Probieren Sie es online!
quelle
'...'.find(c)
zurückkehrt-1
. Durch Hinzufügen von 2 erhalten wir einen Tastendruck.-1
, wusste aber nicht, dass Sie eine+2
nach dem Boilerplate haben ... Jedenfalls die mit Abstand kürzeste Python-Lösung.Python 3 ,
69676564 Bytes1 Byte danke an Herrn Xcoder.
1 Byte danke an Felipe Nardi Batista.
Probieren Sie es online!
quelle
i==" "
miti<"a"
, weil Sie nur Buchstaben und Leerzeichen erhaltenDyalog APL, 37 Bytes
Probieren Sie es online!
Wie?
Holen Sie sich das
⍳
ndex jedes Zeichen der Eingabe in der Zeichenfolge'adgjmptw behknqux~cfilorvy~'
(s
undz
wird standardmäßig bis 28), Division durch 9, rund und Summe.quelle
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
, um einige Bytes zu speichernf←
, es sind also 47 BytesJavaScript (ES6), 71 Byte
Schau mal keine Buchstabentabellen! Ich habe die Formel von @ LeakyNun nicht ganz verstanden und bin auf meine eigene gekommen.
quelle
s=>[...s]
warum nicht einfachs=>s.map()...
s
ist eine Zeichenfolge, Sie können es also nichtmap
direkt....s
iterierts
, während[...s]
die Iteration in ein Array konvertiert und effektivs
in ein Array von Zeichen aufgeteilt wird.C,
211196 BytesErste Einreichung hier ... sieht ziemlich lang aus und ich sehe, dass dies kein effizienter Ansatz ist, aber zumindest funktioniert es :)
Ungolfed-Version:
quelle
*(k+i)
kann seink[i]
.*
(z. B.char*n
) ausschneiden und Ihre Deklarationen zu Ihrer leerenfor
Anweisung hinzufügen (anstattint s=0,j=0;(for(;
Sie zu habenfor(int s=0,k=0;
) und stattdesseni==0
verwenden!i
s
in die for-Schleifeint
schreiben, weil ich sie später benutze, aber ich habe die Deklarationen zusammengestellt und Zuweisungen dort verwendet, wo ich sie brauchte.Haskell -
747162 BytesBearbeiten: 3 Bytes wurden entfernt, indem ein Listenverständnis anstelle eines Filters verwendet wurde
Edit: Sparen Sie 9 Bytes dank Siracusa, Laikoni und Zgarb!
Verwendung
Probieren Sie es online!
quelle
f
zuf=length.(=<<)(\x->x:[y|y<-l,y==x])
, wo(=<<)
istconcatMap
hier.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
nur einmal verwenden, kann es inline gesetzt werden.Gelee , 25 Bytes
Probieren Sie es online!
quelle
Clojure,
82-76BytesOh, es ist einfacher
filter
und einfacher zucount
bedienenfrequencies
. Original:Die Zeichenfolge kodiert, wie oft Sie die Taste für ein bestimmtes Zeichen mehrmals drücken müssen :)
quelle
Python 3 , 91 Bytes
Probieren Sie es online!
quelle
Python 3 , 60 Bytes
Wahrscheinlich suboptimal, da dies mein erster Golf in Python ist.
Probieren Sie es online!
quelle
Netzhaut ,
4636 BytesDank CalculatorFeline für das Speichern von 6 Bytes.
Probieren Sie es online!
quelle
Java,
9573 BytesVielen Dank an Kevin Cruijssen, der die Funktion zu einem Lambda - Ausdruck gemacht hat (wobei
a
es sich um einen Typ handelt)String
). 95 Bytes wurden 73 Bytes!Ein Lambda-Ausdruck summiert die Pressezahl jedes Zeichens mit
map()
.map()
konvertiert jedes Zeichen (ASCII in Kleinbuchstaben 97-122) im Stream in den entsprechenden Wert (sieht aus wie eine einfache Sägewelle, berücksichtigt aber beide 4 Zyklen, ist das ärgerlich)1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Hier ist ein Desmos-Diagramm dieses Modells.quelle
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();}
ist erlaubt. Und da es sich um eine einzelne return-Anweisung handelt, wärea->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 Byte ) Ihre Antwort. Hier ist auch ein TryItOnline-Link zu Ihrer Antwort, den Sie möglicherweise zu Ihrer Antwort hinzufügen möchten. Nochmals: Willkommen und nette Antwort. +1 von mir.f=
noch das führende Semikolon;
. Außerdem müssen Sie den Typ des Parameters nicht hinzufügen, solange Sie den Typ angeben (stattdessen(String a)->
können Sie aucha->
angeben, dass die Eingabea
einString
in Ihrer Antwort ist). Oh, und Tipps für den Golfsport in Java und Tipps für die in <alle Sprachen> Golf spielen könnten interessant sein zu lesen, falls Sie noch nicht haben.Mathematica, 83 Bytes
quelle
a
zu Beginn auch etwas vermisst"bc1..."
?)QBIC , 94 Bytes
Erläuterung
quelle
Bash ,
6968 BytesProbieren Sie es online!
Faltet ein Zeichen pro Zeile, transkribiert jede neue Zeile mit
+
, jedes Leerzeichen mit1
und jeden Buchstaben mit der entsprechenden Anzahl von Anschlägen. bc macht die Summe.quelle
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C
9288 Bytesquelle
s=n
zu ersetzenreturn n
, und verbindens++;
mitc=*s
. Es könnte 9 Bytes kürzer sein.s=n
würde nicht funktionieren, das
es ein lokaler ist. Und*s=n
würde nicht funktionieren, da nurCHAR_BIT
Bits enthalten sind*s
, die für einige Nachrichten nicht ausreichen. Aber Sie haben Recht mit dems++
. Vielen Dank.APL (Dyalog) , 36 Bytes
Probieren Sie es online!
Findet den mod-3 - Indizes im Alphabet ohne S und Z . Da Leerzeichen, S und Z nicht gefunden werden, haben sie den Index 25 (einen mehr als den Maximalindex), was für Leerzeichen gut ist. Dann müssen wir nur noch 3 für jedes S oder Z addieren .
{
anonyme Funktion, bei der das Argument durch ⍵ dargestellt wird :⎕A~'SZ'
der Großbuchstabe A lphabet mit Ausnahme von S und Z819⌶
Kleinbuchstaben⍵⍳⍨
die Gründe des Arguments darin¯1+
Fügen Sie ein negatives hinzu3|
mod-31+
addiere einen (dies wandelt alle 0-Mods in 3 um)(
…),
Voranstellen:⍵∊'sz'
Boolescher Wert, bei dem das Argument entweder s oder z ist3×
multiplizieren mit 3+/
Summequelle
C (gcc) , 75
77BytesDie nicht druckbare Zeichenfolge
""
ist eine Tabelle von04 01 02 03 01 02 03 04
.Probieren Sie es online!
quelle
Pip ,
100 bis90 BytesÜberprüfen Sie jedes Zeichen der Eingabe auf eine Übereinstimmung in jedem Element von b. Der Index dieser Übereinstimmung plus 1 wird zur Gesamtsumme hinzugefügt.
Probieren Sie es online!
quelle