Dengan bilangan bulat positif di bawah 1000, tampilkan semua segi empat yang mungkin dengan area itu.
Tugas
Katakanlah inputnya adalah 20. Kita bisa membuat persegi panjang 20 × 1, 10 × 2, atau 5 × 4, jadi ini adalah output yang valid:
********************
**********
**********
*****
*****
*****
*****
Perhatikan bahwa setiap kotak yang mungkin muncul persis sekali.
Persegi panjang mungkin muncul dalam urutan, orientasi, atau posisi apa pun, tetapi tidak ada dua persegi panjang yang bisa tumpang tindih atau menyentuh, bahkan di sudut-sudutnya. Berikut ini juga valid:
********************
****
********** ****
********** ****
****
****
Mencetak gol
Area kotak pembatas (BBA) dari output adalah area persegi panjang minimum yang melingkupi semua persegi panjang. Pada contoh output pertama, ukurannya adalah 20 × 9, jadi BBA adalah 180. Pada output contoh kedua, ukurannya adalah 20 × 7, jadi BBA hanya 140.
Temukan BBA dari output ketika inputnya adalah 60, 111, 230, 400, dan 480, dan tambahkan. Lipat gandakan jumlah ini dengan ukuran kode Anda dalam byte. Hasilnya adalah skor Anda; kemenangan skor terendah.
Aturan
- Program (atau fungsi) harus menghasilkan output yang valid untuk setiap bilangan bulat positif di bawah 1000.
- Output harus mengandung hanya tanda bintang (
*
), spasi (), dan baris baru.
- Mungkin ada jumlah ruang antara persegi panjang, tetapi ini diperhitungkan BBA.
- Leading atau trailing lines atau kolom, jika hanya memiliki spasi, tidak diperhitungkan BBA.
sumber
Jawaban:
Ruby, 228 byte * 21895 = 4992060
Beberapa perubahan dari kode ungolfed. Yang terbesar adalah perubahan makna variabel
m
dari tinggi persegi panjang kuadrat, ke tinggi persegi panjang kuadrat plusn
.Sepele,
*40
telah diubah*n
yang berarti banyak ruang putih yang tidak perlu di sebelah kanan untuk besarn
; dan-2
diubah menjadi0
yang berarti persegi panjang diplot di bagian bawah selalu kehilangan dua kolom pertama (ini menghasilkan pengepakan yang lebih buruk untuk angka yang hanya faktorisasi(n/2)*2
)Penjelasan
Saya akhirnya menemukan waktu untuk kembali ke ini.
Untuk diberikan
n
, bidang terkecil harus memiliki ruang yang cukup untuk persegi panjang terpanjang1*n
dan persegi panjang paling langkax*y
. Seharusnya jelas bahwa tata letak terbaik dapat dicapai jika kedua persegi panjang memiliki sisi panjangnya yang berorientasi pada arah yang sama.Mengabaikan persyaratan spasi putih di antara persegi panjang, kami menemukan bahwa total area adalah salah satu
(n+y)*x = (n+n/x)*x
ataun*(x+1)
. Either way, ini dievaluasi menjadin*x + n
. Termasuk spasi putih, kita harus memasukkan tambahanx
jika kita menempatkan persegi panjang ujung ke ujung, ataun
jika kita menempatkan persegi panjang berdampingan. Karena itu yang pertama lebih disukai.Ini memberikan lowerbound berikut
(n+y+1)*x
untuk area lapangan:Ini menyarankan algoritma berikut:
Sebenarnya mungkin untuk mendapatkan semua persegi panjang untuk kasus uji yang diperlukan dalam batas bawah yang disebutkan di atas, dengan pengecualian 60, yang menghasilkan 71 * 8 = 568 output berikut. Ini dapat ditingkatkan sedikit menjadi 60 * 9 = 540 dengan memindahkan dua persegi panjang tertipis ke kanan menjadi satu kotak lalu naik, tetapi penghematannya minimal, jadi mungkin tidak ada gunanya kode tambahan.
Ini memberi total area 21895.
Kode tidak dikunci
sumber
CJam, 90385 * 31 byte = 2801935
Uji di sini. Gunakan skrip ini untuk menghitung BBA.
Ini hanyalah solusi naif untuk memulai sesuatu.
sumber
Ruby, 56 byte
90385 * 56 = 5061560 dengan asumsi output sama dengan Martin (saya percaya begitu.)
Inilah fungsi lain yang bermanfaat, dalam program uji yang berguna
Yang memberikan output berikut, untuk referensi:
sumber