Scratchcards
04 Dec 2023 - Brent Jacobs
Part 1
let str = `Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11`
let lines = str.trim().split("\n").map(l => l.split(":")[1].split("|"))
let gameNumbers = lines.map(([a, b]) => [a.trim().split(/\s+/).map(i => +i), b.trim().split(/\s+/).map(i => +i)])
winningNumbers = gameNumbers.map(([a, b]) => a.filter(Set.prototype.has, new Set(b)))
points = winningNumbers.map(n => n.length == 0 ? 0 : Math.pow(2, n.length - 1))
totalPoints = points.reduce((a, x) => a += x)
console.log('totalPoints', totalPoints) // 13
Part 2
let newCardCopies = winningNumbers.map((n, i) => [i, n.length])
let more = [...newCardCopies]
let total = 0
while (more.length > 0) {
total += more.length
let next = more.map(([i, n]) => newCardCopies.slice(i + 1, i + 1 + n))
more = next.flat()
}
console.log('total', total) // 30