This is my solution for Day 2 of this year’s Advent of Code.

You may also enjoy browsing the Day 2 solutions megathread on Reddit.

## PROBLEM

The spreadsheet consists of rows of apparently-random numbers. To make sure the recovery process is on the right track, they need you to calculate the spreadsheet’s checksum. For each row, determine the difference between the largest value and the smallest value; the checksum is the sum of all of these differences.

For example, given the following spreadsheet:

5 1 9 5 7 5 3 2 4 6 8The first row’s largest and smallest values are 9 and 1, and their difference is 8.

The second row’s largest and smallest values are 7 and 3, and their difference is 4.

The third row’s difference is 6.

In this example, the spreadsheet’s checksum would be 8 + 4 + 6 = 18.

## SOLUTION

(define (line->list line) ;; String -> List (let ((read-ln (field-reader (infix-splitter (rx (+ whitespace))))) (in-port (make-string-input-port line))) (receive (record fields) (read-ln in-port) (map string->number fields)))) (define (read-spreadsheet file) ;; File -> List[List[Number]] (call-with-input-file file (lambda (port) (let loop ((line (read-line port)) (results '())) (if (eof-object? line) results (loop (read-line port) (cons line results))))))) (define (main prog+args) (let ((rows (read-spreadsheet "/Users/rloveland/Code/personal/advent-of-code/2017/02/02.dat"))) (write (apply + (map (lambda (row) (let* ((xs (line->list row)) (min (apply min xs)) (max (apply max xs))) (- max min))) rows))) (newline)))