Wszyscy jesteśmy przyzwyczajeni do old-schoolowej klawiatury telefonu, prawda? W celach informacyjnych wygląda to tak:
Biorąc pod uwagę ciąg znaków składający się tylko z małych liter ASCII i pojedynczych spacji , Twoim zadaniem jest zwrócenie liczby naciśnięć, które należy wykonać, aby wpisać pełny ciąg za pomocą klawiatury telefonu, jak powyżej.
Dla tych, którzy nie są zaznajomieni z tym, oto jak to działa:
Na przykład klucz z cyfrą
2
ma równieżabc
zapisany ciąg znaków . Aby pisaća
, musisz nacisnąć ten klawisz jeden raz, ponieważb
musisz nacisnąć dwa razy, a takżec
trzy razy.W przypadku kolejnych liter tego samego klawisza należy odczekać 1 sekundę przed ponownym naciśnięciem. Tak więc, jeśli chcesz pisać
cb
, musisz nacisnąć 3 razyc
, poczekać sekundę, a następnie nacisnąć dwa razyb
, aby nadal 5 dotknięć.To samo dotyczy wszystkich pozostałych klawiszy, z wyjątkiem pojedynczej spacji, która wymaga tylko 1 naciśnięcia. Należy również pamiętać, że klucze
7
i9
mają na nich cztery litery. Zastosowano ten sam algorytm, a jedyną różnicą jest liczba liter. Ciągi odpowiadające każdemu kluczowi można znaleźć na obrazku powyżej (ale małymi literami) lub na poniższej liście, która zawiera wszystkie znaki, które możesz otrzymać:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Przypadki testowe
Wejście -> Wyjście (objaśnienie) „” -> 0 (nic nie należy stukać) „woda” -> 8 („w, a, t” każdy wymaga 1 dotknięcia (na klawiszach 9, 2 i 8), „e” wymaga 2 uderzeń (na klawiszu 3), „r” wymaga 3 uderzeń (na klawiszu 7 ), 1 + 1 + 1 + 2 + 3 = 8) „mydło” -> 9 (4 + 3 + 1 + 1) „candela” -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) „kod golfa” -> 20 (3 + 3 + 1 + 2 + 1 (dla miejsca) + 1 + 3 + 3 + 3) „król wzgórza” -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Okular
Obowiązują standardowe reguły we / wy i domyślne luki.
Możesz wprowadzać dane tylko w rodzimym typie łańcucha w swoim języku. Wyjściem może być liczba całkowita lub ciąg znaków reprezentujący tę liczbę całkowitą.
To jest golf golfowy , wygrywa najkrótsza odpowiedź w każdym języku .
Odpowiedzi:
JavaScript (ES6)
77666460 bajtów(Zapisano kilka bajtów dzięki @Johan Karlsson i @Arnauld).
Pokaż fragment kodu
źródło
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
dla 71 bajtówf=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 bajtówWypróbuj online!
Wyjaśnienie
źródło
Python 2 , 56 bajtów
Używa tego samego algorytmu, co rozwiązanie Javascript @ RickHitchcock
Wypróbuj online!
źródło
'...'.find(c)
zwraca-1
. Dodając 2, otrzymujemy jedno naciśnięcie klawisza.-1
, ale nie zdawałem sobie sprawy, że masz płytę+2
główną ... W każdym razie, najkrótsze rozwiązanie Pythona.Python 3 ,
69676564 bajtów1 bajt dzięki Mr. Xcoder.
1 bajt dzięki Felipe Nardi Batista.
Wypróbuj online!
źródło
i==" "
goi<"a"
, ponieważ otrzymujesz tylko litery i spacjeDyalog APL, 37 bajtów
Wypróbuj online!
W jaki sposób?
Uzyskaj
⍳
ndex każdego znaku wejściowego w ciągu'adgjmptw behknqux~cfilorvy~'
(s
iz
domyślnie wyniesie 28), podziel przez 9, zaokrąglij w górę i zsumuj.źródło
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
aby zapisać niektóre bajtyf←
więc jest 47 bajtówJavaScript (ES6), 71 bajtów
Nie szukaj tablic z literami! Nie do końca zrozumiałem formułę @ LeakyNun, więc wymyśliłem własną.
źródło
s=>[...s]
, dlaczego nie tylkos=>s.map()...
s
jest ciągiem, więc nie możeszmap
go bezpośrednio....s
iteruje sięs
, a[...s]
konwertuje iterację do tablicy, skutecznie dzieląc jąs
na tablicę znaków.DO,
211196 bajtówPierwsze zgłoszenie tutaj ... wygląda na dość długie i widzę, że nie jest to skuteczne podejście, ale przynajmniej działa :)
Wersja bez golfa:
źródło
*(k+i)
może byćk[i]
.*
(np.char*n
) I dodać swoje deklaracje do pustejfor
instrukcji (zamiastint s=0,j=0;(for(;
tegofor(int s=0,k=0;
) i zamiasti==0
używać!i
s
w pętli for, ponieważ używam go później, aleint
złożyłem deklaracje razem i użyłem przypisań tam, gdzie ich potrzebowałem.Haskell -
747162 bajtówEdycja: usunąłem 3 bajty, używając zrozumienia listy zamiast filtru
Edycja: Zaoszczędź 9 bajtów dzięki Siracusa, Laikoni i Zgarb!
Stosowanie
Wypróbuj online!
źródło
f
dof=length.(=<<)(\x->x:[y|y<-l,y==x])
, gdzie(=<<)
jestconcatMap
tutaj.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
tylko raz, można wstawić.Galaretka , 25 bajtów
Wypróbuj online!
źródło
Clojure,
8276 bajtówOch, jest prostszy w użyciu
filter
icount
niż w użyciufrequencies
. Oryginalny:Ciąg koduje, ile razy więcej niż raz trzeba nacisnąć klawisz dla danego znaku :)
źródło
Python 3 , 91 bajtów
Wypróbuj online!
źródło
Python 3 , 60 bajtów
Prawdopodobnie nieoptymalny, ponieważ jest to mój pierwszy golf w Pythonie.
Wypróbuj online!
źródło
Siatkówka ,
4636 bajtówDzięki CalculatorFeline za oszczędność 6 bajtów.
Wypróbuj online!
źródło
Java,
9573 bajtówPodziękowania dla Kevina Cruijssena za uczynienie tej funkcji wyrażeniem lambda (gdzie
a
jest typuString
). 95 bajtów stało się 73 bajtami!Wyrażenie lambda podsumowuje liczbę naciśnięć każdego użytego znaku
map()
.map()
konwertuje każdy znak (ASCII w dolnym zakresie sprawa jest 97-122) w strumieniu na odpowiednią wartość (wygląda jak prosty fali piły, ale biorąc pod uwagę zarówno 4 cykle to denerwujące) za pomocą tej matematyki:1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Oto wykres desmos tego modelu.źródło
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();}
jest dozwolone. A ponieważ jest to pojedyncza instrukcja zwracająca,a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 bajty ) byłaby twoją odpowiedzią. Oto link TryItOnline do odpowiedzi, którą możesz chcieć dodać do swojej odpowiedzi. Ponownie: witamy i miła odpowiedź. +1 ode mnief=
ani wiodącego średnika;
. Nie musisz także dodawać typu parametru, o ile wspominasz, jaki jest typ (więc zamiast tego(String a)->
możesz użyća->
i wspomnieć, że dane wejściowea
sąString
w odpowiedzi). Aha, i porady dotyczące gry w golfa w Javie oraz porady dotyczące gry w golfa w <wszystkich językach> mogą być interesujące do przeczytania, na wypadek gdybyś jeszcze tego nie zrobił.Mathematica, 83 bajty
źródło
a
brakuje na początku"bc1..."
?)QBIC , 94 bajty
Wyjaśnienie
źródło
Bash ,
6968 bajtówWypróbuj online!
Składa jeden znak w wierszu, transliteruje każdą nową linię,
+
każdą spację1
i każdą literę z odpowiednią liczbą naciśnięć. bc robi sumę.źródło
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C,
9288 bajtówźródło
s=n
do zastąpieniareturn n
i połączenias++;
zc=*s
. Może być o 9 bajtów krótszy.s=n
nie działa, ponieważs
jest to lokalny. I*s=n
nie zadziałałoby, ponieważ są tylkoCHAR_BIT
bity*s
, co nie wystarczyłoby dla niektórych wiadomości. Ale masz rację co dos++
. Dzięki.APL (Dyalog) , 36 bajtów
Wypróbuj online!
Znajdzie mod-3 wskaźniki alfabetu bez S i Z . Ponieważ nie znaleziono spacji, S i Z , mają one „indeks” 25 (jeden więcej niż indeks maksymalny), co jest dobre dla spacji. Następnie wystarczy dodać 3 dla każdego S lub Z .
{
funkcja anonimowa, w której argument jest reprezentowany przez ⍵ :⎕A~'SZ'
wielkie litery lphabet wyjątkiem S i Z.819⌶
małe litery⍵⍳⍨
z ɩ ndices z argumentem, że¯1+
dodaj jeden negatywny3|
mod-31+
dodaj jeden (konwertuje wszystkie 0-mody do 3)(
…),
Poprzedzają:⍵∊'sz'
Boolean, gdzie argument to s lub z3×
pomnóż przez 3+/
sumaźródło
C (gcc) , 75
77bajtyCiąg niedrukowalny
""
to tabela04 01 02 03 01 02 03 04
.Wypróbuj online!
źródło
Pip ,
10090 bajtówSprawdź, czy każdy znak wejściowy jest zgodny w każdym elemencie b. Indeks tego meczu plus 1 zostaje dodany do sumy.
Wypróbuj online!
źródło