Siendo un hacker de Haskell, prefiero la notación de punto libre en lugar de significativa. Desafortunadamente, algunas personas encuentran que la notación de punto libre es difícil de leer, y me resulta difícil obtener el número correcto de paréntesis cuando escribo en punto. ¡Ayúdame a convertir el código escrito en punto libre a notación significativa!
Acerca de
En notación sin puntos, usamos puntos (sí, realmente) para alimentar la salida de una función a otra. Digamos, si tenía una función succ
que toma un número y le agrega 1, y desea hacer una función que agregue 3 a un número, en lugar de hacer esto:
\x -> succ(succ(succ(x)))
podrías hacer esto:
succ.succ.succ
Sin embargo, Pointfree solo funciona con funciones que toman un solo parámetro (en este desafío de todos modos), por lo que si nuestra función no fuera succ
más add
que tomar 2 números y agregarlos, tendríamos que alimentar sus argumentos hasta que solo quede uno:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Por último, las funciones pueden tomar otras funciones como argumentos:
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
Entrada y salida esperada
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
Reglas
- Su salida puede tener más espacios o paréntesis de los necesarios, siempre que estén equilibrados
- No tiene que asegurarse de que el nombre de la variable que cree
\x
ya no se use en otro lugar del código - Es su elección si crear una función o un programa completo
- Esto es
codegolf
, ¡el código más corto en bytes gana!
Es posible que encuentre contundente útil, convierte entre las dos notaciones (pero también factoriza el código cuando sea posible): https://blunt.herokuapp.com
(+).(*3)
es lo mismo que\x y->3*x+y
(.).(.)
que se convierte a\i b c f -> i (b c f)
.
con a(
, anteponga a\x
y agregue un correspondientex
y tantos)
como sea necesario? ¿O es más complicado que eso?\ d->f(\k->f(f d k))
, pero puedes suponer que todos los puntos se alimentan de dos argumentos en este desafíoRespuestas:
Haskell,
163 142133 bytesPruébalo en Ideone.
Sin golf:
fuente
Haskell,
402289 bytesBastante largo, pero creo que funciona ...
fuente