Teka-teki:
Pertimbangkan permainan konsol / genggam dengan d-pad di mana Anda diminta memasukkan nama jenis. Ini muncul di banyak game lama sebelum penggunaan QWERTY dipopulerkan di konsol (mis. Saya percaya Wii menggunakan tata letak keyboard QWERTY untuk input). Biasanya, keyboard di layar melihat efek dari *:
Default:
0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J
K L M N O P Q R S T
U V W X Y Z _ + ^ =
Dengan penutup case:
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j
k l m n o p q r s t
u v w x y z - + ^ =
Yaitu, semua kunci alfanumerik dan berikut ini:
_
: Satu spasi
-
: Tanda hubung
+
: Alihkan case hanya untuk huruf berikutnya
^
: Toggle caps lock (yaitu, alihkan case dari semua huruf)
=
: Enter, complete
* Jelas saya mengganti kunci seperti "BKSP" dan "ENTER" dengan versi yang lebih pendek
Dan kemudian hardware akan mencakup d-pad (atau beberapa bentuk kontrol di mana Anda bisa pergi up
, down
, left
dan right
)
Layar juga biasanya memungkinkan Anda bergerak dari satu sisi langsung ke yang lain. Artinya, jika Anda fokus pada surat itu J
, menekan right
akan memungkinkan Anda untuk pindah ke surat itu A
.
Setiap kali saya memasukkan nama saya, saya selalu berusaha mencari cara tercepat untuk melakukannya.
Tujuan:
Program Anda akan mengambil input string yang dapat menyertakan karakter alfanumerik apa pun termasuk spasi dan tanda hubung, dan tujuan Anda adalah untuk menghasilkan jumlah penekanan tombol terpendek pada d-pad untuk menampilkan string yang diperlukan.
Pertimbangan:
Anda tidak perlu memasukkan tombol yang ditekan untuk menekan karakter yang sebenarnya.
Fokus selalu dimulai pada A
Enter =
harus ditekan di akhir
Contoh:
input: Code Golf
output: 43
Dijelaskan:
A
-> C
= 2
C
-> ^
= 6 (bergerak ke kiri)
^
-> o
= 5
o
-> d
= 2
d
-> e
= 1
e
-> +
= 5
+
-> _
= 1
_
-> +
= 1
+
-> G
= 3
G
-> o
= 3
o
-> l
= 3
l
-> f
= 5
f
-> =
= 6
Perhatikan bahwa lebih cepat menekan +
dua kali untuk a _
dan a G
daripada menekan ^
satu kali, lalu tukar kembali.
Pengajuan yang menang (saya akan mengizinkan setidaknya 1w) akan menjadi solusi terpendek (dalam byte). Karena ini adalah pertanyaan pertama saya, saya harap ini jelas dan tidak terlalu sulit.
Jawaban:
Ruby (369 bytes)
Mengambil input dari baris perintah.
Menyimpan banyak byte berkat @Charlie :)
sumber
j=(K.index(c.upcase) or 36)
dapat diganti denganj=K.index(c.upcase)||36
untuk menyimpan 4 byte.def d(x,y)
dapat diganti dengandef d x,y
untuk menyimpan byte, dan hal yang sama berlaku untukdef v
.v(...) if
kev(...)if
untuk byte lain. Pada baris terakhir,v(...)
dapat diganti denganv ...
untuk menyimpan 1 byte, dantrue
dengan!!0
untuk menyimpan byte lain.&&
dengan&
dan||
dengan|
.K=...
) dapat diganti dengan rentang (K='0123456789'+('A'..'Z').to_a.join+' +^='
)Swift 1.2,
812588670 byteSunting: Menghapus 224 byte dengan mengganti array angka yang besar dengan Range dan mengubahnya menjadi Array.
Sunting2: Menambahkan pengulangan secara vertikal
Untuk menjalankan, masukkan kode dalam
.swift
file dan jalankan denganswift <filename> <your name>
Ini menggunakan pendekatan sederhana di mana dua 'keyboard' disimpan sebagai array.
B:(I)->(I,I)={a in(a%10,a/10)}
Mengubah indeks dari array ke posisi x, y pada keyboard virtual.func C(e:I,f:I)->I{let(a,b)=B(e),(c,d)=B(f) return abs(d-b)+min(abs(c-a),abs(10-(c-a)))}
Mengambil indeks awal / akhir dan mengembalikan jumlah minimum gerakan untuk berpindah dari satu kali ke yang lain (akuntansi untuk bungkus horizontal)func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I
Merupakan fungsi rekursif utama yang melakukan sebagian besar perhitungan. Ini menghitung jarak dari posisi saat ini ke karakter target, kecuali kasus ini harus berubah, maka menghitung baik yang pergeseran dan para caps lock metode dan mengambil terkecil.Menjalankan
swift codegolf.swift Code Golf
cetakan43
sumber
Python
679661619602589576539520496482 BytesJalankan ini dan ia akan meminta input (tanpa teks prompt). Untuk input
Code Golf
yang dicetak43
.Program lengkap:
Output yang diperluas dari program lengkap:
sumber
C 675 Bytes
Mengambil input dari argumen baris perintah. Menggunakan utama rekursif:
sumber