Essendo un hacker di Haskell, preferisco la notazione senza senso piuttosto che puntuale. Sfortunatamente alcune persone trovano difficile leggere una notazione senza senso e trovo difficile ottenere il numero corretto di parentesi quando scrivo in modo puntuale. Aiutami a convertire il codice scritto in pointfree in notazione puntuale!
Di
Nella notazione senza punti usiamo i punti (sì, davvero) per alimentare l'output di una funzione in un'altra. Ad esempio, se hai una funzione succ
che accetta un numero e ne aggiunge 1, e volevi creare una funzione che aggiunge 3 a un numero, invece di farlo:
\x -> succ(succ(succ(x)))
potresti farlo:
succ.succ.succ
Pointfree funziona solo con funzioni che accettano comunque un singolo parametro (in questa sfida comunque), quindi se la nostra funzione non lo fosse succ
ma piuttosto add
che prende 2 numeri e li somma insieme, dovremmo alimentare gli argomenti fino a quando ne rimane solo uno:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Infine, le funzioni possono assumere altre funzioni come argomenti:
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))
Input e output attesi
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)))
Regole
- L'output potrebbe avere più spazi o parentesi del necessario, purché siano bilanciati
- Non devi assicurarti che il nome della variabile che crei
\x
non sia già utilizzato da qualche altra parte nel codice - Puoi scegliere se creare una funzione o un programma completo
- Questo è
codegolf
, il codice più corto in byte vince!
Potresti trovare utile contundente, converte tra le due notazioni (ma anche fattorizza il codice quando possibile): https://blunt.herokuapp.com
(+).(*3)
è lo stesso di\x y->3*x+y
(.).(.)
che si converte in\i b c f -> i (b c f)
.
con a (
, anteporre a \x
e aggiungere un corrispondente x
e quanti ne )
sono necessari? O è più complicato di così?
\ d->f(\k->f(f d k))
, ma puoi supporre che tutti i punti siano alimentati da due argomenti in questa sfida