Będąc hakerem Haskell, wolę notację punktową niż punktową. Niestety niektórym osobom trudno jest odczytać bezcelową notację i trudno mi uzyskać prawidłową liczbę nawiasów, gdy piszę w sposób celny. Pomóż mi przekonwertować kod napisany w pointfree na notację punktową!
O
W notacji wolnej od punktów używamy punktów (tak, naprawdę), aby wprowadzić dane wyjściowe jednej funkcji do drugiej. Powiedzmy, że jeśli masz funkcję, succ
która pobiera liczbę i dodaje do niej 1, a chcesz zrobić funkcję, która dodaje 3 do liczby, zamiast tego:
\x -> succ(succ(succ(x)))
możesz to zrobić:
succ.succ.succ
Pointfree działa tylko z funkcjami, które pobierają tylko jeden parametr (w każdym razie w tym wyzwaniu), więc jeśli nasza funkcja nie była, succ
ale raczej, add
która bierze 2 liczby i dodaje je razem, musielibyśmy podawać argumenty, dopóki nie zostanie tylko jeden:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Wreszcie funkcje mogą przyjmować inne funkcje jako argumenty:
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))
Dane wejściowe i oczekiwane wyniki
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)))
Zasady
- Dane wyjściowe mogą zawierać więcej spacji lub nawiasów niż jest to wymagane, o ile są zrównoważone
- Nie musisz się upewnić, że nazwa tworzonej zmiennej nie
\x
jest już używana gdzie indziej w kodzie - Od Ciebie zależy, czy chcesz utworzyć funkcję, czy pełny program
- To jest
codegolf
, najkrótszy kod w bajtach wygrywa!
Może się okazać, że tępy jest użyteczny, konwertuje między dwoma notacjami (ale także rozkłada kod, jeśli to możliwe): https://blunt.herokuapp.com
(+).(*3)
to to samo co\x y->3*x+y
(.).(.)
która zamienia się w\i b c f -> i (b c f)
.
a(
,\x
dodaj a i dodaj odpowiednix
i tyle,)
ile jest wymaganych? Czy jest to bardziej skomplikowane?\ d->f(\k->f(f d k))
, ale można założyć, że wszystkie kropki mają dwa argumenty w tym wyzwaniuOdpowiedzi:
Haskell,
163 142133 bajtówWypróbuj na Ideone.
Nie golfowany:
źródło
Haskell,
402289 bajtówDość długo, ale myślę, że to działa ..
źródło