Факториал на числах Чёрча — теперь и в смайликах

Всем доброго утра ffbd236b5e1e03b1cf4b85168a6a5694.pngЭто полностью валидный код на JavaScript.Конечно же, не в таком виде.

Вчера, листая список оставленного на потом, наткнулся на статью о вычислении факториала на числах Чёрча, нашёл в комментариях предложение реализовать на arrow functions.

Но т.к. уже наступило 1 апреля, нужно что-нибудь интересное и необычное.

var fact = ((cat) => (cat) (cat)) ((cat) => ((drunk) => ((idea) => (hrv) => ((bug) => (facepalm) => (swear) => (bug) (facepalm) (swear)) (((hrv) => (hrv) ((cat) => (cat) => (drunk) => (drunk)) ((cat) => (drunk) => (cat))) (hrv)) (((hrv) => (idea) => (cat) => (idea) ((hrv) (idea) (cat))) ((idea) => (cat) => (cat))) ((cat) => ((hrv) => (dog) => (idea) => (hrv) ((dog) (idea))) (hrv) ((idea) (((hrv) => (wasntme) => (tmi) => ((bug) => (bug) ((cat) => (drunk) => (drunk))) ((hrv) ((bug) => ((devil) => (heidy) => (facepalm) => (facepalm) (devil) (heidy)) ((wasntme) (((bug) => (bug) ((cat) => (drunk) => (cat))) (bug))) (((bug) => (bug) ((cat) => (drunk) => (cat))) (bug))) (((devil) => (heidy) => (facepalm) => (facepalm) (devil) (heidy)) (tmi) (tmi)))) (hrv))) (cat))) ((cat) (cat)) (drunk))); (Отправлять через Skype). Вот и остальные функции, уже в более простом и естественном виде:

var True = (x) => (y) => x; var False = (x) => (y) => y;

var If = (p) => (t) => (e) => p (t)(e); // example: If (True)('foo')('bar')

var Zero = (f) => (x) => x; var Succ = (n) => (f) => (x) => f (n (f)(x)); var IsZero = (n) => n ((x) => False)(True);

var Mul = (n) => (m) => (f) => n (m (f));

var Pair = (a) => (b) => (t) => t (a)(b); var Fst = (p) => p (True); var Snd = (p) => p (False); var Pred = (n) => (s) => (z) => Snd (n ((p) => Pair (s (Fst (p)))(Fst (p)))(Pair (z)(z))); За тем, как это всё работает — в исходную статью.Ну, а использовать вот так:

fact (Succ (Succ (Succ (Zero))))(function (x) { return x + 1; })(0); // => 6 (где Succ — прибавление единицы).Всех с праздником!

© Habrahabr.ru