Skip to content

Commit

Permalink
add potential solution for day 4
Browse files Browse the repository at this point in the history
not ideal due to slightly slower
  • Loading branch information
scottmckendry committed Nov 1, 2024
1 parent e5fe080 commit 1de2bfa
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 78 deletions.
10 changes: 5 additions & 5 deletions 2021/04_test.odin
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,16 @@ test_parse_bingo_card :: proc(t: ^testing.T) {
}

got := parse_bingo_card(input)
matching := got.numbers[2][2].number == 14
matching = matching && got.numbers[4][4].number == 19
matching := got.possible_bingos[2][2] == 14
matching = matching && got.possible_bingos[7][4] == 20

testing.expect(
t,
matching,
fmt.aprintf(
"Wanted 14, got %v | Wanted 19, got %v",
got.numbers[2][2].number,
got.numbers[4][4].number,
"Wanted 14, got %v | Wanted 20, got %v",
got.possible_bingos[2][2],
got.possible_bingos[7][4],
),
)
}
98 changes: 46 additions & 52 deletions 2021/04p1.odin
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,8 @@ import "core:strings"
import "utils"

bingo_card :: struct {
numbers: [5][5]bingo_number,
}

bingo_number :: struct {
number: int,
drawn: bool,
won: bool,
possible_bingos: [10][dynamic]int,
}

D04P1 :: proc() {
Expand All @@ -26,35 +22,52 @@ D04P1 :: proc() {
get_winning_bingo_score :: proc(input: []string) -> int {
drawings := parse_bingo_drawings(input)
cards: [dynamic]bingo_card
defer delete(drawings)
defer delete(cards)
defer {
delete(drawings)
for &card in cards {
for i in 0 ..< len(card.possible_bingos) {
delete(card.possible_bingos[i])
}
}
delete(cards)
}

for i := 2; i < len(input); i += 6 {
append(&cards, parse_bingo_card(input[i:i + 5]))
card := parse_bingo_card(input[i:i + 5])
append(&cards, card)
}

winning_card: int
draw_index := 0
for draw_index < len(drawings) {
winning_drawing: int
game_over := false
for drawing in drawings {
if game_over {
break
}

for &card in cards {
for &row in card.numbers {
for &number in row {
if number.number == drawings[draw_index] {
number.drawn = true
for i in 0 ..< len(card.possible_bingos) {
for j in 0 ..< len(card.possible_bingos[i]) {
if card.possible_bingos[i][j] == drawing {
unordered_remove(&card.possible_bingos[i], j)
}
}
}
}

winning_card, _ = check_bingo(cards)
if winning_card != 0 {
break
for &card in cards {
for i in 0 ..< len(card.possible_bingos) {
if len(card.possible_bingos[i]) == 0 {
game_over = true
winning_card = get_bingo_card_score(&card)
winning_drawing = drawing
break
}
}
}

draw_index += 1
}

return winning_card * drawings[draw_index]
return winning_card * winning_drawing
}

parse_bingo_drawings :: proc(input: []string) -> [dynamic]int {
Expand All @@ -76,44 +89,25 @@ parse_bingo_card :: proc(raw_card: []string) -> bingo_card {
if col == "" {
continue
}
card.numbers[i][j].number = strconv.atoi(col)

col_int := strconv.atoi(col)
assign_at(&card.possible_bingos[i], j, col_int)
assign_at(&card.possible_bingos[5 + j], i, col_int)

j += 1
}
}

return card
}

check_bingo :: proc(cards: [dynamic]bingo_card) -> (sum: int, index: int) {
for &card, card_index in cards {
// Check rows
for &row in card.numbers {
if row[0].drawn && row[1].drawn && row[2].drawn && row[3].drawn && row[4].drawn {
return get_unmarked_sum(card), card_index
}
}
// Check columns
for i := 0; i < 5; i += 1 {
if card.numbers[0][i].drawn &&
card.numbers[1][i].drawn &&
card.numbers[2][i].drawn &&
card.numbers[3][i].drawn &&
card.numbers[4][i].drawn {
return get_unmarked_sum(card), card_index
}
get_bingo_card_score :: proc(card: ^bingo_card) -> int {
score := 0
for i in 0 ..< 5 {
for j in 0 ..< len(card.possible_bingos[i]) {
score += card.possible_bingos[i][j]
}
}

return 0, -1
}

get_unmarked_sum :: proc(card: bingo_card) -> int {
sum := 0
for row in card.numbers {
for number in row {
if !number.drawn {
sum += number.number
}
}
}
return sum
return score
}
53 changes: 32 additions & 21 deletions 2021/04p2.odin
Original file line number Diff line number Diff line change
Expand Up @@ -15,37 +15,48 @@ D04P2 :: proc() {
get_last_bingo_winner_score :: proc(input: []string) -> int {
drawings := parse_bingo_drawings(input)
cards: [dynamic]bingo_card
defer delete(drawings)
defer delete(cards)
defer {
delete(drawings)
for &card in cards {
for i in 0 ..< len(card.possible_bingos) {
delete(card.possible_bingos[i])
}
}
delete(cards)
}

for i := 2; i < len(input); i += 6 {
append(&cards, parse_bingo_card(input[i:i + 5]))
card := parse_bingo_card(input[i:i + 5])
append(&cards, card)
}

current_card := 0
draw_index := 0
current_card_idx := 0
winning_card: int
winning_index := 0
for draw_index < len(drawings) {
for &card in cards {
for &row in card.numbers {
for &number in row {
if number.number == drawings[draw_index] {
number.drawn = true
winning_drawing: int
game_over := false
for drawing in drawings {
for &card, card_idx in cards {
if card.won {
continue
}
for i in 0 ..< len(card.possible_bingos) {
for j in 0 ..< len(card.possible_bingos[i]) {
if card.possible_bingos[i][j] == drawing {
unordered_remove(&card.possible_bingos[i], j)
}
}
}
}

current_card, current_card_idx = check_bingo(cards)
if current_card != 0 {
winning_card = current_card
winning_index = draw_index
ordered_remove(&cards, current_card_idx)
}
draw_index += 1
for &card, card_idx in cards {
for i in 0 ..< len(card.possible_bingos) {
if len(card.possible_bingos[i]) == 0 && card.won == false {
winning_card = get_bingo_card_score(&card)
winning_drawing = drawing
card.won = true
}
}
}
}

return winning_card * drawings[winning_index]
return winning_card * winning_drawing
}

0 comments on commit 1de2bfa

Please sign in to comment.