0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Provalo online!
Un'implementazione abbastanza diretta che ricorre su 2 variabili.
Ecco come possiamo ottenere questa soluzione. Inizia con il codice che implementa una formula ricorsiva diretta:
54 byte
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Provalo online!
utilizzando l'interpretazione rook mossa di flawr , a%b
è il numero di percorsi che ottengono la torre da (a,b)
a (0,0)
, utilizzando muove solo la diminuzione una coordinata. La prima mossa diminuisce a
o diminuisce b
, mantenendo l'altra uguale, quindi la formula ricorsiva.
49 byte
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Provalo online!
Possiamo evitare la ripetizione map(a%)[0..b-1]++map(b%)[0..a-1]
osservando che le due metà sono uguali a
e b
scambiate. La chiamata ausiliariaa?b
conta i percorsi in cui diminuisce la prima mossa a
, quindi b?a
conta quelli in cui diminuisce la prima mossa b
. Questi sono generalmente diversi e si aggiungono a a%b
.
La sintesi in a?b
può anche essere scritta come una comprensione della lista a?b=sum[a%i|i<-[0..b-1]]
.
42 byte
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Provalo online!
Alla fine, ci liberiamo %
e scriviamo semplicemente la ricorsione in termini di?
sostituendola a%i
con a?i+i?a
nella chiamata ricorsiva.
Il nuovo caso base fa sì che questo ?
dia un output doppio rispetto a quello della versione ?
a 49 byte, poiché con 0?0=1
, avremmo 0%0=0?0+0?0=2
. Ciò consente di definire f n=n?n
senza il dimezzamento che gli altri dovrebbero fare.