Будучи хакерським хакером, я віддаю перевагу точковому позначенню над точковим. На жаль, деяким людям важко читати нотатки, які важко читати, і мені важко отримати правильну кількість круглих дужок, коли я пишу в точці. Допоможіть мені перетворити код, написаний pointfree, в точну нотацію!
Про
У точковому позначенні ми використовуємо точки (так, насправді) для передачі результатів однієї функції в іншу. Скажіть, якщо у вас була функція, succ
яка приймає число і додає до неї 1, і ви хотіли зробити функцію, яка додає 3 до числа, замість цього:
\x -> succ(succ(succ(x)))
Ви можете це зробити:
succ.succ.succ
Pointfree працює лише з функціями, які беруть один параметр, однак (у цьому виклику все одно), тож якщо наша функція не була, succ
а add
яка бере 2 числа і додає їх разом, нам доведеться подавати аргументи, поки не залишиться лише один:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Нарешті, функції можуть приймати інші функції як аргументи:
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))
Вхідні дані та очікуваний вихід
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)))
Правила
- На виході може бути більше пробілів або круглих дужок, ніж потрібно, якщо вони врівноважені
- Вам не потрібно переконатися, що ім’я створеної змінної
\x
вже не використовується десь у коді - Це ваш вибір, чи створити функцію чи повну програму
- Це
codegolf
найкоротший виграш коду в байтах!
Вам може бути корисним тупість, він перетворюється між двома позначеннями (але також, коли можливо, розшифровує код): https://blunt.herokuapp.com
(+).(*3)
те саме, що\x y->3*x+y
(.).(.)
яка перетворюється на\i b c f -> i (b c f)
.
на (
, додайте а \x
та додайте відповідне x
та стільки, )
скільки потрібно? Або це складніше за це?
\ d->f(\k->f(f d k))
, але можна припустити, що всі точки в цьому виклику подаються два аргументи