Wyzwanie polega na napisaniu najszybszego możliwego kodu do obliczenia stałej macierzy .
Stała n
-by- n
matrix A
= ( a
i,j
) jest zdefiniowana jako
Tutaj S_n
reprezentuje zestaw wszystkich permutacji [1, n]
.
Jako przykład (z wiki):
W tym pytaniu macierze są kwadratowe i mają tylko wartości -1
i 1
na nich.
Przykłady
Wkład:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Stały:
-4
Wkład:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Stały:
0
Wkład:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Stały:
192
Wkład:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Stały:
1021509632
Zadanie
Powinieneś napisać kod, który podany n
przez n
macierz, wyprowadza swój stały.
Ponieważ będę musiał przetestować kod, pomocne byłoby podanie prostego sposobu na przekazanie macierzy jako danych wejściowych do kodu, na przykład poprzez czytanie ze standardowego w.
Ostrzegamy, że permanent może być duży (skrajna macierz wszystkich 1s).
Wyniki i krawaty
Przetestuję twój kod na losowych matrycach + -1 o coraz większym rozmiarze i zatrzymam się, gdy twój kod po raz pierwszy zajmie więcej niż 1 minutę na moim komputerze. Macierze oceny będą spójne dla wszystkich wniosków, aby zapewnić uczciwość.
Jeśli dwie osoby otrzymają ten sam wynik, zwycięzcą jest ta, która jest najszybsza dla tej wartości n
. Jeśli są one w odległości 1 sekundy od siebie, to jest to pierwszy.
Języki i biblioteki
Możesz użyć dowolnego dostępnego języka i bibliotek, które ci się podobają, ale nie ma wcześniejszej funkcji do obliczenia stałej. Tam, gdzie jest to wykonalne, dobrze byłoby móc uruchomić kod, więc proszę podać pełne wyjaśnienie, jak uruchomić / skompilować kod w systemie Linux, jeśli to w ogóle możliwe.
Referencyjne implementacje
Jest już pytanie o kodegolfa z dużą ilością kodu w różnych językach do obliczania stałej dla małych matryc. Zarówno Mathematica, jak i Maple mają również stałe implementacje, jeśli masz do nich dostęp.
Moja maszyna Czasy będą działać na moim 64-bitowym komputerze. Jest to standardowa instalacja ubuntu z 8 GB pamięci RAM, ośmiordzeniowym procesorem AMD FX-8350 i Radeon HD 4250. Oznacza to również, że muszę mieć możliwość uruchomienia kodu.
Informacje niskiego poziomu o mojej maszynie
cat /proc/cpuinfo/|grep flags
daje
flagi: 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 pdpe1gb rdtscp lm constant_tsc rep_good nopl fqqm_sfs_sf_sfs_sfs 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_core perfctr_nb cpb hw_psts vmcall vmmcall bmw
Zadam ściśle powiązane, wielojęzyczne pytanie, które nie cierpi z powodu dużego problemu Int, więc miłośnicy Scali , Nima , Julii , Rusty i Basha mogą również pochwalić się swoimi językami.
Tablica liderów
- n = 33 (45 sekund. 64 sekundy dla n = 34). Ton Hospel w C ++ z g ++ 5.4.0.
- n = 32 (32 sekundy). Dennis w C z gcc 5.4.0 przy użyciu flag gcc Ton Hospel.
- n = 31 (54 sekund). Christian Sievers w Haskell
- n = 31 (60 sekund). primo w rpython
- n = 30 (26 sekund). ezrast in Rust
- n = 28 (49 sekund). xnor z Python + pypy 5.4.1
- n = 22 (25 sekund). Shebang z Python + pypy 5.4.1
Uwaga . W praktyce terminy Dennisa i Tona Hospela są bardzo różne z tajemniczych powodów. Na przykład wydają się być szybsze po załadowaniu przeglądarki internetowej! Podane czasy są najszybsze we wszystkich testach, które przeprowadziłem.