import * as R from "remeda"; const playTurn = (max, monkeys, monkey) => { monkey.inspections += monkey.items.length; monkey.items .map((i) => monkey.operation(i) % max) .forEach((i) => { monkeys[i % monkey.divisible ? monkey.ifFalse : monkey.ifTrue].items.push( i ); }); monkey.items = []; return monkey; }; const genPlayRound = (monkeys) => { const max = monkeys.map(R.prop("divisible")).reduce((a, b) => a * b); return () => monkeys.map((monkey) => playTurn(max, monkeys, monkey)); }; export default R.createPipe( R.clone, (monkeys) => R.times(10000, genPlayRound(monkeys)), R.last(), R.map(R.prop("inspections")), R.sortBy(R.identity), R.reverse, R.take(2), R.reduce((a, b) => a * b, 1) );