Day 23: Part 1.

This commit is contained in:
Jonathan Chan 2020-12-22 22:39:54 -08:00
parent 8132ba19ad
commit 1b6e378bd2
1 changed files with 39 additions and 0 deletions

39
src/23.rkt Normal file
View File

@ -0,0 +1,39 @@
#lang curly-fn racket
(require "../lib.rkt")
(define input '(3 6 2 9 8 1 7 5 4))
(define (succ idx)
(modulo (add1 idx) 9))
(define (add1* c)
(if (= c 9) 1 (add1 c)))
(define (sub1* c)
(if (= c 1) 9 (sub1 c)))
(define (play current cups moves stop)
(if (= moves stop)
cups
(let* ([curr-idx (index-of cups current)]
[picked-up (list (list-ref cups (succ curr-idx))
(list-ref cups (succ (succ curr-idx)))
(list-ref cups (succ (succ (succ curr-idx)))))]
[dest-idx (let loop ([c (sub1* current)])
(if (member c picked-up)
(loop (sub1* c))
(index-of cups c)))])
(define-values (front back) (split-at cups (+ dest-idx 1)))
(let ([cups (append (remove* picked-up front) picked-up (remove* picked-up back))])
(play (list-ref cups (succ (index-of cups current))) cups (add1 moves) stop)))))
(define part1
(let* ([cups (play (first input) input 0 100)]
[i (index-of cups 1)]
[labels (append (drop cups (succ i)) (take cups i))])
(apply string-append (map number->string labels))))
(define part2 #f)
(show-solution part1 part2)