Add day 1
This commit is contained in:
parent
08606832f8
commit
ce1af441c4
1 changed files with 60 additions and 0 deletions
60
1/main.scm
Normal file
60
1/main.scm
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
(import (scheme base)
|
||||||
|
(scheme file)
|
||||||
|
(scheme process-context)
|
||||||
|
(scheme write))
|
||||||
|
|
||||||
|
(include "../common.scm")
|
||||||
|
|
||||||
|
(define (direction->arithmetic direction)
|
||||||
|
(cond
|
||||||
|
((char=? direction #\L) -)
|
||||||
|
((char=? direction #\R) +)))
|
||||||
|
|
||||||
|
(define (part1 file)
|
||||||
|
(with-input-from-file file
|
||||||
|
(lambda ()
|
||||||
|
(let loop ((dial 50)
|
||||||
|
(line (read-line))
|
||||||
|
(zeros 0))
|
||||||
|
(if (eof-object? line)
|
||||||
|
(number->string zeros)
|
||||||
|
(let* ((direction (string-ref line 0))
|
||||||
|
(distance (string->number (substring line 1 (string-length line))))
|
||||||
|
(new-dial (modulo ((direction->arithmetic direction) dial distance) 100)))
|
||||||
|
(loop new-dial (read-line) (if (zero? new-dial) (+ 1 zeros) zeros))))))))
|
||||||
|
|
||||||
|
(define (pseudo-modulo/count-wraps a b)
|
||||||
|
(let loop ((n a)
|
||||||
|
(wraps 0))
|
||||||
|
(cond
|
||||||
|
((zero? n)
|
||||||
|
(values n (+ 1 wraps)))
|
||||||
|
((negative? n)
|
||||||
|
(loop (+ n b) (+ 1 wraps)))
|
||||||
|
((= n b)
|
||||||
|
(values 0 (+ 1 wraps)))
|
||||||
|
((> n b)
|
||||||
|
(loop (- n b) (+ 1 wraps)))
|
||||||
|
(else
|
||||||
|
(values n wraps)))))
|
||||||
|
|
||||||
|
;; Could be improved...
|
||||||
|
(define (part2 file)
|
||||||
|
(with-input-from-file file
|
||||||
|
(lambda ()
|
||||||
|
(let loop ((dial 50)
|
||||||
|
(zeros 0)
|
||||||
|
(line (read-line)))
|
||||||
|
(if (eof-object? line)
|
||||||
|
(number->string zeros)
|
||||||
|
(let* ((direction (string-ref line 0))
|
||||||
|
(distance (string->number (substring line 1 (string-length line))))
|
||||||
|
(dial+-distance ((direction->arithmetic direction) dial distance)))
|
||||||
|
(let-values (((new-dial add-zeros) (pseudo-modulo/count-wraps dial+-distance 100)))
|
||||||
|
(loop new-dial
|
||||||
|
(+ zeros add-zeros (if (and (zero? dial) (negative? dial+-distance)) -1 0))
|
||||||
|
(read-line)))))))))
|
||||||
|
|
||||||
|
(for-each print (map part1 (command-line-arguments)))
|
||||||
|
(for-each print (map part2 (command-line-arguments)))
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue