La sfida è scrivere il codice più veloce possibile per calcolare il permanente di una matrice .
Il permanente di una n
-by- n
matrix A
= ( a
i,j
) è definito come
Qui S_n
rappresenta l'insieme di tutte le permutazioni di [1, n]
.
Ad esempio (dal wiki):
In questa domanda le matrici sono tutte quadrate e avranno solo i valori -1
e 1
in esse.
Esempi
Ingresso:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Permanente:
-4
Ingresso:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Permanente:
0
Ingresso:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Permanente:
192
Ingresso:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Permanente:
1021509632
L'obiettivo
Dovresti scrivere un codice che, dato n
da una n
matrice, genera il suo permanente.
Poiché avrò bisogno di testare il tuo codice, sarebbe utile se tu potessi darmi un modo semplice per dare una matrice come input al tuo codice, ad esempio leggendo dallo standard in.
Tieni presente che il permanente può essere grande (la matrice all 1s è il caso estremo).
Punteggi e pareggi
Metterò alla prova il tuo codice su matrici casuali + -1 di dimensioni crescenti e mi fermerò la prima volta che il tuo codice impiega più di 1 minuto sul mio computer. Le matrici di punteggio saranno coerenti per tutti gli invii al fine di garantire l'equità.
Se due persone ottengono lo stesso punteggio, il vincitore è quello che è il più veloce per quel valore di n
. Se quelli sono entro 1 secondo l'uno dall'altro, è quello pubblicato per primo.
Lingue e biblioteche
È possibile utilizzare qualsiasi linguaggio e librerie disponibili, ma nessuna funzione preesistente per calcolare il permanente. Dove possibile, sarebbe bene poter eseguire il tuo codice, quindi per favore includi una spiegazione completa su come eseguire / compilare il tuo codice in Linux, se possibile ».
Implementazioni di riferimento
Esiste già una domanda di codegolf con un sacco di codice in diverse lingue per il calcolo del permanente per piccole matrici. Mathematica e Maple hanno entrambe implementazioni permanenti se è possibile accedervi.
La mia macchina I tempi verranno eseguiti sulla mia macchina a 64 bit. Questa è un'installazione Ubuntu standard con 8 GB di RAM, processore AMD FX-8350 Eight-Core e Radeon HD 4250. Ciò significa anche che devo essere in grado di eseguire il codice.
Informazioni di basso livello sulla mia macchina
cat /proc/cpuinfo/|grep flags
dà
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1pcpxcpp_pc_pc_pc_pc_pc_pc_pc_pc_pc_pp_pp_pp_px f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a disallineamento 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb cpb hw_pstate vmcdm_mc_v vmcv
Farò una domanda multilingue di follow-up strettamente correlata che non soffre del grande problema Int così gli amanti di Scala , Nim , Julia , Rust , Bash possono mostrare anche le loro lingue.
Classifica
- n = 33 (45 secondi. 64 secondi per n = 34). Ton Hospel in C ++ con g ++ 5.4.0.
- n = 32 (32 secondi). Dennis in C con gcc 5.4.0 usando le bandiere gcc di Ton Hospel.
- n = 31 (54 secondi). Christian Sievers in Haskell
- n = 31 (60 secondi). primo in rpython
- n = 30 (26 secondi). ezrast in Rust
- n = 28 (49 secondi). xnor con Python + pypy 5.4.1
- n = 22 (25 secondi). Shebang con Python + pypy 5.4.1
Nota . In pratica i tempi per Dennis e Ton Hospel variano molto per ragioni misteriose. Ad esempio sembrano essere più veloci dopo che ho caricato un browser web! I tempi indicati sono i più veloci in tutti i test che ho fatto.