Latar Belakang
Kebanyakan editor teks (setengah layak) memungkinkan Anda menavigasi teks menggunakan tombol panah. Naik dan turun memungkinkan Anda untuk menavigasi garis, sementara kiri dan kanan bergerak melintasi garis tetapi juga membungkus. Lebih jauh, jika garis lebih pendek dari posisi X kursor Anda, kursor muncul di akhir baris tetapi kembali ke posisi X yang sama jika Anda terus bergerak ke atas atau ke bawah. Mungkin penjelasan visual berikut akan membantu:
Contoh Gerakan
Contoh teks sederhana dapat terlihat seperti ini. Kursor akan disisipkan di antara dua karakter dalam teks ini, atau di akhir.
-----
---
------
let's put the cursor here:
X-----
---
------
move down (v):
-----
X---
------
move left (<):
-----X
---
------
v
-----
---X
------
v (notice how the X position of the cursor has been maintained)
-----
---
-----X-
^
-----
---X
------
> (more line wrapping)
-----
---
X------
<
-----
---X
------
^ (the X-position from earlier is no longer maintained due to the left-right motion)
---X--
---
------
Tantangan
Diberikan beberapa baris tes ASCII, temukan jalur terpendek dari lokasi awal ke lokasi akhir. Lokasi awal diwakili oleh ^
dan lokasi akhir diwakili oleh $
, dan masing-masing hanya akan ada satu. Ini tidak dianggap sebagai bagian dari teks dan tidak berkontribusi pada "panjang" baris itu.
Input akan terdiri dari beberapa baris teks yang tidak kosong. Output akan menjadi serangkaian ^v<>
karakter yang menunjukkan salah satu jalur terpendek. Anda dapat mengasumsikan baris baru tambahan di akhir masing-masing, tetapi itu tidak termasuk sebagai bagian dari teks yang bisa dinavigasi.
Anda dapat menulis program atau fungsi bernama. Pemenang akan menjadi pengiriman terpendek, diukur dalam byte.
Contoh I / O
^Squares
are
fun$ny
vv<v (which is better than the naive vv>>>)
Squares
^are
funny$
<vv
Alp$habet^
Song
v<^
Mary had a little lamb,
His fleece was white as snow,
And$ everywhere that ^Mary went,
The lamb was sure to go.
^^>>>>v>>>
$^degenerate case
(no output)
v<vv
, bukan? Atau akankah itu berakhir setelah karakter terakhir pada baris itu?Jawaban:
CJam, 139 byte
Nah ini butuh waktu berjam-jam untuk sampai pada sesuatu yang terasa sudah selesai. Rasanya seperti waktu yang dibutuhkan untuk secara agresif mengoptimalkan kode CJam adalah sesuatu yang lebih besar daripada O (n) sehubungan dengan ukuran kode ...
Anda dapat mencobanya secara online , tetapi untuk input apa pun yang jalur terbaiknya setidaknya 6 operasi, Anda mungkin harus mencobanya secara offline dengan juru bahasa yang lebih cepat.
Terjepit:
Diperluas dan dikomentari:
Secara keseluruhan, ini adalah solusi yang cukup mudah. Ini "mengeksekusi" digit representasi basis-5 dari nomor path yang ditambahkan setiap iterasi, mulai dari 0, hingga sebuah path bekerja. Digit
1
-4
memetakan operasi ke atas, bawah, kiri, dan kanan, dan0
tidak melakukan apa pun. Iterasi pertama menggunakan path of just0
catch the degenerate case. Semua lintasan lain yang berisi a0
tidak pernah dipilih karena itu hanya versi lintasan yang sudah diuji dengan tambahan no-ops.Keadaan dimodelkan dalam cara seminimal mungkin: teks dengan penanda awal dan akhir dihapus, posisi kursor dalam teks, dan "memori kolom". Baris baru sebagian besar diperlakukan seperti karakter lain, jadi tidak ada konsep baris, dan posisi kursor hanya indeks. Ini membuat bergerak ke kiri dan kanan mati sederhana, yang hanya diimplementasikan sebagai penurunan dan penambahan (dengan menjepit ke ukuran teks). Bergerak ke atas dan ke bawah agak rumit, tetapi masih dapat dikelola.
Penggunaan kembali kode adalah taktik optimisasi yang sangat vital. Contohnya termasuk:
5
operasi dummy ke awal string path, yang juga kebetulan menggunakan0
logika no-op karena pengindeksan array array dan hanya ada 5 operasi yang ditentukan.Secara keseluruhan, saya sangat senang dengan bagaimana ini keluar. Ini jelas merupakan pekerjaan terbanyak yang saya masukkan ke dalam kode golf jawaban terkini (untuk sesuatu yang cocok dengan tweet !?). Namun, jangka waktu berjalan sangat buruk. CJam bukan bahasa tercepat untuk memulai dan algoritma ini memiliki kompleksitas seperti O (m * 5 n ) , di mana m adalah ukuran input dan n adalah ukuran output. Kecepatan hal yang baik tidak masuk hitungan!
sumber
Python 2: 446
Solusi mudah. Saya melakukan pencarian luas pertama.
t
beralih ke semua jalur yang berbeda. Saya mengkonversit
ke basis5
, tetapi hanya menggunakan entri, yang bukan nol.1
naik,2
turun,3
kiri dan4
kanan.Saya menjaga posisi kursor saat ini dalam 3 variabel
x
,y
danz
.x
adalah garis,y
posisi kolom, dan posisi kolomz
'tersembunyi', jika Anda naik atau turun dan garis terlalu pendek. Banyak ifs yang memutuskan, bagaimana variabel berubah selama pemindahan.Preprocessing sangat panjang, 4 baris pertama hanya melakukan tugas ini.
Testcase panjang membutuhkan waktu yang sangat lama. Algoritma ini memiliki kompleksitas O (N * 5 ^ N), di mana N adalah panjang dari solusi terpendek.
Penggunaan: Masukkan garis sebagai string tunggal (garis yang dipisahkan oleh
\n
) seperti"Alp$habet^\nSong"
sumber
CJam - 274
Belum ada jawaban? Ok, ini satu :)
Cobalah di http://cjam.aditsu.net/ ... kecuali untuk contoh Mary atau sesuatu yang seukuran itu, Anda mungkin ingin penerjemah java .
sumber