Skip to content

Instantly share code, notes, and snippets.

@sotolf2
Created January 9, 2020 13:37
Show Gist options
  • Save sotolf2/459bc22814822b6dc15036f5c52573e2 to your computer and use it in GitHub Desktop.
Save sotolf2/459bc22814822b6dc15036f5c52573e2 to your computer and use it in GitHub Desktop.
#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