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