Mathematica, 159 100 87 86 85 bajtów
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Aby zmienić, n
po prostu zmień definicję zmiennej na początku.
Ponieważ jest brutalna, działa dość wolno, ale oto pierwsze osiem wyników:
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
Ostatni z nich zajął już 231 sekund, a środowisko wykonawcze jest strasznie wykładnicze.
Wyjaśnienie
Jak powiedziałem, to brutalna siła. Zasadniczo po prostu wyliczam wszystkie możliwe A
i B
obliczam dwa produkty kropkowe dla każdej możliwej pary, a następnie znajduję ułamek par, które się wydały {0, 0}
. Kombinatoryka Mathematiki i funkcje algebry liniowej były bardzo pomocne w grze w golfa:
{1,-1}~(t=Tuples)~n
Generuje to wszystkie n-krotki zawierające 1
lub -1
, tj. Wszystkie możliwe A
. Bo n = 3
to jest:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Aby obliczyć B
, robimy prawie to samo:
{1,0,0,-1}~t~n
Powtarzając 0
, duplikujemy każdą krotkę dla każdej 0
jej zawartości, dzięki czemu 0
prawdopodobieństwo jest dwukrotnie większe niż 1
lub -1
. Ponownie używając n = 3
jako przykładu:
{{-1, -1, -1},
{-1, -1, 0}, {-1, -1, 0},
{-1, -1, 1},
{-1, 0, -1}, {-1, 0, -1},
{-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0},
{-1, 0, 1}, {-1, 0, 1},
{-1, 1, -1},
{-1, 1, 0}, {-1, 1, 0},
{-1, 1, 1},
{0, -1, -1}, {0, -1, -1},
{0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, -1, 0},
{0, -1, 1}, {0, -1, 1},
{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1},
{0, 1, -1}, {0, 1, -1},
{0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0},
{0, 1, 1}, {0, 1, 1},
{1, -1, -1},
{1, -1, 0}, {1, -1, 0},
{1, -1, 1},
{1, 0, -1}, {1, 0, -1},
{1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0},
{1, 0, 1}, {1, 0, 1},
{1, 1, -1},
{1, 1, 0}, {1, 1, 0},
{1, 1, 1}}
Teraz, dla każdego możliwego A
, chcemy iloczynu kropkowego każdego z tych możliwych B
, zarówno z, jak A[1 .. n]
i A[2 .. n+1]
. Np. Jeśli nasz prąd A
jest {1, 1, -1}
, chcemy produktu kropkowego zarówno z, jak {1, 1, -1}
i z {1, -1, 1}
. Ponieważ wszystkie nasze B
są już wygodnie rzędami macierzy, chcemy, aby dwie podlisty A
były kolumnami innej macierzy, abyśmy mogli obliczyć prosty iloczyn między nimi. Ale transpozycja {{1, 1, -1}, {1, -1, 1}}
po prostu daje, {{1, 1}, {1, -1}, {-1, 1}}
co jest tylko listą wszystkich 2-elementowych cyklicznych list podrzędnych A
. Tak to działa:
Partition[#,2,1,1]
Obliczamy to i bierzemy produkt kropkowy z naszą listą B
. Ponieważ otrzymujemy teraz listę zagnieżdżoną (ponieważ każdy możliwy A
daje osobny wektor), spłaszczamy je za pomocą ##&@@
.
Aby dowiedzieć się, czy dana para {x, y}
jest {0, 0}
obliczana, Sign[Norm[{x,y}]]
gdzie Norm
daje √(x²+y²)
. To daje 0
lub 1
.
Wreszcie, ponieważ teraz po prostu chcesz wiedzieć, ułamki 1
sekund na liście 0
s, a 1
wszystko, czego potrzebujemy jest średnią arytmetyczną z listy. Daje to jednak prawdopodobieństwo, że zarówno co najmniej jeden iloczyn punktowy będzie niezerowy, więc odejmujemy go, 1
aby uzyskać pożądany wynik.
n
Pomocne byłyby przypadki testowe dla pierwszych kilku osób . Może też pomóc wyraźny przykład A, B i dwóch wewnętrznych produktów.