Latar Belakang
Dengan memperluas dan membatalkan persyaratan, mudah untuk menunjukkan identitas berikut:
Namun, ini merupakan masalah terbuka apakah semua persegi panjang 1 / n-oleh-1 / (n + 1) dapat membentuk kotak unit.
Tugas
Program Anda harus mengambil bilangan bulat positif N sebagai input dengan cara yang mudah, dan kemas semua persegi panjang 1 / n-by-1 / (n + 1) dengan n antara 1 dan N termasuk ke dalam unit square, sehingga tidak ada dua tumpang tindih .
Untuk setiap kotak Anda harus membuat bilangan bulat berikut secara berurutan:
- 1 jika tepi horisontal lebih panjang dari tepi vertikal, kalau tidak 0
- Pembilang dan penyebut koordinat-x sudut kiri bawah
- Pembilang dan penyebut koordinat y dari sudut kiri bawah
Perhatikan bahwa kita mengambil unit square menjadi (0, 1) x (0, 1)
, dengan nilai x berjalan dari kiri ke kanan, dan nilai y berjalan dari bawah ke atas.
Hasil akhir yang diharapkan adalah gabungan bilangan bulat ini untuk setiap persegi panjang dalam urutan peningkatan n, dalam format apa pun yang nyaman (misalnya dicetak ke stdout, atau sebagai daftar yang dikembalikan dari suatu fungsi).
Contoh Input dan Output
Memasukkan:
3
Keluaran:
0 0 1 0 1 1 1 2 0 1 1 1 2 1 3
Ini mem-parsing sebagai berikut:
0 (0/1, 0/1) 1 (1/2, 0/1) 1 (1/2, 1/3)
Mencetak gol
Ini adalah tantangan kode-golf, jadi jawabannya dengan byte paling sedikit menang. Namun, algoritma Anda juga harus cukup efisien; itu harus bisa berjalan untuk semua N<=100
dalam total sekitar 10 menit.
Solusi Anda harus memberikan solusi yang valid untuk semua N<=100
, tetapi algoritme yang lengkap dan lengkap juga dapat diterima meskipun itu bukan yang terpendek.
Jawaban:
Haskell,
263262 byteIni mengikuti algoritma yang dijelaskan dalam Paulhus 1997, Algoritma untuk Kotak Pengemasan , doi: 10.1006 / jcta.1997.2836 . Pengamatan utama dalam makalah, yang secara empiris jika tidak diverifikasi secara teoritis, adalah bahwa daerah yang tersisa setelah menempatkan persegi panjang dalam kotak dapat dibagi menjadi dua sub-kotak yang isiannya kemudian dapat dianggap independen.
Daripada menemukan sub-kotak lebar terkecil yang sesuai dengan persegi panjang berikutnya, kode melakukan pencarian di semua sub-kotak yang mungkin; dalam praktiknya ini tidak membuat perlambatan yang cukup besar untuk n <100.
Keluaran dalam bentuk daftar entri sebagai tupel dengan penanda fraksi
%
masih disertakan. Bilangan bulat dalam output yang diformat berada dalam urutan yang diinginkan, tetapi secara tegas beberapa post-processing akan diperlukan untuk menghasilkan daftar bilangan bulat saja.Contoh dijalankan:
*Main> f 5 (0,0 % 1,0 % 1),(0,1 % 2,0 % 1),(0,1 % 2,1 % 2),(0,3 % 4,1 % 2),(1,1 % 2,5 % 6)
Sunting: menghapus ruang yang salah setelah a
let
.sumber