Mathematica, 159 100 87 86 85 byte
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Per cambiare n
basta cambiare la definizione della variabile all'inizio.
Dal momento che è una forza bruta è piuttosto lento, ma ecco i primi otto risultati:
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
L'ultimo ha già impiegato 231 secondi e l'autonomia è orribilmente esponenziale.
Spiegazione
Come ho detto è una forza bruta. In sostanza, sto solo elencando tutto il possibile A
e B
, calcolo i due prodotti punto per ogni possibile coppia e quindi trovo la frazione di coppie che ha prodotto {0, 0}
. Le funzioni combinatorie di Mathematica e algebra lineare sono state molto utili per giocare a golf:
{1,-1}~(t=Tuples)~n
Questo genera tutte le n-tuple contenenti 1
o -1
, cioè, tutte le possibili A
. Per n = 3
quello è:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Per calcolare B
facciamo quasi lo stesso:
{1,0,0,-1}~t~n
Ripetendo 0
, dupliciamo ogni tupla per ciascuna 0
che contiene, aumentando così il 0
doppio di 1
o -1
. Sempre usando n = 3
come esempio:
{{-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}}
Ora, per ogni possibile A
, vogliamo che il prodotto scalare di ciascuna di quelle possibili B
, entrambi con A[1 .. n]
e A[2 .. n+1]
. Ad esempio, se la nostra corrente A
è {1, 1, -1}
, vogliamo il prodotto punto con entrambi {1, 1, -1}
e con {1, -1, 1}
. Dal momento che tutte le nostre B
sono già convenientemente le righe di una matrice, vogliamo le due liste secondarie A
come colonne di un'altra matrice, in modo da poter calcolare un semplice prodotto punto tra loro. Ma trasporre {{1, 1, -1}, {1, -1, 1}}
dà semplicemente {{1, 1}, {1, -1}, {-1, 1}}
quale è solo un elenco di tutte le liste secondarie cicliche a 2 elementi di A
. Questo è ciò che fa:
Partition[#,2,1,1]
Quindi lo calcoliamo e prendiamo il prodotto punto con il nostro elenco di B
. Dato che ora otteniamo un elenco nidificato (poiché ogni possibile A
produce un vettore separato), li appiattiamo con ##&@@
.
Per scoprire se una coppia {x, y}
è {0, 0}
calcoliamo Sign[Norm[{x,y}]]
dove Norm
dà √(x²+y²)
. Questo dà 0
o 1
.
Infine, dal momento che ora vogliamo solo sapere le frazioni di 1
s in un elenco di 0
s e 1
s tutti abbiamo bisogno è la media aritmetica della lista. Tuttavia, questo produce la probabilità che entrambi i prodotti con almeno un punto siano diversi da zero, quindi lo sottraggiamo 1
per ottenere il risultato desiderato.
n
sarebbero utili. Anche un esempio esplicito di A, B e dei due prodotti interni potrebbe essere d'aiuto.