Tantangan dengan aturan sederhana tetapi algoritma non-sepele. :-)
Tugas
Ambil input dalam bentuk bilangan bulat yang dipisahkan oleh ruang:
N A B S
Di mana N adalah panjang sisi dari matriks persegi 2D yang diisi dengan angka unik (bilangan bulat) antara A dan B inklusif. Untuk setiap baris dan kolom dalam matriks ini, jumlah selalu sama: S. (Dengan kata lain, matriks adalah kuadrat semi-ajaib).
catatan:
Semua angka positif. Pengecualian adalah A, yang bisa 0.
Contohnya
Untuk
3 1 10000 2015
solusi yang valid adalah
Untuk
8 1 300 500
solusi yang valid adalah
Keluaran
Output Anda harus berupa tabel ASCII. Contoh untuk contoh pertama di atas:
384 159 1472
1174 499 342
457 1357 201
Bilangan bulat kanan diluruskan oleh spasi. Lebar setiap kolom adalah lebar bilangan bulat terbesar di kolom itu.
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte menang. Celah standar berlaku (terutama tentang built-in untuk mengatasi masalah ini). Anda tidak perlu peduli dengan input yang salah atau tidak mungkin (termasuk angka negatif). Harap berikan contoh keluaran dalam jawaban Anda (wajib) untuk contoh kedua di atas.
A
,B
, danN
bisa negatif?Jawaban:
CJam,
11991 byteIni adalah pendekatan yang terbukti benar, non-deterministik.
Di desktop saya, test case kedua umumnya selesai dalam waktu kurang dari 10 menit.
Kasing pertama selesai secara instan. Cobalah online di juru bahasa CJam .
Contoh dijalankan
Ide
Tanpa batas waktu, kita bisa membuat kotak secara acak sampai menemukan kotak yang valid. Pendekatan ini dibangun di atas gagasan itu, menambahkan dua optimisasi:
Alih-alih pseudo-acak menghasilkan persegi panjang sisi N , kami menghasilkan kuadrat panjang sisi N-1 , tambahkan satu kolom untuk membentuk persegi panjang N × (N-1) yang barisnya memiliki jumlah S , lalu satu baris untuk membentuk kuadrat dari sisi panjang N yang kolom memiliki sum S .
Karena jumlah unsur semua kolom akan NS dan jumlah dari unsur-unsur yang pertama N-1 baris adalah (N-1) S , baris terakhir akan juga memiliki jumlah S .
Namun, proses ini dapat menghasilkan matriks yang tidak valid, karena tidak ada jaminan bahwa semua elemen dari baris dan kolom terakhir akan unik atau termasuk dalam rentang [A ... B] .
Memilih kuadrat bilangan bulat unik dalam [A ... B] dan panjang sisi N-1 secara seragam secara acak akan memakan waktu terlalu lama. Kami entah bagaimana harus memprioritaskan kotak yang memiliki peluang lebih tinggi untuk menghasilkan kuadrat panjang sisi N yang valid setelah menerapkan proses yang dirinci pada poin sebelumnya.
Mengingat bahwa setiap baris dan kolom harus memiliki jumlah S , unsur-unsurnya memiliki rata-rata S / N . Jadi, memilih lebih banyak elemen yang mendekati rata-rata itu akan meningkatkan peluang kita.
Untuk setiap I di [A ... B] , kami pseudo-secara acak memilih float antara 0 dan (I - S / N) 2 + 1 dan mengurutkan elemen [A ... B] dengan mengapung yang dipilih. Kami menyimpan nomor N 2 pertama dan menempatkannya dalam urutan membaca di kotak.
Dengan asumsi distribusi yang seragam sempurna dari semua bilangan real antara 0 dan (I - S / N) 2 +1 di setiap langkah, semua kotak memiliki probabilitas yang tidak nol untuk dipetik, yang berarti bahwa proses tersebut akan selesai pada akhirnya.
Kode
sumber