Écrivez un combinateur à virgule fixe en aussi peu de caractères que possible, dans la langue de votre choix.
- forme libre ( c'est-à - dire ce qui est le plus court): programme entier, fonction réelle, extrait de code
- vous ne pouvez pas utiliser votre bibliothèque standard si elle en a une
- vous pouvez cependant l'extraire d'autres fonctions de haut niveau si vous préférez le faire plutôt que de le construire à partir des bases
Veuillez inclure une factorielle récursive ou Fibonacci qui l'utilise comme démo.
Dans cette question, l'auto-référence est acceptable, le but est uniquement de la retirer de la fonction récursive à laquelle elle s'appliquera.
(define Y(lambda(f)(f(Y f))))
?)Réponses:
Haskell: 10 caractères
Exemple d'utilisation pour créer des définitions récursives de factorielle ou nième-Fibonacci:
Cependant, une façon plus courante d'utiliser
y
serait de générer ces séquences directement, plutôt qu'en tant que fonctions:Bien sûr, avec Haskell, c'est un peu comme tirer du poisson dans un tonneau! La
Data.Function
bibliothèque a cette fonction, appeléefix
, bien que mise en œuvre un peu plus verbalement.la source
Perl, 37
Démonstration factorielle:
Démonstration de Fibonacci:
la source
GNU C - 89 caractères
Exemple:
la source
k2, 12 caractères
La mise en œuvre autoréférentielle évidente est la plus courte. C'est un signe de bonne conception du langage. Malheureusement, K n'est pas paresseux, nous ne pouvons donc gérer que les appels par valeur.
Cette définition devrait également fonctionner en k4 et q sans problème, bien que je suppose que k2 pour les exemples ci-dessous.
Un 18 caractères plus modestes nous permet de transcrire exactement
(λx. x x) (λxyz. y (x x y) z)
en K.Peut-être qu'un jour (k7?), Cela pourrait ressembler
Y:{x Y x}
.la source
Python 3, 30 octets
Démo:
Crédits: https://gist.github.com/WoLpH/17552c9508753044e44f
la source