blob: db03881391f59835084c9c33d9e9042bed2ddcb7 (
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 winningBoard #f)
(define winningRun #f)
(define wonOnRound 0)
(for* ([rnd (length numbers)]
[board boards]
#:unless winningRun
)
(set! winningRun (check-win board (take numbers rnd)))
(set! winningBoard board)
(set! wonOnRound rnd))
(*
(foldr + 0 (filter (lambda (x) (not (member x (take numbers wonOnRound)))) (flatten winningBoard)))
(list-ref numbers (- wonOnRound 1)))
|