Kita semua terbiasa dengan tombol telepon sekolah lama, kan? Untuk referensi, berikut ini tampilannya:
Diberikan String yang hanya terdiri dari huruf - huruf ASCII huruf kecil dan spasi tunggal , tugas Anda adalah mengembalikan jumlah ketukan yang harus dibuat untuk mengetikkan String penuh dengan keypad telepon seperti yang di atas.
Bagi mereka yang tidak terbiasa dengan ini, inilah cara kerjanya:
Kunci dengan digit
2
, misalnya, juga memiliki string yangabc
ditulis di atasnya. Untuk mengetika
, Anda harus menekan tombol ini sekali, karenab
Anda harus menekan dua kali dan untukc
Anda harus menekan tiga kali.Untuk huruf berurutan yang menggunakan tombol yang sama, Anda harus menunggu 1 detik sebelum menekan lagi. Jadi, jika Anda ingin mengetik
cb
, Anda harus menekan 3 kali untukc
, tunggu sebentar dan kemudian tekan dua kalib
, jadi masih 5 ketukan.Hal yang sama berlaku untuk semua tombol lain, kecuali untuk satu ruang, yang hanya membutuhkan 1 tekan. Perhatikan juga bahwa tombol
7
dan9
ada empat huruf di atasnya. Algoritma yang sama diterapkan, satu-satunya perbedaan adalah jumlah huruf. String yang terkait dengan setiap tombol dapat ditemukan pada gambar di atas (tetapi huruf kecil), atau dalam daftar berikut, yang berisi semua karakter yang mungkin Anda terima:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Uji Kasus
Input -> Output (Penjelasan) "" -> 0 (tidak ada yang disadap) "air" -> 8 ("w, a, t" masing-masing membutuhkan 1 keran (pada tombol 9, 2 dan 8), "e" memerlukan 2 keran (pada tombol 3), "r" membutuhkan 3 keran (pada tombol 7 ), 1 + 1 + 1 + 2 + 3 = 8) "sabun" -> 9 (4 + 3 + 1 + 1) "candela" -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) "kode golf" -> 20 (3 + 3 + 1 + 2 + 1 (untuk ruang) + 1 + 3 + 3 + 3) "raja bukit" -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Spesifikasi
Aturan I / O standar dan Celah Default berlaku.
Anda hanya dapat mengambil input dalam tipe String asli bahasa Anda. Output dapat berupa integer atau representasi string dari integer itu.
Ini adalah kode-golf , jawaban terpendek dalam setiap bahasa menang.
Jawaban:
JavaScript (ES6)
77666460 byte(Menyimpan beberapa byte berkat @Johan Karlsson dan @Arnauld).
Tampilkan cuplikan kode
sumber
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
untuk 71 bytef=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 byteCobalah online!
Penjelasan
sumber
Python 2 , 56 byte
Menggunakan algoritma yang sama dengan solusi Javascript @ RickHitchcock
Cobalah online!
sumber
'...'.find(c)
kembali-1
. Dengan menambahkan 2 kita mendapatkan satu penekanan tombol.-1
, tetapi tidak menyadari Anda memiliki+2
setelah boilerplate ... Pokoknya, solusi Python terpendek sejauh ini.Python 3 ,
69676564 byte1 byte terima kasih kepada Tn. Xcoder.
1 byte terima kasih kepada Felipe Nardi Batista.
Cobalah online!
sumber
i==" "
dengani<"a"
, karena Anda hanya menerima huruf dan spasiDyalog APL, 37 byte
Cobalah online!
Bagaimana?
Dapatkan
⍳
ndex dari setiap karakter input dalam string'adgjmptw behknqux~cfilorvy~'
(s
danz
akan default ke 28), bagi dengan 9, bulatkan dan jumlahkan.sumber
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
untuk menyimpan beberapa bytef←
sehingga itu adalah 47 byteJavaScript (ES6), 71 byte
Tidak terlihat meja surat! Saya tidak begitu mengerti formula @ LeakyNun jadi saya membuat sendiri.
sumber
s=>[...s]
dilakukan mengapa tidak adils=>s.map()...
s
adalah sebuah string, jadi Anda tidakmap
bisa langsung melakukannya....s
iterates overs
, sementara[...s]
mengubah iterasi menjadi array, secara efektif membelahs
menjadi array karakter.C,
211196 bytePengajuan pertama di sini ... terlihat cukup panjang dan saya melihat bahwa ini bukan pendekatan yang efisien, tetapi setidaknya berhasil :)
Versi tidak disatukan:
sumber
*(k+i)
bisak[i]
.*
(misalnyachar*n
), dan menambahkan deklarasi Anda kefor
pernyataan kosong Anda (bukanint s=0,j=0;(for(;
Anda akanfor(int s=0,k=0;
) dan bukannyai==0
menggunakan!i
s
ke dalam for loop karena saya menggunakannya nanti, tapi saya menempatkanint
deklarasi bersama dan menggunakan assignemts di mana saya membutuhkannya.Haskell -
747162 byteSunting: dihapus 3 byte dengan menggunakan pemahaman daftar alih-alih filter
Sunting: Hemat 9 byte berkat Siracusa, Laikoni dan Zgarb!
Pemakaian
Cobalah online!
sumber
f
kef=length.(=<<)(\x->x:[y|y<-l,y==x])
, di mana(=<<)
adalahconcatMap
di sini.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
hanya menggunakan sekali, itu bisa diuraikan.Jelly , 25 byte
Cobalah online!
sumber
Clojure,
8276 byteOh itu lebih sederhana untuk digunakan
filter
dancount
digunakanfrequencies
. Asli:String mengkodekan berapa kali lebih dari sekali Anda perlu menekan tombol untuk karakter yang diberikan :)
sumber
Python 3 , 91 byte
Cobalah online!
sumber
Python 3 , 60 byte
Mungkin kurang optimal, karena ini adalah golf pertama saya di Python.
Cobalah online!
sumber
Retina ,
4636 byteTerima kasih kepada CalculatorFeline untuk menghemat 6 byte.
Cobalah online!
sumber
Java,
9573 byteTerima kasih kepada Kevin Cruijssen karena membuat fungsi ekspresi lambda (di mana
a
tipenyaString
). 95 byte menjadi 73 byte!Ekspresi lambda merangkum jumlah pers dari setiap karakter menggunakan
map()
.map()
bertobat masing-masing karakter (ASCII di kisaran huruf kecil adalah 97-122) di sungai dengan nilai yang sesuai (terlihat seperti gelombang gergaji sederhana, namun dengan mempertimbangkan baik 4 siklus menjengkelkan) menggunakan matematika ini:1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Inilah grafik desmos dari model itu.sumber
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();}
ini diperbolehkan. Dan karena itu adalah pernyataan pengembalian tunggal,a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 byte ) akan menjadi jawaban Anda. Juga, di sini ada tautan TryItOnline dari jawaban Anda yang mungkin ingin Anda tambahkan ke jawaban Anda. Sekali lagi: selamat datang, dan jawaban yang bagus. +1 dari saya.f=
atau semi-colon terkemuka;
. Dan Anda juga tidak perlu menambahkan jenis parameter selama Anda menyebutkan apa jenisnya (jadi alih-alih(String a)->
Anda dapat menggunakana->
dan menyebutkan bahwa inputa
adalahString
jawaban Anda). Oh, dan Tip untuk bermain golf di Jawa dan Tips untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca, jika Anda belum.Mathematica, 83 byte
sumber
a
hilang pada awal"bc1..."
?)QBIC , 94 byte
Penjelasan
sumber
Bash ,
6968 byteCobalah online!
Lipat satu karakter per baris, transliterasikan setiap baris baru dengan
+
, setiap spasi dengan1
dan setiap huruf dengan jumlah push yang sesuai. bc melakukan penjumlahan.sumber
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C,
9288 bytesumber
s=n
untuk menggantireturn n
, dan menggabungkans++;
denganc=*s
. Itu bisa lebih pendek 9 byte.s=n
tidak akan berfungsi, karenas
ini adalah lokal. Dan*s=n
tidak akan berfungsi karena hanya adaCHAR_BIT
bit di*s
dalamnya, yang tidak akan cukup untuk beberapa pesan. Tapi Anda benar tentang itus++
. Terima kasih.APL (Dyalog) , 36 byte
Cobalah online!
Menemukan mod-3 indeks dalam alfabet tanpa S dan Z . Karena ruang, S , dan Z tidak ditemukan, mereka "memiliki" indeks 25 (satu lebih dari indeks maks), yang baik untuk ruang. Kemudian kita hanya perlu menambahkan 3 untuk masing-masing S atau Z .
{
fungsi anonim di mana argumen diwakili oleh ⍵ :⎕A~'SZ'
lfabet huruf besar A , kecuali untuk S dan Z819⌶
huruf kecil⍵⍳⍨
yang ɩ ndices argumen bahwa¯1+
tambahkan yang negatif3|
mod-31+
tambahkan satu (ini mengkonversi semua 0-mod ke 3)(
...),
tambahkan:⍵∊'sz'
Boolean di mana argumennya adalah s atau z3×
kalikan dengan 3+/
jumlahsumber
C (gcc) , 75
77byteString yang tidak dapat dicetak
""
adalah tabel dari04 01 02 03 01 02 03 04
.Cobalah online!
sumber
Pip ,
10090 bytePeriksa setiap karakter input untuk kecocokan di setiap elemen b. Indeks kecocokan itu ditambah 1 akan ditambahkan ke total.
Cobalah online!
sumber