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)))
|