Created
January 9, 2020 13:37
-
-
Save sotolf2/459bc22814822b6dc15036f5c52573e2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#lang racket | |
(require json) | |
(require threading) | |
(define (get-input) | |
(file->string "day12.txt")) | |
(define (input->hash) | |
(with-input-from-file "day12.txt" | |
(lambda () (read-json)))) | |
(define (string-extract-numbers str) | |
(~>> str | |
(regexp-match* #px"(-?\\d+)") | |
(map string->number))) | |
(define (part1) | |
(~>> | |
(get-input) | |
(string-extract-numbers) | |
(foldl + 0))) | |
(define (hash-has-value? hsh str) | |
(define (value-rec hsh str idx) | |
(if (eq? idx #f) | |
#f | |
(if (and (string? (hash-iterate-value hsh idx)) (equal? (hash-iterate-value hsh idx) str)) | |
#t | |
(value-rec hsh str (hash-iterate-next hsh idx))))) | |
(value-rec hsh str (hash-iterate-first hsh))) | |
(define (hash-numbers-ignore hsh str) | |
(define (read-list lst str) | |
(define (lst-rec lst str res) | |
(cond | |
[(empty? lst) res] | |
[(number? (car lst)) (lst-rec (cdr lst) str (cons (car lst) res))] | |
[(hash? (car lst)) (lst-rec (cdr lst) str (append (read-hash (car lst) str empty) res))] | |
[(list? (car lst)) (lst-rec (cdr lst) str (append (read-list (car lst) str) res))] | |
[else (lst-rec (cdr lst) str res)])) | |
(lst-rec lst str empty)) | |
(define (search hsh str res idx) | |
(cond | |
[(eq? idx #f) | |
res] | |
[(hash? (hash-iterate-value hsh idx)) | |
(search hsh str (append (read-hash (hash-iterate-value hsh idx) str empty) res) (hash-iterate-next hsh idx))] | |
[(list? (hash-iterate-value hsh idx)) | |
(search hsh str (append (read-list (hash-iterate-value hsh idx) str) res) (hash-iterate-next hsh idx))] | |
[(number? (hash-iterate-value hsh idx)) | |
(search hsh str (cons (hash-iterate-value hsh idx) res) (hash-iterate-next hsh idx))] | |
[else | |
(search hsh str res (hash-iterate-next hsh idx))])) | |
(define (read-hash hsh str res) | |
(if (hash-has-value? hsh str) | |
empty | |
(search hsh str res (hash-iterate-first hsh)))) | |
(read-hash hsh str empty)) | |
(define (part2) | |
(~>> (input->hash) | |
(hash-numbers-ignore _ "red") | |
(foldl + 0))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment