Terinspirasi oleh Tantangan Kode Google :
Alfabet Latin berisi 26 karakter dan telepon hanya memiliki sepuluh digit pada tombol. Kami ingin membuatnya lebih mudah untuk menulis pesan kepada teman Anda menggunakan urutan penekanan tombol untuk menunjukkan karakter yang diinginkan. Huruf-huruf dipetakan ke digit seperti yang ditunjukkan di bawah ini. Misalnya, untuk memasukkan karakter B, program akan menekan 22. Untuk memasukkan dua karakter secara berurutan dari tombol yang sama, pengguna harus berhenti sebelum menekan tombol untuk kedua kalinya. Karakter spasi '' harus dicetak untuk menunjukkan jeda. Sebagai contoh, 2 2 menunjukkan AA sedangkan 22 menunjukkan B.
Setiap pesan hanya akan terdiri dari huruf kecil az dan karakter spasi ''. Menekan nol memancarkan spasi.
Tantangan Anda adalah menulis fungsi terkecil yang mengambil string input, dan mengembalikan urutan penekanan tombol yang diperlukan untuk menghasilkan input sebagai string atau output ke stdout. Fungsi yang merupakan jumlah byte terkecil yang menang.
Contoh Input / Output
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Klarifikasi lainnya
- Jeda harus hanya ditambahkan bila perlu dan harus menjadi ruang ''.
- Setiap pesan hanya akan terdiri dari huruf kecil az dan karakter spasi ''. Cetak
0
untuk menandakan ruang. - Tidak ada perpustakaan eksternal.
- Hanya string input yang dapat diteruskan ke fungsi Anda.
- Untuk membuat bahasa lain menjadi kompetitif, deklarasi fungsi utama tidak masuk hitungan, dan juga tidak mengimpor perpustakaan standar lainnya.
#include
s,import
s, danusing
s tidak masuk hitungan. Yang lainnya tidak. Ini termasuk#define
fungsi s dan helper. Lihat aturan 2 dalam pertanyaan ini jika Anda bingung. - Beberapa spasi dapat dilambangkan sebagai
00
atau0 0
karena Anda tidak benar-benar harus berhenti di antara spasi
{}
bagian dari tanda tangan fungsi? Misalnya, jika kode saya adalahfunction f(){alert('hi');}
, apakah saya harus menghitung karakteralert('hi');
atau{alert('hi');}
?t9
bekerja berbeda: Anda harus mengklik setiap tombol sekali untuk mendapatkan kata.Jawaban:
Rubi,
129122115111108107105Selesai dengan bermain golf ...
Ups, benar-benar lupa menghapus spasi yang tidak perlu - diperbaiki ...
Menyimpan 2 karakter berkat Peter Taylor.
Versi online
Penjelasan:
ruang diterjemahkan ke char dengan ordinal 96
karakter pertama kali dipetakan ke serangkaian angka: - a ke 2 - b ke 22 - d ke 3222 - h ke 444333222
ekspresi regex kemudian cocok dengan grup pertama dengan angka yang sama
array bergabung
semua spasi dalam kejadian "digit space different_digit" dihapus
sumber
6666
6 seharusnya tidak perlu ditekan 4 kali berturut-turut.\2
regex terakhir itu? Tentunya kelompok kedua adalah pernyataan nol-lebar?REBEL -
154110103'Fungsi' ini menerima input dari stdin dan mengirimkan hasilnya ke stdout.
Tes berjalan (jadi Anda tidak harus menginstal penerjemah):
sumber
JavaScript (124)
Jalankan di Firefox.
sumber
GolfScript, 46 karakter
Seperti biasa, membaca input dari stdin, mencetak ke stdout. Lihat demo online (dengan input kalengan).
Perhatikan bahwa kode ini bergantung pada interpretasi spesifikasi input yang sangat ketat (hanya huruf dan spasi huruf kecil): khususnya, setiap baris baru dalam input akan menabraknya! Masalah ini dapat diperbaiki, dengan biaya dua karakter tambahan, dengan menambahkan
n-
kode ke filter untuk menyaring baris baru.sumber
C ++ - 365 karakter tanpa
int main(){}
Menggunakan alasan yang sama dengan jawaban saya di sini , hanya menggunakan
for
loop untuk menampilkan setiap huruf beberapa kali sesuai.sumber
s[i]==32
bukans[i]==' '
. Nilai ASCII ruang adalah 32.Perl - 107
110Inilah solusi saya sebelumnya di 120
128 130 155:Tes:
sumber
VBA
220253/258/219Tidak menghitung
Function
garis di sini:Dengan
String
, 253 :Dengan
For
loop 258 :Menambahkan koreksi untuk kunci 7/9 (terima kasih, Danny), yang menambahkan banyak karakter.
Menggunakan
Choose
219 :Saya tidak ingin menjalankan yang ini, karena fungsionalitasnya lebih mendasar, tetapi ini adalah kode yang lebih pendek ...
sumber
yes
seharusnya999337777
. Saya bisa10338
menggunakan fungsi Anda.C,
165 163 153 149138 karakterUpaya pertama saya di golf kode, ada saran yang dihargai.
sumber
C ++ -
170168160Golf:
Tidak disatukan
sumber
C: 136 karakter
Dan sedikit ungolfed (ya, begitulah ditulisnya):
Saya mungkin bisa mengurangi sedikit dengan menerapkan rekursi, ilmu hitam dan bubuk cabai yang cukup banyak.
sumber
Jawa - 243
Solusi java yang cukup naif. Terima kasih kepada komentator untuk saran.
Memperbaiki bug yang terkadang memasukkan spasi yang tidak perlu, misalnya untuk input "hello worlds sup".
sumber
java
. Bisakah Anda memasukkannya ke dalam pos Anda, seperti jawaban lainnya?t.length
dengan10
i
digunakan hanya untuk iterasi melaluiString
, hapus dan lakukan loop foreach:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
keif(c==' ')o+='0';else{
dan menambahkan sesuai dengan}
.CoffeeScript - 202 (210 - 8)
sumber
APL, 77 karakter
Penjelasan
2+⌊y←7.99,⍨.315×⍳25
atau, ungolfed,y←(0.315×⍳25),7.99 ◇ 2+⌊y
sampel garis miring yang sesuai (y = 0,315 x) pada titik 1 hingga 25; garis dimiringkan sedemikian rupa sehingga lantai dari nilai-nilai y ini mengikuti pola berulang 000111 ... 777 kecuali untuk kelompok angka keenam 5555; angka ditambahkan pada akhir untuk mendapatkan 7 keempat, sehingga susunan akhir ditambah 2 adalah 22233344455566677778889999;⌈3.1×y-⌊y
memperkuat perbedaan antara nilai-nilai y dan lantai mereka, sehingga langit-langit perbedaan memberikan pola 123123 ... dengan 4 pada digit terakhir dari dua grup dengan 4 digit;'0',⍨( ... )/¨⍕¨ ...
atau(( ... ) /¨ ⍕¨ ...),'0'
menggunakan hasil terakhir untuk menggandakan digit dari yang sebelumnya, sehingga outputnya adalah deretan string "2" "22" "222" "3" "33" "333" ... dengan "7777" dan "yang benar" 9999 "pada tempatnya, dan" 0 "ditambahkan sampai akhir;⍵⍳⍨⎕UCS 96+⍳26
atau(⎕UCS 96+⍳26)⍳⍵
menghitung indeks dari setiap input char, di mana "a" adalah 1, "z" adalah 26, dan ruang (dan setiap char lainnya) adalah 27;{ ... }/( ... )[ ... ]
mengambil hasil yang terakhir, indeks untuk masing-masing char input, untuk menerjemahkan masing-masing char ke dalam string masing-masing digit, kemudian menggabungkan string menggunakan fungsi dalam kurung kurawal;{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
atau{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
menambahkan setiap string baru ⍺ ke akumulator ⍵, menempatkan satu spasi hanya jika kedua argumen dimulai dengan karakter yang sama.Contohnya
sumber
Python
155150Saya berharap saya lebih baik di XD ini. Definisi fungsi tidak dihitung. Level indentasi pertama adalah spasi, kedua adalah tab, dan 2 tab lainnya.
sumber
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
sumber
R 224
Saya yakin ada cara yang lebih baik untuk melakukan ini, jadi saya akan terus mengusahakannya.
sumber