Tinta hitam gelap telah berhamburan di seluruh lembar kertas printer Anda! Solusi yang jelas adalah melipat kertas sehingga bagian hitam dan putih bertemu dan keduanya menjadi abu-abu saat tinta berdifusi. Kemudian buka dan buka kembali sampai kertas Anda semuanya berwarna abu-abu.
Menemukan cara terbaik untuk membuat lipatan ini adalah tugas Anda dalam tantangan pengkodean ini. Pastebin ini berisi empat ukuran grid satu dan nol. Setiap kotak mewakili selembar kertas berceceran tinta yang harus Anda ubah menjadi abu-abu. Nol adalah kertas dan tinta.
Dalam kisi-kisi ini, hanya lipatan horizontal dan vertikal di sepanjang ruang antara garis dan kolom yang valid. Ketika lipatan dibuat, pasangan nilai yang tumpang tindih dirata-rata. Lipatan dilakukan satu per satu dan selalu dibuka. Lipatan hanya mengubah distribusi tinta, bukan ukuran kertas.
Rn menunjukkan lipat tepi kiri kisi ke kanan, dimulai setelah kolom ke-n. Dn menunjukkan lipat tepi atas grid ke bawah, dimulai setelah baris ke-n. (n diindeks 1)
Contoh
Diberi kisi ini
0 1 1 1
0 0 0 0
0 0 0 0
lipatan D1 berarti "lipat seluruh baris atas ke bawah lalu buka".
0 0.5 0.5 0.5
0 0.5 0.5 0.5
0 0 0 0
Maka R2 akan menghasilkan
0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
0 0 0 0
dan R2 lain tidak akan mengubah apa pun.
Tujuan
Tujuan Anda adalah untuk menulis algoritma yang menemukan urutan lipat penyebaran tinta terbaik untuk masing-masing dari empat kisi menggunakan tepat 8 lipatan setiap kali. Lipatan dapat berupa kombinasi Rs atau Ds.
Mencetak gol
Skor kiriman Anda adalah jumlah skor Anda untuk setiap kisi. Skor kisi adalah jumlah dari perbedaan absolut antara masing-masing nilainya dan rata-rata (jumlahnya dibagi dengan wilayahnya). Skor yang lebih rendah lebih baik. Skor 0 sempurna, tetapi mungkin tidak mungkin hanya dalam 8 lipatan.
Anda harus melaporkan empat urutan lipat 8 langkah dengan kode Anda dalam jawaban. Ini agar kami dapat memverifikasi algoritma Anda benar-benar berfungsi.
Harap letakkan di formulir ini:
20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8
Berikut ini adalah skrip Python yang akan menghitung skor Anda mengingat urutan lipat Anda.
Secara alami Anda tidak harus menyalin pengiriman urutan orang lain. Urutan untuk setiap kotak hanya milik orang yang pertama kali membuatnya.
Klarifikasi
Idealnya, algoritme Anda akan berfungsi dengan baik di kisi apa pun, meskipun Anda dapat menyesuaikannya dengan yang khusus ini.
Anda harus mengirimkan kode Anda dengan urutan Anda. Untuk menang, Anda membutuhkan set skor terkecil dari urutan lipat 8-langkah yang belum diposting, dan juga algoritma yang berdiri untuk pengawasan publik. Jelaskan kode Anda, jangan mengaburkannya.
Kotak tidak boleh berisi angka negatif.
Celah standar berlaku.
sumber
Jawaban:
Python
Selesaikan mencoba berbagai kombinasi lipatan untuk beberapa lipatan pertama, kemudian lakukan sisa lipatan menggunakan pendekatan serakah.
Pendekatan lengkap dibatasi dalam rentang lipatan yang wajar di tengah, sehingga tidak akan berlangsung selamanya, sementara tidak mengabaikan terlalu banyak lipatan yang mungkin untuk menghasilkan minimum yang baik.
Berlari menggunakan pypy di macbook air saya.
Jawaban:
Output:
Total Skor: 7.91125 + 16.34375 + 42.13 + 32.30875 = 98.69375
Kode:
sumber
C, 16.344 (4 menit 33 detik)
Bergerak terbaik yang ditemukan sejauh ini: D6, D13, R19, D9, D11, R21, D10, R20
Menggunakan campuran Monte Carlo dan panjat bukit. Bisa dibuat untuk berlari lebih cepat, saya yakin.
sumber