SELAMAT DATANG di @kuroineko. Menangkan hadiah untuk kecepatan luar biasa (672 gerakan) di trek Gauntlet.
PEMIMPIN: * Nimi mencetak 2129 ringan. Entri lain lebih besar tetapi menunjukkan beberapa kecepatan serius.
* Pemimpin dapat berubah karena entri yang lebih baru.
Tugas Anda adalah menulis sebuah program kecil yang dapat mengendarai mobil balap dengan cepat.
Aturan
Program Anda akan membaca dalam gambar trek. Anda dapat menyalakan mobil Anda pada piksel kuning apa pun, dan Anda harus menyelesaikannya dengan memotong piksel hitam apa pun. Lintasan mobil Anda harus hanya di jalur abu-abu ((c, c, c) di mana 30 <= c <= 220) dilacak.
Mobil Anda akan bergerak dalam garis lurus setiap belokan dengan kecepatan v yang terdiri dari bilangan bulat vx dan vy (dimulai dengan (0,0)). Pada awal setiap giliran program Anda dapat mengubah vx dan vy sedemikian rupa sehingga:
abs(vx2-vx1) + abs(vy2-vy1) <= 15
Pembaruan: Peningkatan akselerasi maksimum menjadi 15.
Program Anda kemudian akan memplot garis lurus dari lokasi Anda saat ini ke (lokasi + v) berwarna putih dengan titik biru di awal. Jika piksel di bawah garis ini berwarna hitam, Anda telah menyelesaikan balapan. Jika tidak, jika semua piksel di bawah garis itu berwarna abu-abu atau kuning, Anda dapat melanjutkan ke belokan berikutnya.
Program Anda harus menampilkan gambar trek dengan jalur Anda putih dan biru ditambahkan.
Output Tambahan (ditambahkan 2015-01-15):
Jika Anda ingin bersaing untuk menang atau bonus , program Anda juga harus menampilkan daftar poin Anda (titik biru) untuk City atau Gauntlet. Sertakan daftar poin dengan jawaban Anda (untuk verifikasi). Poin akan terlihat seperti: (x0,y0), (x1,y1), ... (xn,yn)
. Anda dapat menggunakan ruang putih secara bebas termasuk '\n'
karakter agar sesuai dengan data pada halaman.
Anda dapat menggunakan pustaka membaca dan menulis gambar pihak ketiga, gambar garis dan pustaka akses piksel. Anda tidak dapat menggunakan pustaka pencarian jalur. Jika mau, Anda dapat mengonversi gambar PNG ke format grafik lainnya (seperti GIF, JPG, BMP) jika perlu.
Beberapa trek untuk berkendara
Lagu sederhana untuk memulai:
Trek Balap:
Kursus Rintangan:
Kota:
Nightmare Track: The Gauntlet (jika yang lain terlalu mudah)
Mencetak gol
Skor Anda akan didasarkan pada hasil Anda di trek Kota. Poin sama dengan panjang program Anda dalam byte ditambah 10 poin untuk setiap belokan mobil balap Anda selesai. Skor terendah menang. Harap sertakan gambar lintasan lari Kota Anda dengan jawaban Anda - kami ingin melihat gaya mengemudi Anda.
Silakan gunakan judul untuk jawaban Anda dalam format:
<Racing Driver or Team Name> <Language> <Score>
misal: Slowpoke Perl 5329
Program Anda harus dapat mengemudi pada gambar trek apa pun mengikuti aturan di atas. Anda tidak boleh membuat hardcode jalur optimal atau parameter trek uji apa pun. Celah standar lainnya berlaku.
Tantangan serupa
Ini adalah teka-teki yang mirip dengan yang diajukan oleh Martin: To Vectory! - Grand Prix Balap Vektor . Teka-teki ini memiliki sejumlah perbedaan:
- Mengemudi melalui dinding tidak diizinkan.
- Anda dapat menggunakan memori dan waktu tanpa batas.
- Anda tidak harus menjalankan kode orang lain di komputer Anda.
- Anda tidak perlu mengunduh apa pun kecuali satu gambar.
- Ukuran kode Anda diperhitungkan dalam penilaian. Lebih kecil lebih baik.
- Anda merencanakan solusi Anda pada gambar trek.
- Anda dapat dengan mudah membuat trek sendiri dengan paket cat.
- Resolusi yang lebih tinggi mendorong pengereman dan tikungan yang lebih realistis.
- Akselerasi 15 menciptakan sekitar 450 kemungkinan per putaran. Ini membuat BFS kurang layak dan mendorong algoritma baru yang menarik.
Teka-teki ini harus menginspirasi babak baru programmer untuk mencoba solusi dan memungkinkan programmer dengan solusi lama untuk memikirkan kembali mereka di lingkungan baru.
sumber
Jawaban:
TS # 1 - Haskell - 1699 + 430 = 2129
Saudara Tutu # 1
Sangat mirip dengan pembalap Tutu asli, kecuali ia menggunakan ketebalan 3 untuk jalur kembung dan A * 2 (ruang pos kecepatan) berjalan dengan heuristik konstan
1
. Gambar input tidak dilewatkan sebagai argumen baris perintah lagi, itu harus dinamaii
. Nama gambar keluaran adalaho
. Program mencetak titik-titik yang dihitung pada jalur sebagai daftar pasangan x, y (keluaran asli adalah satu baris):Saya bisa menyimpan banyak byte ketika saya mulai menghapus semua peta dan mengatur struktur data dan menggantinya dengan daftar tertaut sederhana. Hanya dua pernyataan impor akan menghemat 60 byte. Namun, itu akan memperlambat program sehingga menunggu hasilnya adalah rasa sakit yang murni. Versi ini memakan waktu lebih dari 45 menit untuk The City, dibandingkan dengan 7s yang asli. Saya akan berhenti di sini berdagang byte untuk mengeksekusi kecepatan.
Kode membutuhkan flag -XNoMonomorphismRestriction untuk dikompilasi.
The City - TS # 1 - 43 langkah
sumber
Java FirstRacer (5825 + 305 * 10 = 8875)
Hanya untuk memulai. Membutuhkan 305 segmen di City.
Program Java ini melakukan pipelined:
Saya pikir Lintasan Balap memberi Anda kesan yang lebih baik bagaimana FirstRacer bekerja.
sumber
pighead PHP (5950 + 470 = 6420)
Variasi BFS (pigheaded) yang lain, dengan beberapa preprocessing untuk memangkas ruang pencarian.
Pilihan bahasa
PHP cukup bagus dalam menangani gambar.
Ini juga memiliki memori asosiatif asli, yang membuat pemrograman BFS node lookup mudah.
The downside adalah bahwa hashing node pengidentifikasi tidak terlalu efisien waktu, sehingga hasilnya sama sekali tidak cepat.
Dari percobaan saya dengan tantangan balap sebelumnya, saya tidak ragu C ++ 11 dan tabel hash-nya akan berkinerja lebih baik, tetapi kode sumber akan setidaknya dua kali lipat, ditambah kebutuhan untuk png library eksternal apa pun (bahkan LodePNG) akan buat bangunan yang berantakan.
Perl dan keturunannya yang lebih maju mungkin akan memungkinkan untuk kode yang lebih kompak dan efisien (karena kinerja hashing yang lebih baik), tetapi saya tidak cukup akrab dengan semua ini untuk mencoba port.
Inti BFS
Pencarian beroperasi pada posisi + ruang kecepatan, yaitu sebuah simpul mewakili lokasi tertentu yang dikunjungi dengan kecepatan tertentu.
Ini tentu saja membuat ruang pencarian yang cukup besar, tetapi menghasilkan hasil yang optimal asalkan semua lokasi trek yang mungkin diperiksa.
Jelas, mengingat jumlah piksel bahkan pada gambar kecil, pencarian lengkap tidak mungkin dilakukan.
Pemotongan
Saya memilih untuk memotong ruang posisi, dengan memilih hanya sebagian dari piksel trek.
Pemecah akan mempertimbangkan semua posisi dalam jangkauan, hanya dibatasi oleh akselerasi.
Lagu ini dilapisi dengan kotak, yang ukuran maksimalnya dihitung sehingga dua kotak yang berdekatan dapat dicapai dengan akselerasi maksimum yang diperbolehkan (yaitu 14x14 piksel dengan batas kecepatan saat ini).
Setelah mengemas trek dengan kotak besar, ubin yang semakin kecil digunakan untuk mengisi ruang yang tersisa.
Hanya pusat dari setiap ubin yang dianggap sebagai tujuan yang memungkinkan.
Berikut ini sebuah contoh:
Pilihan heuristik ini cukup untuk membuat pemecah gagal pada peta mimpi buruk. Saya kira orang bisa mencoba untuk mengurangi ukuran ubin maks sampai beberapa solusi ditemukan, tetapi dengan pengaturan saat ini pemecah berjalan untuk sesuatu seperti satu jam dan menggunakan 600 Mb, sehingga hasil yang lebih akurat akan memerlukan jumlah waktu dan memori yang tidak masuk akal.
Sebagai potongan kedua, kuadrat hanya 1 piksel mungkin ditinggalkan.
Ini tentu saja akan menurunkan solusi atau bahkan mencegah pemecah menemukan sesuatu, tetapi itu meningkatkan banyak waktu komputasi dan biasanya menghasilkan hasil yang cukup dekat pada peta "sederhana".
Misalnya, di kota, meninggalkan kuadrat 1x1 piksel mengurangi simpul pohon BFS yang dieksplorasi dari 660K menjadi sekitar 90K untuk solusi 47 vs 53 bergerak.
BFS vs A *
A * memerlukan lebih banyak kode dan bahkan tidak dijamin untuk menghasilkan hasil yang lebih cepat di posisi / ruang kecepatan, karena mengevaluasi kandidat terbaik berikutnya tidak sesederhana seperti di ruang hanya posisi klasik (yang dapat dengan mudah dikalahkan dengan cul pokoknya de-sac).
Selain itu, meskipun PHP memiliki semacam antrian prioritas, yang dengan cara mendukung penataan ulang dinamis terhadap sepupu C ++ mereka, saya ragu mereka akan cukup untuk implementasi A * yang efisien, dan menulis ulang tumpukan biner atau struktur antrian A * khusus apa pun yang akan membutuhkan terlalu banyak baris kode.
Pemeriksaan dinding
Saya tidak menggunakan algoritma Bresenham untuk memeriksa tabrakan dinding, sehingga lintasan mungkin memotong piksel dinding yang aneh. Seharusnya tidak memungkinkan untuk menyeberang melalui dinding.
Pertunjukan
Pemecah ini yakin tidak ada jackrabbit berkaki enam.
Tanpa potongan tambahan, peta dapat membutuhkan waktu lebih dari 10 menit untuk menyelesaikan pada PC kelas menengah saya.
Saya sarankan mengatur ukuran ubin minimal ke 2 atau 3 jika Anda ingin mengutak-atik kode tanpa menghabiskan waktu menunggu hasilnya.
Konsumsi memori masuk akal untuk jenis algoritma dan bahasa ini: sekitar 100 Mb atau kurang kecuali untuk mimpi buruk yang mencapai di atas 600 Mb.
Hasil dan penilaian
Skor diberikan tanpa potongan "ukuran ubin minimal".
Sebagai pembaca yang cermat dapat menyimpulkan dari komentar umum saya, saya tidak terlalu peduli tentang golf bagian dari tantangan ini. Saya tidak melihat bagaimana menjalankan kode saya melalui obfuscator atau menghapus beberapa optimasi dan / atau debug rutin untuk mengecilkan sumber akan membuat ini lebih menyenangkan.
Biarkan S menjadi ukuran byte sumber untuk saat ini:
lacak S + 1020
kota S + 470
rintangan S + 280
mimpi buruk -> gagal
sumber
Java SecondRacer (1788 + 72 * 10 = 2508)
(2708) (2887) (3088) (3382) (4109 + 72 * 10 = 4839) (4290 + 86 * 10 = 5150)Mirip dengan FirstRacer. Tetapi berbeda dalam langkah 2.2 dan 3. yang menghasilkan mengemudi berpandangan jauh dan menggunakan gigi.
Performa
Tidak satu pun dari trek ini yang menjadi masalah bagi A *. Hanya beberapa detik (<10) untuk menyelesaikan (bahkan "Nightmare Track: The Gauntlet") pada PC kelas menengah saya.
Gaya Jalur
Saya menyebutnya gurita. Sejauh ini tidak seanggun solusi pighead (dari kuroi neko).
Gaya Kode
Saya memasuki mode pertempuran moderat menjaga keterbacaan. Tetapi menambahkan versi golf.
golfed -> PERINGATAN: itu ada di tempat penggantian file asli!
Semua gambar ditampilkan pada lanskap gradien A * mereka. Mulai dari kuning muda ke coklat (= kuning tua). Sementara - menurut A * - jalur yang dihasilkan dilacak mundur (di sini dari coklat menjadi kuning muda).
Lintasan Balap S + 175
Kursus Kendala S + 47
Kota S + 72
Gauntlet S + 1133
sumber
Tutu - Haskell - (
3460265424762221206019921900 + 50x10 = 2400)Strategi:
Golf:
Saya bukan pegolf Haskell, jadi saya tidak tahu berapa banyak yang bisa disimpan lebih lanjut (Edit: ternyata cukup banyak).
Kinerja:
Gauntlet beroperasi pada 9: 21 menit menggunakan 1.7GHz Core i5 saya dari 2011. City mengambil 7.2sec. (digunakan -O1 dengan ghc, -O2 membuat program sangat lambat)
Opsi tweak adalah ketebalan jalur bengkak. Untuk peta yang lebih kecil, jarak 3 menghemat satu atau dua langkah, tetapi The Gauntlet berjalan terlalu lama, jadi saya tetap dengan jarak 2. Perlombaan dimulai selalu pada piksel kuning pertama (yaitu kiri atas), mengoptimalkan dengan tangan harus menyimpan langkah tambahan.
Kesesuaian aturan:
"Anda tidak bisa menggunakan pustaka pencarian jalur." - Ya, tapi sumbernya disertakan. Fungsi pencarian A * adalah versi
sedikitberat dari pustaka Data.Graph.AStar Cale Gibbard (lihat http://hackage.haskell.org/package/astar ).Kota - 50 langkah
Gauntlet - 722 langkah
Tidak Disatukan:
Golf:
Saudara Tutu -TS # 1 - (1764 + 43 = 2194)Edit: TS # 1 sekarang pisahkan jawaban.
Sunting II: Jalur untuk Kota adalah
Dalam The Gauntlet Tutu bergerak sebagai berikut
sumber
-O2
memperlambat program ?? aneh. sudah mencoba-O3
?Maybe
banyak. mungkin Anda bisa menggantiMaybe
dengan daftar:Maybe a
is[a]
,Nothing
is[]
danJust x
is[x]
. yangMaybe
monad menjadi setara denganList
monad. Anda kemudian dapat menggunakan banyak daftar fungsi untuk mereka:null
,head
,(:[])
,map
dan sebagainya.Pembalap crossed bintang - PHP - 4083 + 440 = terlalu berat
Ok, setelah 3 minggu tanpa koneksi Internet (itulah yang terjadi ketika salah satu pesaing paling ganas dari penyedia Anda kebetulan bertanggung jawab atas bangunan patch bay, atau setidaknya itu terjadi di Paris, setidaknya di Prancis) Akhirnya saya bisa menerbitkan usaha saya selanjutnya.
Kali ini saya menggunakan algoritma A *, dan strategi distribusi waypoint yang lebih efisien.
Sebagai bonus tambahan, saya menulis semacam PHP cruncher untuk menjawab tantangan golf.
Dan sekarang setelah pemecah bekerja pada semua peta yang diusulkan, bug pelacakan garis telah diperbaiki.
Tidak ada lagi guntingan dinding (meskipun penggembalaan dinding masih terjadi, sebagaimana mestinya :)).
menjalankan kode
berikan kode nama apa pun yang Anda suka (
runner.php
misalnya), kemudian panggil seperti:Setelah duduk diam selama beberapa saat, itu akan menghasilkan
_track.png
output yang menunjukkan solusi.Seperti yang Anda lihat pada gambar output, kodenya sangat lambat. Anda sudah diperingatkan.
Tentu saja versi pribadi saya sendiri penuh dengan jejak dan menghasilkan representasi yang bagus dari berbagai informasi (termasuk gambar berkala yang menunjukkan kemajuan A * untuk membantu membunuh waktu), tetapi ada harga yang harus dibayar untuk bermain golf ...
kode golf
versi tanpa ungolfed
Hasil
Pics diproduksi oleh versi yang lebih kaya yang menampilkan solusi yang sama persis dengan beberapa statistik di bagian bawah (dan menarik jalan dengan antialiasing).
Peta kota adalah contoh yang cukup bagus mengapa algoritma berbasis posisi terikat untuk menemukan hasil di bawah standar dalam banyak kasus: lebih pendek tidak selalu berarti lebih cepat.
(672 bergerak jika Anda tidak ingin memperbesar)
SEBUAH*
Yang mengejutkan saya, A * berkinerja cukup baik pada ruang kecepatan posisi. Lebih baik daripada BFS, bagaimanapun juga.
Saya harus sedikit berkeringat untuk menghasilkan perkiraan jarak heuristik yang berfungsi.
Saya juga harus mengoptimalkannya, karena jumlah status yang mungkin sangat besar (beberapa juta) dibandingkan dengan varian hanya posisi, yang lagi-lagi memerlukan lebih banyak kode.
Batas bawah yang dipilih untuk jumlah gerakan yang diperlukan untuk mencapai tujuan dari posisi tertentu hanyalah waktu yang dibutuhkan untuk menempuh jarak ke tujuan terdekat dalam garis lurus dengan nol kecepatan awal .
Tentu saja, jalur garis lurus biasanya akan mengarah langsung ke dinding, tetapi ini tentang masalah yang sama dengan menggunakan jarak lurus euclidian untuk pencarian A * hanya ruang.
Sama seperti jarak euclidian untuk varian ruang saja, keunggulan utama metrik ini, selain dapat diterima untuk menggunakan varian A * paling efisien (dengan simpul tertutup), adalah memerlukan analisis topologi trek yang sangat sedikit.
Diberikan akselerasi maksimal A , jumlah n gerakan yang diperlukan untuk menempuh jarak d adalah bilangan bulat terkecil yang memenuhi relasi:
d <= A n (n + 1) / 2
Memecahkan ini untuk n memberikan perkiraan jarak yang tersisa.
Untuk menghitungnya, dibangun peta jarak ke tujuan terdekat, menggunakan algoritma pengisian banjir yang diunggulkan dengan posisi tujuan.
Ini memiliki efek samping yang menyenangkan menghilangkan titik jejak dari tempat tidak ada tujuan yang dapat dicapai (seperti yang terjadi di beberapa area trek mimpi buruk).
Jumlah gerakan dihitung sebagai nilai floating point, sehingga simpul yang lebih dekat ke tujuan dapat lebih jauh dibedakan.
Titik lewat
Seperti dalam upaya saya sebelumnya, idenya adalah untuk mengurangi jumlah track point menjadi sekecil mungkin waypoints. Caranya adalah dengan mencoba dan memilih posisi "paling berguna" di trek.
Heuristik dimulai dengan partisi ulang reguler di seluruh trek, tetapi meningkatkan kepadatan di dua jenis area:
Berikut ini sebuah contoh.
Area kepadatan tinggi berwarna merah, kepadatan rendah berwarna hijau. Pixel biru adalah titik arah yang dipilih.
Perhatikan kelompok titik lewat pada tikungan tajam (di antara banyak bercak tak berguna pada kurva miring, karena penyaringan yang tidak memadai).
Untuk menghitung posisi jalur, seluruh trek dipindai untuk jarak ke dinding terdekat. Hasilnya adalah bidang vektor yang menunjuk ke perbatasan jalur terdekat.
Bidang vektor ini kemudian diproses untuk menghasilkan perkiraan kasar kelengkungan lokal.
Akhirnya, lengkungan dan jarak ke dinding digabungkan untuk menghasilkan kepadatan lokal yang diinginkan, dan algoritma yang agak kikuk mencoba untuk menaburkan titik arah di atas jalur yang sesuai.
Sebuah peningkatan penting dari strategi sebelumnya adalah bahwa jalur sempit akan (tampaknya) selalu mendapatkan titik arah yang cukup untuk dilalui, yang memungkinkan untuk menavigasi peta mimpi buruk.
Seperti biasa, ini adalah masalah menemukan sweet spot antara waktu komputasi dan efisiensi.
Penurunan kepadatan 50% akan membagi waktu komputasi lebih dari 4, tetapi dengan hasil yang lebih kasar (48 bergerak bukannya 44 di kota, 720 bukannya 670 di mimpi buruk).
Golf
Saya masih berpikir golf tidak merusak kreativitas dalam kasus khusus ini: menghapus antialiasing dari output sudah cukup untuk mendapatkan 30 poin, dan membutuhkan usaha yang jauh lebih sedikit daripada bergerak dari 47 ke 44 bergerak di peta kota.
Bahkan bergerak dari 720 ke 670 bergerak pada mimpi buruk akan mendapatkan hanya 500 poin, meskipun saya sangat meragukan posisi A * hanya akan bisa pergi mendekati itu.
Hanya untuk bersenang-senang, saya memutuskan untuk menulis kompresor PHP saya sendiri.
Seperti yang muncul, mengganti nama pengidentifikasi secara efisien di PHP bukanlah tugas yang mudah. Bahkan, saya pikir tidak mungkin untuk melakukannya dalam kasus umum. Bahkan dengan analisis semantik penuh, kemungkinan untuk menggunakan string atau variabel tidak langsung untuk menunjuk objek akan membutuhkan pengetahuan setiap fungsi semantik.
Namun, karena parser built-in yang sangat nyaman memungkinkan untuk melompat ke analisis semantik segera, saya berhasil menghasilkan sesuatu yang tampaknya bekerja pada subset PHP yang cukup untuk menulis kode "golfable" (menjauh dari $$ dan jangan gunakan panggilan fungsi tidak langsung atau akses string lain ke objek).
Tidak ada penggunaan praktis untuk berbicara dan tidak ada hubungannya dengan masalah aslinya, tetapi banyak yang menyenangkan untuk kode.
Saya bisa membantai kode lebih lanjut untuk mendapatkan sekitar 500 karakter atau lebih, tetapi karena nama-nama perpustakaan grafis PHP sayangnya cukup panjang, itu semacam perjuangan berat.
Perkembangan selanjutnya
Kode pemilihan waypoint adalah kekacauan yang menghebohkan, disetel dengan coba-coba. Saya menduga melakukan lebih banyak matematika (menggunakan gradien dan curl operator yang tepat) akan sangat meningkatkan proses.
Saya ingin tahu apakah heuristik jarak yang lebih baik dapat ditemukan. Saya memang mencoba untuk memperhitungkan kecepatan dalam beberapa cara, tetapi entah itu memecah A * atau menghasilkan hasil yang lebih lambat.
Dimungkinkan untuk mengode ulang semua ini dalam bahasa yang lebih cepat seperti C ++, tetapi versi PHP sangat bergantung pada pengumpulan sampah untuk menjaga konsumsi memori tetap masuk akal. Membersihkan node yang ditutup dalam C ++ akan membutuhkan sedikit kerja dan jumlah kode tambahan yang cukup besar.
Apakah skoring didasarkan pada kinerja, saya akan bersemangat mencoba untuk meningkatkan algoritma. Tetapi karena kriteria bermain golf sangat luar biasa, tidak ada gunanya, atau begitu?
sumber
ThirdRacer Java (1224 + 93 * 10 = 2154)
Mirip dengan SecondRacer. Tetapi mengalihkan fokus dari kecepatan ke ukuran kode (tetapi masih menggunakan Java). Mengoptimalkan akselerasi jauh lebih sederhana sekarang, sayangnya menghasilkan mobil yang lebih lambat.
Performa
Lebih baik dari SecondRacer.
Gaya Jalur
Seperti SecondRacer.
Gaya Kode
Saya memasuki mode pertarungan berat.
golfed -> PERINGATAN: itu dilakukan di tempat pengganti file asli!
Kota S + 93
sumber
Bintang melintasi jalur pembalap di peta mimpi buruk
(sesuai permintaan populer)
(kode tidak diperbarui karena modifikasi itu sepele dan tantangan kinerja saja tidak di-golf)
Maaf memposting entri lain, tapi saya mencapai batas 30.000 karakter pada yang sebelumnya.
Katakan saja dan saya akan menghapus yang ini.
sumber
Driver Hari Minggu, Python 2, 3242
Kode yang diperkecil = 2382 byte
Performa: kota = 86 rintangan = 46 pacuan kuda = 188 tantangan = 1092
Inilah program pembuktian konsep saya yang menunjukkan bahwa solusi itu mungkin. Perlu beberapa optimasi dan golf yang lebih baik.
Operasi
Buat struktur data cincin jarak keluar dari tujuan (turunan A * sederhana, seperti isi banjir)
Temukan rangkaian garis lurus pendek ke tujuan yang tidak melintasi piksel non-trek.
Untuk setiap garis lurus, percepat dan rem untuk meminimalkan putaran yang dilakukan.
Kode Golf (diperkecil)
Contohnya
sumber