Buradaki zorluk, bir matrisin kalıcılığını hesaplamak için mümkün olan en hızlı kodu yazmaktır .
Bir n
-by- n
matrix A
= ( a
i,j
) kalıcılığı olarak tanımlanır.
İşte S_n
tüm permütasyonlar kümesini temsil eder [1, n]
.
Örnek olarak (wiki'den):
Bu soruda matrislerin hepsi karedir ve sadece değerleri -1
ve 1
içlerinde olacaktır.
Örnekler
Giriş:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Kalıcı:
-4
Giriş:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Kalıcı:
0
Giriş:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Kalıcı:
192
Giriş:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Kalıcı:
1021509632
Görev
Bir matris n
tarafından verilen n
, kalıcı bir çıktı veren kod yazmalısınız .
Kodunuzu sınamaya ihtiyacım olacağı için, kodunuza giriş olarak bir matris vermem için, örneğin standarttan standart olarak okuyarak, basit bir yol vermeniz yararlı olacaktır.
Kalıcılığın büyük olabileceği konusunda uyarılmalıdır (hepsi 1 matrisi en uç durumdur).
Puanlar ve bağlar
Kodunuzu, artan boyutta rastgele + -1 matrislerde test edeceğim ve kodumun bilgisayarımda 1 dakikadan fazla sürdüğü zaman durduracağım. Puanlama matrisleri, adaleti sağlamak için tüm başvurular için tutarlı olacaktır.
İki kişi aynı puanı alırsa, kazanan o değer için en hızlı olandır n
. Eğer bunlar birbirlerinin 1 saniye içinde ise, o zaman ilk gönderilenlerden biridir.
Diller ve kütüphaneler
İstediğiniz herhangi bir dili ve kütüphaneyi, kalıcı olarak hesaplamak için önceden var olan bir işlevi olmayan ancak istediğiniz dili kullanabilirsiniz. Mümkünse, kodunuzu çalıştırmanız iyi olur, bu yüzden lütfen mümkünse Linux'ta kodunuzu nasıl çalıştıracağınıza / derleyeceğinize dair tam bir açıklama ekleyin. '
Referans uygulamaları
Küçük matrisler için kalıcıları hesaplamak için farklı dillerde birçok kod içeren bir codegolf soru sorusu zaten var . Bunlara erişebiliyorsanız, Mathematica ve Maple da kalıcı uygulamalara sahiptir.
Benim Makine zamanlamaları benim 64 bit makinede işletilecek. Bu, 8GB RAM, AMD FX-8350 Sekiz Çekirdekli İşlemci ve Radeon HD 4250 ile standart bir ubuntu kurulumudur. Bu, kodunuzu da çalıştırabilmem gerektiği anlamına gelir.
Makinem hakkında düşük seviye bilgi
cat /proc/cpuinfo/|grep flags
verir
bayraklar: fp v5 de pse a tc msc pae mce cx8 apc sfc sfc sfc sfc s4 sfc sfc sfc s4 sd sd sd sd sd sd sd sd sd sd sd sd sd sd sd sd sd sd sd sdt f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt
Scala , Nim , Julia , Rust , Bash severlerin de dillerini gösterebilmeleri için büyük Int probleminden muzdarip olmayan çok dilli bir soruyu yakından takip edeceğim .
Liderler Sıralaması
- n = 33 (45 saniye, n = 34 için 64 saniye). C ++ ' da Ton Hospel , g ++ 5.4.0 ile.
- n = 32 (32 saniye). Dennis içinde C gcc 5.4.0 ile Ton Hospel en gcc bayrakları kullanarak.
- n = 31 (54 saniye). Hıristiyan Sievers içinde Haskell
- n = 31 (60 saniye). rpython içinde primo
- n = 30 (26 saniye). Rust içinde ezrast
- n = 28 (49 saniye). Python + pypy ile xnor 5.4.1
- n = 22 (25 saniye). Python + pypy ile Shebang
Not . Uygulamada Dennis ve Ton Hospel'in zamanlamaları gizemli sebeplerden dolayı çok fazla çeşitlilik gösterir. Örneğin, bir web tarayıcısı yükledikten sonra daha hızlı görünüyorlar! Alıntı yaptığım zamanlamalar, yaptığım tüm testlerde en hızlı olanı.