CJam ( 58 56 karakter)
Bazı karakterler yazdırılamaz ve biri StackExchange yazılımı tarafından yönetilecek bir sekmedir:
"¶3¬î¿Á· 7ÛÈmÈÚÚ¡"256b454b212f-{__W%.*A<1b+}qi*-4=
Çevrimiçi demo . Bu, yaklaşık üç saniye içinde n = 400 için çevrimiçi olarak çalışacaktır.
Kodlayan xxd
:
0000000: 22b6 0233 93ac eebf c1b7 0609 3794 dbc8 "..3........7...
0000010: 6dc8 1015 dada a122 3235 3662 3435 3462 m......"256b454b
0000020: 3231 3266 2d7b 5f5f 5725 2e2a 413c 3162 212f-{__W%.*A<1b
0000030: 2b7d 7169 2a2d 343d +}qi*-4=
açıklama
Möbius merdiveni temel olarak iki ekstra kenarı olan bir merdivendir. Merdiven üzerindeki sınırlı bir orman göz önüne alındığında, Möbius merdivenindeki 1 ile 4 arası sınırlı ormana kaldırılabilir. Kenarlar, derece 3 tepe noktası veya döngü oluşturmadığı sürece eklenebilir. Dört köşenin dereceleri ve ara bağlantıları merdiven üzerinde 116 sınıf sınırlı orman oluşturur, ancak bazıları dikdörtgenin simetrileri nedeniyle eşdeğerdir. N uzunluğundaki bir merdivenin n + 1 uzunluğundaki uzantılarını analiz etmek için bir program yazdım ve daha sonra sınıfları 26 denklik sınıfıyla birleştirdim. Bu kapalı bir form verir
⎡⎣⎢⎢⎢1111⎤⎦⎥⎥⎥T⎡⎣⎢⎢⎢1120223021410110⎤⎦⎥⎥⎥n−2⎡⎣⎢⎢⎢0100⎤⎦⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢221111122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢210001030100001020112100120100010011101100010110000020100000010110001140100011122⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n−2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢002200000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥+
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1244113222344⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢0001001000000021001011000200200002000031004001002000011000001000100100000000010003002002000001000010000200101000000110002001001000101020000012100101101000220010010200004⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥n−2⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1011201000121⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
bu nedenle değerler üç doğrusal yineleme alarak ve sonra bunları ekleyerek hızlı bir şekilde hesaplanabilir, ancak bu çok golf gibi görünmüyor.
Bununla birlikte, çeşitli karakteristik polinomların indirgenemez faktörlerini alır ve her birinden birini çoğaltırsak (çokluğu görmezden gelirsek), çalışan bir lineer nüks veren 10 derecelik bir polinom elde ederiz.
Yapıcı yaklaşım (58 karakter)
qi:Q2*,Wa*e!{Wa/{_W%e<}%$}%_&{{,1>},2few:~{:-z(Q(%}%0-!},,
Çevrimiçi demo . Sorunsuz bir şekilde n=2
ve n=3
biraz sabırla çevrimiçi olarak çalışacaktır . İçin n=1
bunun çöküyor, ama OP gereklerinden çantayı dışlamak seçmiştir çünkü temel bir sorun değil.
teşrih
qi:Q e# Take input from stdin, parse to int, store in Q
2*,Wa*e! e# Take all permutations of (0, -1, 1, -1, 2, -1, ..., -1, 2*Q-1)
{ e# Map to canonical form...
Wa/ e# Split around the -1s
{_W%e<}% e# Reverse paths where necessary to get a canonical form
$ e# Sort paths
}%
_& e# Filter to distinct path sets
{ e# Filter to path sets with valid paths:
{,1>}, e# Ignore paths with fewer than two elements (can't be invalid; break 2ew)
2few:~ e# Break paths into their edges
{:-z(Q(%}% e# The difference between the endpoints of an edge should be +/-1 or Q (mod 2Q)
e# So their absolute values should be 1, Q, 2Q-1.
e# d => (abs(d)-1) % (Q-1) maps those differences, and no other possible ones, to 0
e# NB {:-zQ(%}% to map them all to 1 would save a byte, but wouldn't work for Q=2
0-! e# Test that all values obtained are 0
},
, e# Count the filtered distinct path sets
Daha verimli bir sürüm 98 bayt alır:
qi2*:Q{a{__0=[1Q2/Q(]f+Qf%_&1$-\f{+E}~}:E~}/]{_W%>!},:MW=0{_{M\f{__3$_@&@:e<@|^{=}{^j}?}1b}{,)}?}j
Çevrimiçi demo
Bu, önce derinlik aramasıyla olası yolları oluşturur, daha sonra belirli bir köşe kümesi için olası kısıtlı ormanları sayan not edilmiş bir işlev kullanır. İşlev, belirli bir boş olmayan köşe kümesi için herhangi bir sınırlı ormanın en küçük tepe noktasını içeren bir yoldan ve o yolda olmayan köşe noktalarını kapsayan sınırlı bir ormandan oluşması temelinde yinelemeli olarak çalışır.
34, 241, 1582, 10204, 65197, 415076, 2638366, 16759249, 106427154, 675771276, 4290678337
.1
Çıktı ile neden girişin gerekli olmadığından emin değilim2
.