aboutsummaryrefslogtreecommitdiff
path: root/2021/day4/04b-alt.rkt
blob: ab32bc2c384dce6da7f12f4c6e73a4fb8629ae35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#lang racket

(require racket/file)

(define (parse-row x)
  (map string->number (filter (lambda (x) (< 0 (string-length x))) (regexp-split #rx" +" x))))

(define (parse-board x)
  (map parse-row (string-split x "\n")))

(define (get-numbers x)
  (define number-line (car (string-split x "\n\n")))
  (map string->number (string-split number-line ",")))

(define (get-boards x)
  (define boards (cdr (string-split x "\n\n")))
  (map parse-board boards))

(define (subsetOf xs ys)
  (subset? (list->set xs) (list->set ys)))

(define (transpose xs)
  (apply map list xs))

(define (check-win board numbers)
  (define winningColumns (filter (lambda (x) (subsetOf x numbers)) board))
  (define winningRows (filter (lambda (x) (subsetOf x numbers)) (transpose board)))
  (cond [(not (null? winningColumns)) (car winningColumns)]
        [(not (null? winningRows)) (car winningRows)]
        [else #f]))

(define input (file->string "./input"))
(define numbers (get-numbers input))
(define boards (get-boards input))

(define ht (make-hash))
(for* ([rnd (length numbers)]
       [board boards]
       #:unless (hash-ref ht board #f)
       )
  (cond [(check-win board (take numbers rnd)) (hash-set! ht board rnd)]))

(define maxTurn 0)
(define lastBoard #f)
(hash-for-each ht (lambda (k v) (cond [(> v maxTurn) (set! maxTurn v) (set! lastBoard k)])))

(*
 (foldr + 0 (filter (lambda (x) (not (member x (take numbers maxTurn)))) (flatten lastBoard)))
 (list-ref numbers (- maxTurn 1)))