From 1b6e378bd25ab4911a514e82bb096331155ada33 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Tue, 22 Dec 2020 22:39:54 -0800 Subject: [PATCH] Day 23: Part 1. --- src/23.rkt | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/23.rkt diff --git a/src/23.rkt b/src/23.rkt new file mode 100644 index 0000000..c42b11d --- /dev/null +++ b/src/23.rkt @@ -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)