Pertimbangkan kisi N
x N
elemen unik. Setiap elemen memiliki huruf (dari A ke N
huruf ke - th, inklusif) dan angka (dari 1 ke N
, termasuk). Oleh karena itu, setiap pasangan angka / huruf berada di grid tepat sekali.
Tugas Anda adalah mengatur kisi sedemikian rupa sehingga:
Setiap baris, kolom, dan diagonal (termasuk pembungkus) berisi setiap huruf dan angka tepat sekali.
Dengan membungkus, maksud saya itu
* * * # *
* * # * *
* # * * *
# * * * *
* * * * #
adalah diagonal, bersama dengan semua diagonal serupa yang mengenai tepi.
Contoh 5x5
kisi adalah:
A1 B2 C3 D4 E5
C4 D5 E1 A2 B3
E2 A3 B4 C5 D1
B5 C1 D2 E3 A4
D3 E4 A5 B1 C2
Tugas Anda adalah menulis program yang menerima angka N
,, dan mencetak N
x N
grid seperti dijelaskan di atas. Program Anda harus bekerja untuk apa saja 0 < N <= 26
. Jika kisi tertentu tidak memungkinkan, maka Anda harus mencetak Impossible
.
Hardcoding jawaban untuk apa pun N
tidak diperbolehkan. Suatu program dikodekan secara keras jika ia menghitung kisi-kisi dengan cara yang berbeda (seperti yang dinilai oleh saya) untuk setiap N > 26
(atau jika gagal menghitung). (Ini dimaksudkan untuk mencegah pra perhitungan, termasuk kisi-kisi tidak valid yang sudah dihitung sebelumnya, atau offset untuk kisi yang diberikan).
Ini adalah masalah kode tercepat, dan skor Anda adalah jumlah waktu yang dibutuhkan untuk menjalankan program Anda di semua kemungkinan N
di komputer saya. Dalam jawaban Anda, harap jalankan program Anda di semua N
(jadi saya hanya perlu waktu sekali). Jika tidak ada program yang dapat menghitungnya dalam waktu kurang dari 60 detik, maka pemenangnya adalah jawaban yang dapat menghitung kisi dengan yang terbesar N
dalam 60 detik. Jika beberapa program memiliki maksimum yang sama N
, maka tiebreak adalah solusi tercepat.
(Saya memiliki mesin Windows 8 yang diberdayakan dengan baik, dan setiap kompiler atau juru bahasa yang dibutuhkan harus tersedia secara bebas untuk itu)
sumber
Jawaban:
Python 3
Bagaimana itu bekerja?
Implementasi naif adalah untuk melihat melalui semua pengaturan yang mungkin dari huruf dan angka dalam kotak NxN dan mencari yang juga merupakan Orthogonal-Diagonal Latin Square (ODLS) (dan dengan demikian, untuk beberapa itu hanya harus melalui semua konfigurasi dan kembali tidak mungkin). Algoritma seperti itu tidak sesuai dengan tantangan ini karena kompleksitas waktu yang absurd. Jadi ada tiga penyederhanaan dan justifikasi utama (sebagian bukti dan wawasan mengapa ini bekerja) untuk konstruksi ODLS yang digunakan dalam implementasi saya:
Yang pertama adalah anggapan bahwa kita hanya perlu menghasilkan Diagonal Latin Square yang valid (Sebuah kotak NxN sehingga setiap baris, kolom, diagonal-terbungkus berisi setiap elemen dari set N elemen yang berbeda tepat sekali) dari huruf N pertama dari alfabet. Jika kita dapat membangun Diagonal Latin Square (DLS) seperti itu maka ODLS dapat dibangun menggunakan DLS dengan pertukaran elemen yang tepat dan membalik. Pembenaran:
Penyederhanaan kedua adalah gagasan bahwa jika kami menemukan konfigurasi yang cocok (SC) dari satu elemen (A NxN grid sehingga setiap baris, kolom, dibungkus-diagonal berisi elemen itu tepat sekali), maka DLS dapat dibangun dengan mengganti elemen dan menggeser SC. Pembenaran:
Penyederhanaan terakhir adalah sebagai berikut - semua DLS dari prime N, kecuali untuk N = 2 atau N = 3, dapat dikonstruksikan, dan jika N dapat difaktorkan menjadi dua angka yang DLS yang sesuai dapat dibangun, maka DLS dari N dapat dibangun. Saya menduga bahwa kebalikannya juga berlaku. (Dengan kata lain kita hanya bisa membuat DLS untuk N yang tidak dapat dibagi 2 atau 3)
Gambar yang saya maksud dengan DLS yang lebih kecil - lebih besar
sumber