Tantangannya adalah untuk menulis kode tercepat yang mungkin untuk menghitung permanen dari sebuah matriks .
Permanen dari n
-by- n
matrix A
= ( a
i,j
) didefinisikan sebagai
Di sini S_n
mewakili set semua permutasi dari [1, n]
.
Sebagai contoh (dari wiki):
Dalam pertanyaan ini semua matriks berbentuk bujur sangkar dan hanya akan memiliki nilai -1
dan 1
di dalamnya.
Contohnya
Memasukkan:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Permanen:
-4
Memasukkan:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Permanen:
0
Memasukkan:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Permanen:
192
Memasukkan:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Permanen:
1021509632
Tugas
Anda harus menulis kode yang, diberikan n
oleh n
matriks, menghasilkan permanen.
Karena saya perlu menguji kode Anda, akan sangat membantu jika Anda dapat memberikan cara sederhana bagi saya untuk memberikan matriks sebagai input ke kode Anda, misalnya dengan membaca dari standar di.
Berhati-hatilah karena permanen bisa besar (semua matriks 1s adalah kasus ekstrim).
Skor dan dasi
Saya akan menguji kode Anda secara acak + -1 matriks ukuran yang meningkat dan menghentikan pertama kali kode Anda membutuhkan lebih dari 1 menit di komputer saya. Matriks penilaian akan konsisten untuk semua pengiriman untuk memastikan keadilan.
Jika dua orang mendapatkan skor yang sama maka pemenangnya adalah yang tercepat untuk nilai tersebut n
. Jika mereka berada dalam 1 detik satu sama lain maka itu adalah yang diposting terlebih dahulu.
Bahasa dan perpustakaan
Anda dapat menggunakan bahasa dan pustaka yang tersedia yang Anda suka tetapi tidak ada fungsi yang sudah ada sebelumnya untuk menghitung permanen. Jika memungkinkan, alangkah baiknya untuk dapat menjalankan kode Anda, jadi silakan sertakan penjelasan lengkap tentang cara menjalankan / kompilasi kode Anda di Linux jika memungkinkan. `
Implementasi referensi
Sudah ada pertanyaan pertanyaan codegolf dengan banyak kode dalam berbagai bahasa untuk menghitung permanen untuk matriks kecil. Mathematica dan Maple juga memiliki implementasi permanen jika Anda dapat mengaksesnya.
Mesin Saya Pengaturan waktu akan dijalankan pada mesin 64-bit saya. Ini adalah instalasi ubuntu standar dengan RAM 8GB, Prosesor Delapan-Core AMD FX-8350 dan Radeon HD 4250. Ini juga berarti saya harus dapat menjalankan kode Anda.
Informasi tingkat rendah tentang mesin saya
cat /proc/cpuinfo/|grep flags
memberi
Flags flag: fpu vme de pse tc tl msr pae mce cx8 apic mc mcr pge mca f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_nb cpb hw_memilikibataspermukaantidakmemilikibubuhmemutuskanmemutuskanmemutakhirkansampai3dakmemutakhirkandenganmemutakhirkankekdot
Saya akan mengajukan pertanyaan multi-bahasa lanjutan yang tidak terkait dengan masalah Int besar sehingga pecinta Scala , Nim , Julia , Rust , Bash dapat memamerkan bahasa mereka juga.
Papan pemimpin
- n = 33 (45 detik. 64 detik untuk n = 34). Ton Hospel dalam C ++ dengan g ++ 5.4.0.
- n = 32 (32 detik). Dennis dalam C dengan gcc 5.4.0 menggunakan bendera gcc Ton Hospel.
- n = 31 (54 detik). Christian Sievers di Haskell
- n = 31 (60 detik). primo dengan rpython
- n = 30 (26 detik). ezrast di Rust
- n = 28 (49 detik). xnor dengan Python + pypy 5.4.1
- n = 22 (25 detik). Shebang dengan Python + pypy 5.4.1
Catatan . Dalam praktiknya penentuan waktu untuk Dennis dan Ton Hospel sangat bervariasi karena alasan misterius. Misalnya mereka tampaknya lebih cepat setelah saya memuat peramban web! Pengaturan waktu yang dikutip adalah yang tercepat dalam semua tes yang telah saya lakukan.