Di masa kakek nenek Anda, menekan nomor telepon dilakukan dengan tombol putar seperti ini:
Untuk memutar setiap digit, letakkan jari Anda di lubang yang sesuai, tarik ke berhenti jari, dan lepaskan. Suatu mekanisme akan menyebabkan putaran memutar kembali ke posisi istirahatnya, dan telepon akan memutus dan menyambungkan kembali sirkuit beberapa kali, membuat klik terdengar.
Memanggil angka N membutuhkan N "pulsa" seperti itu, kecuali untuk N = 0 yang sepuluh pulsa.
Ponsel rotary memiliki properti yang membutuhkan digit besar (8, 9, 0) lebih lama untuk dial daripada digit kecil (1, 2, 3). Ini adalah pertimbangan penting dalam menyusun peta kode area awal, dan mengapa Kota New York dengan kepadatan populasi (dan saluran telepon) yang padat mendapat 212 (hanya 5 pulsa), sementara 907 (26 pulsa) pergi ke Alaska yang jarang dihuni. Tentu saja, semua ini menjadi tidak relevan ketika panggilan nada sentuh menjadi populer.
Tantangan
Tulis, sesedikit mungkin byte, suatu program atau fungsi yang mengambil input string (atau urutan karakter) yang berisi nomor telepon, dan mengeluarkan jumlah pulsa putaran dial. Ini harus dihitung sebagai berikut:
Digit
- Digit 1-9 dihitung sebagai jumlah pulsa.
- Digit 0 dihitung sebagai 10 pulsa.
Surat
Perhatikan bahwa angka 2-9 pada dial memiliki huruf-huruf alfabet Latin yang terkait dengannya. Ini awalnya dimaksudkan untuk pertukaran bernama , tetapi yang terakhir disesuaikan untuk kata sandi , dan untuk sistem input pesan teks.
Anda harus mendukung memiliki surat di nomor telepon Anda, menggunakan penugasan huruf E.161 untuk digit:
- A, B, C = 2
- D, E, F = 3
- G, H, I = 4
- J, K, L = 5
- M, N, O = 6
- P, Q, R, S = 7
- T, U, V = 8
- W, X, Y, Z = 9
Anda dapat berasumsi bahwa input telah dilipat dengan huruf besar-kecil, menjadi huruf besar atau kecil.
Karakter lainnya
Anda harus mengizinkan penggunaan karakter ()+-./
dan spasi secara sewenang-wenang sebagai pemformat pemisah. Anda dapat memilih untuk mengizinkan karakter non-alfanumerik apa pun untuk tujuan ini, jika lebih mudah diterapkan.
Karakter-karakter ini tidak berkontribusi pada jumlah pulsa.
Kode contoh
Tabel pencarian dan fungsi non-golf dengan Python:
PULSES = {
'1': 1,
'2': 2, 'A': 2, 'B': 2, 'C': 2,
'3': 3, 'D': 3, 'E': 3, 'F': 3,
'4': 4, 'G': 4, 'H': 4, 'I': 4,
'5': 5, 'J': 5, 'K': 5, 'L': 5,
'6': 6, 'M': 6, 'N': 6, 'O': 6,
'7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
'8': 8, 'T': 8, 'U': 8, 'V': 8,
'9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
'0': 10
}
def pulse_count(phone_num):
return sum(PULSES.get(digit, 0) for digit in phone_num)
Contoh input dan output
911
→ 11867-5309
→ 48713 555 0123
→ 42+1 (212) PE6-5000
→ 571-800-FLOWERS
→ 69PUZZLES
→ 48
+- ()*#.
) seperti halnya huruf dibatasi untuk huruf besar. Koreksi saya jika saya salah.*
dan#
, yang memiliki arti khusus pada telepon nada-sentuh dan tidak dapat diputar pada rotari.Jawaban:
05AB1E ,
19181715 byteCobalah online!
Ini adalah jawaban pertama untuk menggunakan π. Mengapa menggunakan π, Anda mungkin bertanya? Nah, surat-surat tersebut dikaitkan dengan 22233344455566677778889999, secara berurutan. Perhatikan bagaimana sebagian besar digit berulang 3 kali, tetapi 7 berulang 4 kali. Anda bisa mengatakan bahwa setiap digit berulang (3 + 1/7) kali, rata-rata. Saya ingin tahu apakah ada angka yang kira-kira 3 + 1/7 dan membutuhkan lebih sedikit byte dari 22/7 ...
Ini hanya memberikan 4 7s, bukan 49s, jadi kita masih perlu menangani Z sebagai kasus khusus.
sumber
"abcdefghijklmnopqrstuvwxyz"
, tetapi tidak untuk"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. Saya bisa mengubah alfabet menjadi huruf besar daripada mengubah input menjadi huruf kecil, tapi itu bytecount yang sama.C # (Visual C # Interactive Compiler) , 51 byte
Disimpan 1 byte berkat @recursive
Disimpan 10 byte berkat pengamatan @ ExpiredData yang hanya
() +-/.
akan di inputCobalah online!
sumber
-10
adalah~9
, yang harus bekerja dalam konteks.APL (Dyalog Unicode) , 27 byte SBCS
Fungsi awalan diam-diam anonim.
Cobalah online!
(
...)∘⍳
Temukan ɩ ndex * dari setiap karakter dalam string berikut:* elemen yang tidak ditemukan, dapatkan indeks 1 + indeks maksimum, yaitu 11
⎕D
digit:"0123456789"
1⌽
putar secara siklis satu langkah ke kiri;"1234567890"
11|
sisa pembagian ketika dibagi 11 ** ini memberikan 0 untuk semua non-digit
...
+
tambahkan itu sebagai berikut:'@ADGJMPTW'∘⍸
yang ɩ nterval ɩ ndex * untuk setiap karakter* Jadi [-∞, "@") memberikan 0, [ "@", "A") memberikan 1, [ "A", "D") memberikan 2, dll
+/
jumlah yangsumber
Python 2 , 74 byte
Cobalah online!
Apakah beberapa aritmatika pada nilai ASCII untuk setiap karakter. Opsi pertama memeriksa huruf dan opsi kedua memeriksa angka. Klarifikasi bahwa semua karakter tanda baca yang diizinkan dalam input adalah yang dengan nilai ASCII kurang dari 48 izinkan saya menyederhanakan logika, tetapi metode baru sama sekali sekarang mungkin lebih baik.
Python 2 , 84 byte
Cobalah online!
Menggunakan string pencarian hardcoded, dengan masing-masing blok 5 karakter sesuai dengan karakter yang memberikan nilai masing-masing dimulai dengan 1. Ruang kosong diisi dengan
x
, yang tidak bisa di input yang dikapitalisasi. Kebetulan, karakter yang tidak muncul dalam string menghasilkan-1
untuk.find
yang memberikan puncak nol.sumber
JavaScript (Node.js) , ...
7669 byteCobalah online!
-7 terima kasih @Arnauld!
Penjelasan
Semua
[space]().+-/
tidak ditangkap oleh/\w/g
, sehingga tidak akan memengaruhi total.sumber
Perl 5
-p
,5251 byte@ Grimy mendapat kredit sebesar -1
Cobalah online!
sumber
/\d/g
seharusnya/./g
untuk -1 (ya itu masih menangani tanda baca dengan benar).J , 39 byte
Cobalah online!
Sebuah port dari solusi APL Adám
sumber
Retina 0.8.2 , 34 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Ubah huruf
WTPMJGDA
menjadi digit9..0
.Kocok semua huruf yang tersisa sebanyak 1 dan ulangi sampai semua huruf dikonversi menjadi angka.
Ganti
0
dengan55
karena mereka mengambil jumlah pulsa yang sama untuk melakukan panggilan.Ambil jumlah digital.
sumber
K4 , 44 byte
Larutan:
Contoh:
Penjelasan:
Pendekatan naif, kemungkinan cukup golf. Indeks pencarian karakter, skor pencarian, jumlah.
sumber
Perl 6 , 53 byte
Cobalah online!
Mengalikan kode ASCII dengan 0,313 bukannya 1/3 dan menggunakan bitwise OR yang membulatkan ke nol untuk mendapatkan bias yang benar .
sumber
C (gcc) ,
94898680 byteTerima kasih kepada ceilingcat, nwellnhof dan Rogem untuk sarannya.
Cobalah online!
sumber
c<43U
alih-alihc-17<26U
Pesta , 256 byte
Anda dapat mengganti
(( … ))
konstruksi denganlet
untuk jumlah byte yang identik. Mungkin ada algoritma yang bagus untuk mengurangi pernyataan kasus tetapi tidak menemukannya sejauh ini. Dengan sedikit pengerjaan ulang Anda bisa membuatnya berfungsi juga (tetapi tidak dalam byte yang sama atau kurang kecuali Anda dapat diskon bagianfunction fname { … }
atas dan ekor).Cobalah online!
Solusi yang lebih baik menggunakan teknik karakter peta menggunakan
tr
alat:[Bash with tr], 173 byte
Cobalah online!
sumber
while((${#p}))
berfungsi, menghemat tiga byte.c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;
menyimpan 16. lainnya. Dengantr -dc 0-9
ditambahkan ke tr pipa Anda tidak perlu pernyataan kasus sama sekali dan penambahan dapat dilipat ke dalamwhile
kondisi dengan&&
.read p;p=$(echo $p|tr A-Z 22233344455566677778889999|tr -dc [0-9]);while ((${#p}));do c=${p:0:1}&&((d+=c?c:10));p=${p#?};done;echo $d
p=$(head -1|tr A-Z 22233344455566677778889|tr -dc 0-9);while((${#p}));do((d+=(c=${p:0:1})?c:10));p=${p#?};done;echo $d
.. tiga 9 terakhir tidak diperlukan karena tr akan menggunakan kembali karakter pengganti terakhir jika argumen kedua terlalu pendek.read p;while((${#p}>0));do case ${p:0:1} in ([1-9])((d+=${p:0:1}));;([0])((d+=10));;([ABC)((d+=2));;([P-S])((d+=7));;([W-Z])((d+=9));;([DEF])((d+=3));;([GHI])((d+=4));;([JKL])((d+=5));;([MNO])((d+=6));;(?)d=$d;esac;p=${p#?};done;echo $d
Jelly ,
3324 byteCobalah online!
Tautan monadik yang menggunakan string sebagai argumennya dan mengembalikan jumlah pulsa. Ditulis ulang terinspirasi oleh jawaban 05AB1E @ Grimy jadi pastikan untuk mengungguli mereka!
sumber
PowerShell ,
10910287 byteCobalah online!
EDIT: Digunakan ide @ mazzy untuk switch regex dengan beberapa pemformatan string untuk melemparkan char -> int -> string dan hanya ambil 'digit' pertama
Asli:
Saya berharap mendapatkan <100 byte, jadi saya akan terus melihatnya untuk melihat apakah ada hal lain yang bisa saya lakukan. Mungkin ada cara untuk menghapus string angka
Maaf jika ini membingungkan karena saya membuat array dengan pernyataan pengindeksan boolean tetapi -
Penjelasan:
[char[]]"$args"|%{
membaca input yang dilemparkan sebagai string dan kemudian meledak ke array char dan memulai untuk-setiap loop dengan memeriksa()[$_-gt47]
untuk melihat apakah ada()+-./
yang dimasukkan (semua memiliki nilai karakter ascii <48)Catatan: Powershell menerima
$true
dan$false
sebagai1
dan0
masing-masing untuk indeks arrayKemudian kita dapatkan
48
simbolnya, atau:('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]
The
[$_-lt64]
memeriksa nomor atau huruf (seluruh modal diasumsikan di sini). Jika sebuah huruf,'22233344455566677778889999'[$_-65]
ubahlah menjadi 0-25 untuk mengindeks ke dalam array dan output nilai pulsa (sebagai char) Jika karakternya angka, kita melihat:(58,$_)[$_-ne48]
memeriksa0
dan mengeluarkan58
atau hanya karakter numerik itu sendiri.Sekitar semuanya
$a+= ... -=48
menginisialisasi variabel numerik $ a at0
dan kemudian menambahkan output. Outputnya adalah nilai karakter ascii dari suatu angka, jadi kurangi48
.Catatan: jika input adalah simbol, kita dapat
$a+=48-48
, secara efektif mengabaikannya. Jika ya0
, kita dapatkan$a+=58-48
mendapatkan +10 kitaTerakhir,
;$a
cukup tampilkan nilai akhir kami untuk setiap loopsumber
=
di sana, tersisa dari metode saya sebelumnya untuk menyelesaikan ini, terima kasih atas tangkapannya! Padahal, saya belum pernah melihatt*y
sebelumnya, dapatkah Anda menjelaskan mengapa itu berhasil meledakkan string menjadi array karakter?-f
dan[0]
.PowerShell ,
958579 byteterinspirasi oleh jawaban nwellnhof .
terinspirasi
[0]
dari jawaban Sinusoid .Cobalah online!
Versi belum dibuka:
sumber
Stax , 21 byte
Jalankan dan debug itu
sumber
Kotlin , 113 byte
Cobalah online!
sumber
Python 3 ,
134123 byteCobalah online!
-11 byte terima kasih kepada @ dan04
sumber
'ADGJMPTWBEHKNQUXCFILNRVYSZ'
, Anda dapat mengurangi string angka menjadi'23456789'*3+'79'
.