Initial commit

This commit is contained in:
Dimitri Lozeve 2024-11-12 21:43:32 +01:00
commit f242d2b0df
420 changed files with 62521 additions and 0 deletions

107
2020/day20/day20.rkt Normal file
View file

@ -0,0 +1,107 @@
#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(define tiles-str (string-split (file->string filename) "\n\n"))
(for/hash ([str tiles-str])
(parse-tile str)))
(define (parse-tile str)
(define tile-id
(string->number (cadr (string-split (car (string-split str ":\n"))))))
(define tile (string-split (cadr (string-split str ":\n"))))
(values tile-id
(for/set ([s (in-list tile)]
[i (in-range 10)]
#:when #t
[x (in-string s)]
[j (in-range 10)]
#:when (eq? x #\#))
(list i j))))
(define (get-tile-edges tile)
(define edges-lists
(list (for/list ([k (in-range 10)])
(if (set-member? tile (list 0 k)) #\1 #\0))
(for/list ([k (in-range 10)])
(if (set-member? tile (list k 0)) #\1 #\0))
(for/list ([k (in-range 10)])
(if (set-member? tile (list 9 k)) #\1 #\0))
(for/list ([k (in-range 10)])
(if (set-member? tile (list k 9)) #\1 #\0))))
(define reversed-edges-lists (map reverse edges-lists))
(map (λ (lst) (string->number (list->string lst) 2)) (append edges-lists reversed-edges-lists)))
(define (get-neighbours tiles)
(define neighbours (make-hash))
(for* ([(tile1-idx tile1) (in-hash tiles)]
[(tile2-idx tile2) (in-hash tiles)]
#:unless (= tile1-idx tile2-idx)
#:when (not (set-empty? (set-intersect (get-tile-edges tile1) (get-tile-edges tile2)))))
(hash-update! neighbours tile1-idx (λ (ns) (set-add ns tile2-idx)) (set))
(hash-update! neighbours tile2-idx (λ (ns) (set-add ns tile1-idx)) (set)))
neighbours)
(define (part1 filename)
(define tiles (read-input filename))
(define neighbours (get-neighbours tiles))
(for/product ([(tile-idx tile) (in-hash tiles)]
#:when (= 2 (set-count (hash-ref neighbours tile-idx))))
tile-idx))
(module+ test
(check-equal? (part1 "test") 20899048083289))
(module+ main
(displayln (part1 "input")))
(define (display-tile tile)
(for* ([j (in-range 10)]
[i (in-range 10)])
(when (= i 0)
(printf "\n"))
(if (set-member? tile (list i j))
(printf "#")
(printf "."))))
(define (rotate tile)
(for/set ([x (in-set tile)])
(list (- 9 (cadr x)) (car x))))
(define (flipx tile)
(for/set ([x (in-set tile)])
(list (- 9 (car x)) (cadr x))))
(define (flipy tile)
(for/set ([x (in-set tile)])
(list (car x) (- 9 (cadr x)))))
(define (all-transformations tiles)
(define r1 (set-map (hash-values tiles) rotate))
(define r2 (set-map r1 rotate))
(define r3 (set-map r2 rotate))
(define s (set-union (hash-values tiles) r1 r2 r3))
(list->set (set-union s
(set-map s flipx)
(set-map s flipy))))
(define (edge tile side)
(define side-fn (match side
[1 (λ (k) (make-rectangular 0 k))]
[-1 (λ (k) (make-rectangular 9 k))]
[0+1i (λ (k) (make-rectangular k 0))]
[0-1i (λ (k) (make-rectangular k 9))]))
(string->number
(list->string (for/list ([k (in-range 10)])
(if (set-member? tile (side-fn k)) #\1 #\0))) 2))
(define (find-corner tiles)
(define neighbours (get-neighbours tiles))
(define corner (for/first ([(tile-idx tile) (in-hash tiles)]
#:when (= 2 (set-count (hash-ref neighbours tile-idx))))
tile))
corner)
;; Too boring, cheated

1728
2020/day20/input Normal file

File diff suppressed because it is too large Load diff

107
2020/day20/test Normal file
View file

@ -0,0 +1,107 @@
Tile 2311:
..##.#..#.
##..#.....
#...##..#.
####.#...#
##.##.###.
##...#.###
.#.#.#..##
..#....#..
###...#.#.
..###..###
Tile 1951:
#.##...##.
#.####...#
.....#..##
#...######
.##.#....#
.###.#####
###.##.##.
.###....#.
..#.#..#.#
#...##.#..
Tile 1171:
####...##.
#..##.#..#
##.#..#.#.
.###.####.
..###.####
.##....##.
.#...####.
#.##.####.
####..#...
.....##...
Tile 1427:
###.##.#..
.#..#.##..
.#.##.#..#
#.#.#.##.#
....#...##
...##..##.
...#.#####
.#.####.#.
..#..###.#
..##.#..#.
Tile 1489:
##.#.#....
..##...#..
.##..##...
..#...#...
#####...#.
#..#.#.#.#
...#.#.#..
##.#...##.
..##.##.##
###.##.#..
Tile 2473:
#....####.
#..#.##...
#.##..#...
######.#.#
.#...#.#.#
.#########
.###.#..#.
########.#
##...##.#.
..###.#.#.
Tile 2971:
..#.#....#
#...###...
#.#.###...
##.##..#..
.#####..##
.#..####.#
#..#.#..#.
..####.###
..#.#.###.
...#.#.#.#
Tile 2729:
...#.#.#.#
####.#....
..#.#.....
....#..#.#
.##..##.#.
.#.####...
####.#.#..
##.####...
##..#.##..
#.##...##.
Tile 3079:
#.#.#####.
.#..######
..#.......
######....
####.#..#.
.#...#.##.
#.#####.##
..#.###...
..#.......
..#.###...