0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Essayez-le en ligne!
Une implémentation assez directe qui se répète sur 2 variables.
Voici comment nous pouvons obtenir cette solution. Commencez avec le code implémentant une formule récursive directe:
54 octets
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Essayez-le en ligne!
En utilisant l'interprétation de déplacement de tour de flawr , a%b
c'est le nombre de chemins qui amènent la tour de (a,b)
à (0,0)
, en utilisant uniquement les mouvements pour diminuer une coordonnée. Le premier mouvement diminue a
ou diminue b
, en gardant l'autre le même, d'où la formule récursive.
49 octets
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Essayez-le en ligne!
Nous pouvons éviter la répétition en map(a%)[0..b-1]++map(b%)[0..a-1]
notant que les deux moitiés sont identiques a
et b
échangées. L'appel auxiliaire a?b
compte les chemins où le premier mouvement diminue a
, et b?a
compte donc ceux où le premier mouvement diminue b
. Ce sont en général différents, et ils s'ajoutent a%b
.
La sommation en a?b
peut également être écrite comme une compréhension de liste a?b=sum[a%i|i<-[0..b-1]]
.
42 octets
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Essayez-le en ligne!
Enfin, nous nous débarrassons %
et écrivons simplement la récursivité en termes de ?
en remplaçant a%i
par a?i+i?a
dans l'appel récursif.
Le nouveau cas de base fait que cela ?
donne des sorties le double de celles de la ?
version 49 octets, car avec 0?0=1
, nous aurions 0%0=0?0+0?0=2
. Cela permet d'utiliser définir f n=n?n
sans réduire de moitié ce que nous aurions dû faire d'autre.