Compare commits

...

2 Commits

Author SHA1 Message Date
Christopher Arndt aab15cdced Day 04 part two
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
2023-12-04 11:37:23 +01:00
Christopher Arndt 21b7041172 Refactor solution day 04 part 1
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
2023-12-04 11:36:45 +01:00
2 changed files with 79 additions and 12 deletions

View File

@ -4,19 +4,35 @@ var result = 0
var fn = if paramCount() > 0: paramStr(1) else: "input_04.txt" var fn = if paramCount() > 0: paramStr(1) else: "input_04.txt"
var lines = readFile(fn).strip.splitLines var lines = readFile(fn).strip.splitLines
for line in lines: # ASSUMPTION: lottery numbers are < 128
var card: int type
let cardspec = line.split(":", 1) Card = ref object
if scanf(cardspec[0].strip, "Card$s$i", card): play, pot: set[int8]
let play = cardspec[1].split("|")[0].strip.splitWhitespace().mapIt(it.strip).mapIt(it.parseInt).mapIt(it.int8).toSet var cards: seq[Card]
let jackpot = cardspec[1].split("|")[1].strip.splitWhitespace().mapIt(it.strip).mapIt(it.parseInt).mapIt(it.int8).toSet
#echo &"Card {card}: {left}, {right} => {left * right}"
let wins = (play * jackpot).len
if wins == 1:
result += 1
elif wins > 1:
result += 2 ^ (wins - 1)
proc points(card: Card): int =
let matches = (card.play * card.pot).len
if matches == 1:
result = 1
elif matches > 1:
result = 2 ^ (matches - 1)
else:
result = 0
for line in lines:
var cardno: int
let cardspec = line.split(":", 1)
if scanf(cardspec[0].strip, "Card$s$i", cardno):
let card = new Card
card.play = cardspec[1].split("|")[0].strip.splitWhitespace().mapIt(it.strip).mapIt(it.parseInt).mapIt(it.int8).toSet
card.pot = cardspec[1].split("|")[1].strip.splitWhitespace().mapIt(it.strip).mapIt(it.parseInt).mapIt(it.int8).toSet
echo &"Card {cardno}: {card.play}, {card.pot} => {card.points}"
cards.add(card)
result += card.points
echo &"Cards processed: {cards.len}"
echo &"Result: {result}" echo &"Result: {result}"
case fn: case fn:

51
day_04/solution_04b.nim Normal file
View File

@ -0,0 +1,51 @@
import std/[cmdline, sequtils, setutils, strformat, strscans, strutils]
var result = 0
var fn = if paramCount() > 0: paramStr(1) else: "input_04.txt"
var lines = readFile(fn).strip.splitLines
# ASSUMPTION: lottery numbers are < 128
type
Card = ref object
idx: int
play, pot: set[int8]
var cards: seq[Card]
proc value(card: Card): int =
(card.play * card.pot).len
#proc `$`(card: Card): string =
# return &"Card idx={card.idx}: value={card.value}"
for i, line in lines:
var cardno: int
let cardspec = line.split(":", 1)
if scanf(cardspec[0].strip, "Card$s$i", cardno):
let card = new Card
card.idx = i
card.play = cardspec[1].split("|")[0].strip.splitWhitespace().mapIt(it.strip).mapIt(it.parseInt).mapIt(it.int8).toSet
card.pot = cardspec[1].split("|")[1].strip.splitWhitespace().mapIt(it.strip).mapIt(it.parseInt).mapIt(it.int8).toSet
#echo &"Card {card.idx}: {card.play}, {card.pot} => {card.value}"
cards.add(card)
var stack = cards
while stack.len > 0:
result += len(stack)
var extra_cards: seq[Card]
for card in stack:
if card.value > 0:
extra_cards.add(cards[card.idx + 1..min(card.idx + card.value, cards.len - 1)])
stack = extra_cards
#echo &"Cards processed: {cards.len}"
echo &"Result: {result}"
case fn:
of "input_04.txt":
assert result == 11787590
of "sample_input_04.txt":
assert result == 30