Skip to content

Instantly share code, notes, and snippets.

@yuta0801
Last active May 17, 2020 09:36
Show Gist options
  • Save yuta0801/78ed79e251baabff929b22e1a6e2f9b4 to your computer and use it in GitHub Desktop.
Save yuta0801/78ed79e251baabff929b22e1a6e2f9b4 to your computer and use it in GitHub Desktop.
((input, log) => (
(def => (
def({
split: (target => input => (
def({
length: (input => (
def((fn, [char, ...text], i) => (
char ? fn(fn, text, i + 1) : i
), fn => fn(fn, input, 0))
)),
slice: (begin, end) => input => (
def({
length: (input => (
def((fn, [char, ...text], i) => (
char ? fn(fn, text, i + 1) : i
), fn => fn(fn, input, 0))
))
}, ({ length }) => (
def((fn, acc, i) => (
i >= end || i >= length(input) ? acc
: i >= begin ? fn(fn, acc + input[i], i + 1)
: fn(fn, acc, i + 1)
), (fn => fn(fn, '', 0)))
))
),
indexOf: (target => input => (
def({
length: (input => (
def((fn, [char, ...text], i) => (
char ? fn(fn, text, i + 1) : i
), fn => fn(fn, input, 0))
)),
slice: (begin, end) => input => (
def({
length: (input => (
def((fn, [char, ...text], i) => (
char ? fn(fn, text, i + 1) : i
), fn => fn(fn, input, 0))
))
}, ({ length }) => (
def((fn, acc, i) => (
i >= end || i >= length(input) ? acc
: i >= begin ? fn(fn, acc + input[i], i + 1)
: fn(fn, acc, i + 1)
), (fn => fn(fn, '', 0)))
))
)
}, ({ length, slice }) => (
def((fn, text, i) => (
length(target) === 0 ? 0
: i >= length(text) - 1 ? -1
: (
slice(i, i + length(target))(text) === target
) ? i
: fn(fn, text, i + 1)
), fn => fn(fn, input, 0))
))
))
}, ({ slice, length, indexOf }) => (
def((fn, text, acc) => (
def(indexOf(target)(text), index => (
index < 0 ? [...acc, text]
: fn(fn, (
slice(index + length(target), length(text))(text)
), [...acc, slice(0, index)(text)])
))
), fn => fn(fn, input, []))
))
)),
flatMap: (cb => arr => (
def({
map: (cb => arr => (
def(((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, [...acc, cb(one)])
: acc
)), fn => fn(fn, arr, []))
)),
flat: (array => (
def((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, [...acc, ...one])
: acc
), fn => fn(fn, array, []))
))
}, ({ map, flat }) => (
flat(map(cb)(arr))
))
)),
map: (cb => arr => (
def(((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, [...acc, cb(one)])
: acc
)), fn => fn(fn, arr, []))
)),
sum: (nums => (
def({
reduce: ((cb, init) => arr => (
def(((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, cb(acc, one))
: acc
)), fn => fn(fn, arr, init))
))
}, ({ reduce }) => (
reduce((a, c) => a + c, 0)(nums)
))
)),
join: (separator => array => (
def((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, acc + (
acc ? separator : ''
) + one)
: acc
), (fn => fn(fn, array, '')))
))
}, ({ split, flatMap, map, sum, join }) => (
def(flatMap(line => split(' ')(line))(split('\n')(input)), value => (
def(value, ([a, b, c, s]) => (
log(join('\n')(map(join(' '))([[sum(map(n => +n)([a, b, c])), s]])))
))
))
))
))((value, cb) => cb(value))
))(require('fs').readFileSync('/dev/stdin', 'utf8'), log => console.log(log))
((input, log) => (
(def => (
def({
deps: list => def({
reduce: ((cb, init) => arr => (
def(((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, cb(acc, one))
: acc
)), fn => fn(fn, arr, init))
))
}, ({ reduce }) => (
reduce((libs, [name, lib]) => (
{ ...libs, [name]: lib(libs) }
), {})(list)
))
}, ({ deps }) => (
def(deps([
['length', () => (input => (
def((fn, [char, ...text], i) => (
char ? fn(fn, text, i + 1) : i
), fn => fn(fn, input, 0))
))],
['slice', ({ length }) => ((begin, end) => input => (
def((fn, acc, i) => (
i >= end || i >= length(input) ? acc
: i >= begin ? fn(fn, acc + input[i], i + 1)
: fn(fn, acc, i + 1)
), (fn => fn(fn, '', 0)))
))],
['indexOf', ({ length, slice }) => (target => input => (
def((fn, text, i) => (
length(target) === 0 ? 0
: i >= length(text) - 1 ? -1
: (
slice(i, i + length(target))(text) === target
) ? i
: fn(fn, text, i + 1)
), fn => fn(fn, input, 0))
))],
['split', ({ length, slice, indexOf }) => (target => input => (
def((fn, text, acc) => (
def(indexOf(target)(text), index => (
index < 0 ? [...acc, text]
: fn(fn, (
slice(index + length(target), length(text))(text)
), [...acc, slice(0, index)(text)])
))
), fn => fn(fn, input, []))
))],
['map', () => (cb => arr => (
def(((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, [...acc, cb(one)])
: acc
)), fn => fn(fn, arr, []))
))],
['flat', () => (array => (
def((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, [...acc, ...one])
: acc
), fn => fn(fn, array, []))
))],
['flatMap', ({ map, flat }) => (cb => arr => (
flat(map(cb)(arr))
))],
['reduce', () => ((cb, init) => arr => (
def(((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, cb(acc, one))
: acc
)), fn => fn(fn, arr, init))
))],
['sum', ({ reduce }) => (nums => (
reduce((a, c) => a + c, 0)(nums)
))],
['join', () => (separator => array => (
def((fn, [one, ...rest], acc) => (
one ? fn(fn, rest, acc + (
acc ? separator : ''
) + one)
: acc
), (fn => fn(fn, array, '')))
))]
]), ({ split, flatMap, map, sum, join }) => (
def(flatMap(line => split(' ')(line))(split('\n')(input)), value => (
def(value, ([a, b, c, s]) => (
log(join('\n')(map(join(' '))([[sum(map(n => +n)([a, b, c])), s]])))
))
))
))
))
))((val, cb) => cb(val))
))(require('fs').readFileSync('/dev/stdin', 'utf8'), log => console.log(log))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment