Banyak game Game Boy lama seringkali membutuhkan input string dari pengguna. Namun, tidak ada keyboard. Ini ditangani dengan menghadirkan pengguna dengan "layar keyboard" seperti:
The 'karakter pointer' akan dimulai pada huruf A. Pengguna akan menavigasi ke masing-masing karakter yang diinginkan dengan D-Pad 's empat tombol ( UP
, DOWN
, LEFT
dan RIGHT
), lalu tekan BUTTON A
untuk menambahkan ke string akhir.
Tolong dicatat:
- Grid membungkus , sehingga menekan
UP
sementara pada huruf A akan membawa Anda ke T. - 'Penunjuk karakter' tetap diletakkan setelah menambahkan huruf
Tantangan
Keyboard di atas memiliki opsi untuk mengubah huruf besar-kecil dan bentuknya tidak beraturan. Jadi, untuk kesederhanaan, dalam tantangan ini kita akan menggunakan keyboard berikut (kanan bawah adalah ASCII char 32, spasi):
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 .
Mengetik pada keyboard seperti ini sangat lambat - jadi, untuk membuatnya lebih mudah, tugas Anda adalah menulis sebuah program yang memberi tahu pengguna cara tercepat yang mungkin untuk mengetik string yang diberikan. Jika ada beberapa cara tercepat, Anda hanya perlu menunjukkan satu.
Kunci output harus:
>
untukRIGHT
<
untukLEFT
^
untukUP
v
untukDOWN
.
untukBUTTON A
(tambahkan huruf saat ini ke string)
Misalnya, ketika diberi string DENNIS
, solusinya akan terlihat seperti ini:
>>>.>.>>v..>>.>>>v.
Aturan / Detail
- Tolong ingat, kisi-kisi membungkus!
- Anda dapat mengirimkan program atau fungsi lengkap, selama itu mengambil string awal dan menghasilkan string solusi. Baris putih / trailing baris baru tidak relevan selama outputnya benar.
- Anda dapat mengasumsikan input hanya terdiri dari karakter yang dapat diketik pada keyboard yang ditentukan, tetapi mungkin kosong.
- Ini kode-golf , jadi kode terpendek menang. Lubang kode standar golf berlaku.
Uji Kasus
Biasanya ada beberapa solusi dengan panjang yang sama. Untuk setiap test case, saya telah memasukkan panjang optimal, dan sebuah contoh. Anda tidak perlu mencetak panjang jawaban Anda, hanya solusinya.
FLP.TKC -> 25 steps: <<.<v.<<<v.<<<v.^.<<^.<^.
MOYLEX -> 23 steps: <<v.>>v.>>>v.>^^.^.<<^.
FEERSUM -> 18 steps: <<.<..<vv.>.>>.<^.
MEGO -> 14 steps: <<v.<^.>>.>vv.
A CAT -> 17 steps: .<^.>>>v.<<.<<vv.
BOB -> 10 steps: >.<vv.>^^.
(space) -> 3 steps: <^.
(empty) -> 0 steps: (empty)
Anda dapat melihat generator testcase saya di repl.it - tolong beri tahu saya jika ada bug.
Terima kasih semuanya atas kirimannya! Pengguna ngn saat ini adalah pemenang dengan 61 byte, tetapi jika ada yang bisa menemukan solusi yang lebih pendek, centang hijau kecil dapat dipindahkan;)
Jawaban:
Dyalog APL , 61 byte
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
mengasumsikan
⎕IO←0
⎕a,'.'
alfabet diikuti dengan berhenti penuh⍵⍳⍨
temukan karakter argumen di sana sebagai indeks 0..26 (' '
dan semua yang lain akan menjadi 27)⍺⊤
encode di basis 7 (perhatikan arg kiri⍺
terikat ke4 7
), dapatkan 2 × n matriks0,
angka nol di sebelah kiri2-/
perbedaan antara kolom yang berdekatan↓
membagi matriks menjadi sepasang vektora←⍺|
bawa masing-masing modulo 4 dan 7, tetapkan kea
b←a⌊⍺-a
membuatb
yang lebih kecila
dan terbalik modularnya'^v' '<>'⌷¨⍨⊂¨a>b
pilih^
atauv
untuk vektor pertama dan<
atau>
untuk yang kedua, berdasarkan dari manaa
berbedab
b⍴¨¨
ulangi setiapb
waktu itu⍉↑
campurkan dua vektor menjadi satu matriks dan transposkan, dapatkan matriks n × 2'.',⍨
tambahkan.
-s di sebelah kanan∊
meratakansumber
JavaScript (ES6), 147 byte
Perilaku yang menarik
substring
adalah bahwa ia bertukar argumen jika yang kedua kurang dari yang pertama. Ini berarti bahwa jika saya menghitung jumlah optimal dari penekanan kiri / kanan sebagai angka antara -3 dan 3, saya dapat menambahkan 3, dan mengambil substring<<<>>>
mulai dari 3 dan saya akan mendapatkan jumlah panah yang benar. Sementara itu tekan ke bawah / atas hanya ditangani dengan mencari array menggunakan bitwise dan selisih baris dengan 3; cara ini sedikit lebih pendek karena ada lebih sedikit elemen array.sumber
Ruby, 107 byte
Tidak digabungkan dalam program uji
sumber
Mathematica, 193 byte
Golf
Dapat dibaca
sumber
Python 2, 298 byte
Ini lebih lama dari yang seharusnya, tapi ...
Bantuan apa pun akan sangat dihargai!
Mengambil input dalam tanda kutip.
l
mengembalikan lokasi karakter di keyboard.Dua
if
pernyataan di tengahd
adalah untuk memeriksa apakah akan optimal untuk 'membungkus' keyboard.Input,
s
telah"A"
ditambahkan sebelumnya karena posisi awal kursor adalahA
.Kami loop melalui string berpasangan, membuang yang terakhir (yang bukan pasangan:)
[:-1]
, menemukan jarak minimum antara dua bagian dari pasangan.Terima kasih kepada Flp.Tkc karena memberi tahu saya bahwa saya dapat melakukan
a=abs
alih - alih mengatakannyaabs
setiap waktu!sumber
Java 8, 1045 byte
Golf
Dapat dibaca
Penjelasan
Solusinya adalah pendekatan langsung: brute force yang dioptimalkan dengan buruk. Metode
g(...)
ini adalah pencarian dasar kedalaman pertama melalui setiap permutasi (atas, bawah, kiri, kanan). Dengan sedikit modifikasi dalam pemesanan untuk test case saya mendapatkan output:sumber