almost there

This commit is contained in:
2018-06-01 13:56:08 +02:00
parent 2845a5e308
commit 33e378fcd1
2 changed files with 96 additions and 29 deletions

View File

@@ -18,37 +18,55 @@ const NOT = b => IF(b)(FALSE)(TRUE);
const AND = a => b => IF(a)(IF(b)(TRUE)(FALSE))(FALSE);
const OR = a => b => IF(a)(TRUE)(IF(b)(TRUE)(FALSE));
const IS_ZERO = n => n(x => FALSE)(TRUE);
const IS_LEQ = n => m => IS_ZERO(SUBTRACT(n)(m)); // we only have positive ints
const IS_LEQ = n => m => IS_ZERO(SUB(n)(m)); // we only have positive ints
const IS_EQ = n => m => AND(IS_LEQ(n)(m))(IS_LEQ(m)(n)); // this is stupid
// time to get recursive!
const Y = f => (x => f(x(x)))(x => f(x(x))); // lazy recursion
const Z = f => (x => f(_ => x(x)(_)))(x => f(_ => x(x)(_))); // eager recursion
const FACT = Z(f => n => IF(IS_ZERO(n))(ONE)(_ => MULT(n)(f(DEC(n)))(_)));
const DIV = null;
const MOD = null;
const PAIR = null;
const LEFT = null;
const RIGHT = null;
const EMPTY = null;
const UNSHIFT = null;
const IS_EMPTY = null;
const FIRST = null;
const REST = null;
const INJECT = null;
const FOLD = null;
const MAP = null;
const RANGE = null;
const SUM = null;
const PROD = null;
const CONCAT = null;
const PUSH = null;
const REVERSE = null;
const INC_ALL = null;
const DOUBLE_ALL = null;
const TO_DIGITS = null;
const TO_STRING = null;
const FIZZBUZZ = null;
const DIV = Z(f => n => m => IF(IS_LEQ(m)(n))(_ => INC(f(SUB(n)(m))(m))(_))(ZERO));
const MOD = Z(f => n => m => IF(IS_LEQ(m)(n))(_ => f(SUB(n)(m))(m)(_))(m));
const PAIR = x => y => f => f(x)(y);
const LEFT = p => p(x => y => x);
const RIGHT = p => p (x => y => y);
const EMPTY = PAIR(TRUE)(TRUE);
const UNSHIFT = l => x => PAIR(FALSE)(PAIR(x)(l));
const IS_EMPTY = LEFT;
const FIRST = l => LEFT(RIGHT(l));
const REST = l => RIGHT(RIGHT(l));
const INJECT = Z(f => l => x => g => IF(IS_EMPTY(l))(x)(_ => f(REST(l))(g(x)(FIRST(l)))(g)(_)));
const FOLD = Z(f => l => x => g => IF(IS_EMPTY(l))(x)(_ => g(f(REST(l))(x)(g))(FIRST(l))(_)));
const MAP = k => f => FOLD(k)(EMPTY)(l => x => UNSHIFT(l)(f(x)));
const RANGE = Z(f => n => m => IF(IS_LEQ(n)(m))(_ => UNSHIFT(f(INC(n))(m))(n)(_))(EMPTY));
const SUM = l => INJECT(l)(ZERO)(ADD);
const PROD = l => INJECT(l)(ONE)(MULT);
const CONCAT = k => l => FOLD(k)(l)(UNSHIFT);
const PUSH = l => x => CONCAT(l)(UNSHIFT(EMPTY)(x));
const REVERSE = l => FOLD(l)(EMPTY)(PUSH);
const INC_ALL = l => MAP(l)(INC);
const DOUBLE_ALL = l => MAP(l)(MULT(TWO));
const TEN = INC(MULT(THREE)(THREE));
const RADIX = TEN;
const FOUR = INC(THREE);
const FIVE = INC(INC(THREE));
const FIFTEEN = MULT(THREE)(FIVE);
const FIZZ = MAP(UNSHIFT(UNSHIFT(UNSHIFT(UNSHIFT(EMPTY)(FOUR))(FOUR))(TWO))(ONE))(ADD(RADIX));
const BUZZ = MAP(UNSHIFT(UNSHIFT(UNSHIFT(UNSHIFT(EMPTY)(FOUR))(FOUR))(THREE))(ZERO))(ADD(RADIX));
const FIZZBUZZ = n => MAP(RANGE(ONE)(n))(m =>
IF(IS_ZERO(MOD(m)(FIFTEEN)))(
CONCAT(FIZZ)(BUZZ)
)(IF(IS_ZERO(MOD(m)(THREE)))(
FIZZ
)(IF(IS_ZERO(MOD(m)(FIVE)))(
BUZZ
)(
m
)))
);
module.exports = {
ZERO, ONE, TWO, THREE, TIMES, INC, ADD, MULT, POWER, DEC, SUB, TRUE,
FALSE, IF, NOT, AND, OR, IS_ZERO, IS_LEQ, IS_EQ, IS_LEQ, Y, Z, FACT
FALSE, IF, NOT, AND, OR, IS_ZERO, IS_LEQ, IS_EQ, IS_LEQ, Y, Z, FACT,
DIV, MOD, PAIR, LEFT, RIGHT, EMPTY, UNSHIFT, IS_EMPTY, FIRST, REST, INJECT,
FOLD, MAP, RANGE, SUM, PROD, CONCAT, PUSH, REVERSE, INC_ALL, DOUBLE_ALL,
TEN, RADIX, FOUR, FIVE, FIFTEEN, FIZZ, BUZZ, FIZZBUZZ
};