Escriba un combinador de punto fijo en la menor cantidad de caracteres posible, en el idioma que elija.
- forma libre ( es decir , lo que sea más corto): programa completo, función real, fragmento de código
- no puede usar su biblioteca estándar si tiene una
- Sin embargo, puede extraerlo de otras funciones de alto nivel si prefiere hacerlo antes que construirlo desde las bases
Incluya un factorial recursivo o Fibonacci que lo use como demostración.
En esta pregunta, la autorreferencia es aceptable, el objetivo es únicamente eliminarla de la función recursiva a la que se aplicará.
(define Y(lambda(f)(f(Y f))))
?)Respuestas:
Haskell: 10 personajes
Ejemplo de uso para crear definiciones recursivas de factorial o nth-Fibonacci:
Sin embargo, una forma más común de usar
y
sería generar estas secuencias directamente, en lugar de como funciones:Por supuesto, con Haskell, ¡esto es como disparar a un pez en un barril! La
Data.Function
biblioteca tiene esta función, llamadafix
, aunque implementada de manera algo más detallada.fuente
Perl, 37
Demostración factorial:
Demostración de Fibonacci:
fuente
GNU C - 89 caracteres
Ejemplo:
fuente
k2, 12 char
La implementación autorreferencial obvia es la más corta. Esta es una señal de buen diseño del lenguaje. Desafortunadamente, K no es perezoso, por lo que solo podemos administrar la llamada por valor.
Esta definición también debería funcionar en k4 y q sin problemas, aunque supongo que k2 para los ejemplos a continuación.
Unos 18 caracteres más modestos nos permiten transcribir exactamente
(λx. x x) (λxyz. y (x x y) z)
a K.Tal vez algún día (k7?), Esto podría parecer
Y:{x Y x}
.fuente
Python 3, 30 bytes
Demo:
Créditos: https://gist.github.com/WoLpH/17552c9508753044e44f
fuente