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%bc'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 aou 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 aet béchangées. L'appel auxiliaire a?bcompte les chemins où le premier mouvement diminue a, et b?acompte 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?bpeut é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%ipar a?i+i?adans 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?nsans réduire de moitié ce que nous aurions dû faire d'autre.