Batasan Batu Bata dan Stabilitas
Pertanyaan ini menggunakan definisi bata dan stabilitas yang sama dengan Apakah struktur bata stabil?
Biarkan [__]
mewakili batu bata dan
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
mewakili pengaturan atau struktur batu bata yang sewenang-wenang ini, dengan setiap baris lainnya diimbangi dengan setengah batu bata, seperti biasa dalam konstruksi batu bata. Struktur dapat meluas ke atas dan ke kanan tanpa batas, tetapi representasi string akan selalu menjadi blok teks persegi panjang sempurna (memiliki spasi tambahan jika diperlukan) yang lebarnya dapat dibagi 4.
Masing-masing BRK?
dalam struktur dapat berupa bata ( [__]
) atau ruang kosong (4 spasi).
Sebagai contoh, satu kemungkinan struktur (tidak stabil - baca terus) adalah
[__] [__] [__]
[__] [__]
[__][__] [__]
Stabilitas struktur itu penting, dan struktur itu hanya stabil jika setiap batunya stabil.
Ada tiga cara batu bata individu menjadi stabil:
- Setiap bata di tanah (garis bata terendah) stabil.
Batu bata yang memiliki dua batu bata tepat di bawahnya stabil:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Setiap bata yang memiliki bata di atas dan di bawahnya di sisi yang sama stabil:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
(Ya, saya tahu aturan ini tidak akurat secara fisik.)
The Tantangan terakhir adalah tentang menentukan jika struktur stabil. Yang ini tentang menstabilkan yang tidak.
Tantangan
Tulis program yang menghasilkan susunan batu bata yang berpotensi tidak stabil dan tambahkan batu bata baru ke dalam ruang kosong untuk membuat semuanya stabil, mencetak hasilnya. Ini harus dilakukan tanpa meningkatkan dimensi keseluruhan blok teks input.
Tujuannya adalah untuk membuat algoritma yang membuat struktur stabil dengan menambahkan batu bata sesedikit mungkin.
JSFiddle ( sumber ) ini memungkinkan Anda menghasilkan pengaturan bata secara acak untuk digunakan saat menguji program Anda. (Berharap saya bisa menumpuk potongan sebagai gantinya.) Width
Adalah jumlah batu bata pada lapisan dasar, Height
adalah jumlah lapisan batu bata, dan Density
merupakan fraksi ruang batu bata yang diisi.
Misalnya, dengan Width = 5, Height = 3, Density = 0.6
output yang mungkin
....[__]....[__]....
..[__]....[__]......
[__]............[__]
Cara untuk menstabilkan ini dengan 4 batu bata baru adalah
....[__]....[__]....
..[__][__][__][__]..
[__][__]....[__][__]
Program Anda harus dapat menstabilkan struktur bata apa pun yang dapat dihasilkan JSFiddle.
- Ini termasuk string kosong (yang dianggap stabil).
- Batu bata akan selalu seperti itu
[__]
. Periode (.
) hanya digunakan untuk kejelasan. Program Anda dapat menggunakan titik atau spasi untuk ruang kosong. - Struktur mungkin sudah stabil, dalam hal ini tidak ada yang perlu dilakukan (selain mencetaknya).
- JSFiddle selalu menghasilkan struktur yang dapat distabilkan (dengan menghindari
Width = 1
dan batu bata di sudut atas). Anda bisa mengandalkan ini. (Mengisi semua kecuali sudut atas pasti akan menstabilkan hal-hal tetapi ini jelas tidak optimal.) - Asumsikan tidak ada input yang tidak valid. Ambil input sebagai string sesuka Anda. Cetak struktur yang distabilkan ke stdout atau serupa.
- Ingat bahwa dimensi blok teks tidak boleh mengubah ukuran.
- Batu bata yang sudah ada sebelumnya tidak dapat dipindahkan atau dihapus. Penempatan batu bata baru harus mengikuti pola grid offset setiap baris lainnya. Semua batu bata harus sepenuhnya terikat.
- Sebaiknya (tetapi tidak diharuskan) agar Anda mencetak batu bata yang sudah ada sebagai
[XX]
gantinya[__]
, sehingga orang dapat lebih melihat bagaimana solusi Anda bekerja.
Mencetak gol
Di bagian bawah JSFiddle ada 8 pengaturan bata yang tidak stabil yang telah ditentukan. (Mereka menggunakan [__]
dan .
dan harus tetap seperti itu kecuali jika Anda menggunakan [XX]
dan / atau sebagai gantinya.) Beberapa acak dan beberapa saya buat sendiri. Untuk menghitung skor Anda, jalankan program Anda pada masing-masing secara bergantian dan jumlahkan jumlah batu bata baru yang ditambahkan ke masing-masing.
Semakin sedikit batu bata baru yang Anda tambahkan, semakin baik. Pengajuan dengan skor terendah akan menang. Dalam kasus ikatan, jawaban tertua menang.
Jika ada hal-hal yang diperdebatkan saya dapat menambahkan beberapa kasus yang telah ditentukan dan menilai pemenang berdasarkan pada mereka.
Catatan selanjutnya
- Program Anda perlu dijalankan berdasarkan urutan menit pada komputer modern untuk lebar dan tinggi kisi bata kurang dari 100. (Maks 10 menit pada komputer seperti ini .)
- Anda tidak boleh meng-hardcode output Anda untuk 8 struktur yang telah ditentukan. Program Anda harus memperlakukan mereka seperti halnya memperlakukan pengaturan lainnya.
- Harap sertakan satu atau dua contoh output, atau struktur menarik yang ingin Anda bagikan. :)
- Masalah ini agak terkait dengan menemukan pohon spanning minimum .
sumber
Jawaban:
Jawa - 5.056 batu bata
Kode sumber dapat dilihat di sini .
Kode ini berjalan dalam beberapa milidetik untuk salah satu dari 8 input penilaian. Ada beberapa output yang tampak suboptimal, terutama di menara silang dan kasus 99x99. Saya punya beberapa ide tentang cara meningkatkan rutinitas, tetapi ini cukup besar, dan karenanya saya akan membiarkannya sendiri untuk saat ini.
Keluarannya membantai hukum-hukum fisika hingga tingkat komedi. : D
Beberapa sampel ditunjukkan di bawah ini.
20x20, 0,03 Output
Output Rumah Sederhana
sumber
Python, 18992
Ini adalah solusi paling sederhana dan skor terburuk yang mungkin. Ini hanya untuk referensi; hal untuk dikalahkan. Itu mengisi setiap ruang kosong kecuali dua sudut atas dengan batu bata, menjamin stabilitas.
Untuk menggunakan salin struktur awal ke dalam tanda kutip tiga di bagian atas program.
Ini dijalankan di rumah, menambahkan 609 batu bata:
Jumlah batu bata yang ditambahkan untuk masing-masing dari 8 struktur yang telah ditentukan secara berurutan adalah
sumber