On this page:
<day02>
2.1 How much paper is needed to wrap the boxes?
<day02-setup>
<day02-q1>
2.2 How much ribbon is needed to wrap the boxes?
<day02-q1>2
2.3 Testing Day 2
<day02-test>
8.12

2 Day 2🔗ℹ

 (require aoc-racket/day02) package: aoc-racket

The puzzle. Our input is a list of strings that represent dimensions of rectangular boxes.

2.1 How much paper is needed to wrap the boxes?🔗ℹ

According to the problem, the paper needed to wrap a present is the surface area of the box (= the sum of the areas of the sides) plus the area of the smallest side.

First we need to parse our input file into a list of box dimensions. We’ll model each box as a list of three dimensions. (The question doesn’t need us to keep height / width / depth straight, so we won’t worry about it.)

Then we have a traditional setup for the devastating one-two punch of map and apply. We’ll write a function to compute surface area from box dimensions. Then we’ll map that function across the list of boxes, and finally apply the + operator to our list of results to get the answer.

(require racket rackunit)
(provide (all-defined-out))
(define (string->boxes str)
  (for/list ([ln (in-list (string-split str "\n"))])
            (map string->number (string-split ln "x"))))

(define (box->paper box)
  (match-define (list x y z) box)
  (define sides (list (* x y) (* y z) (* x z)))
  (+ (* 2 (apply + sides)) (apply min sides)))
 
(define (q1 str)
  (define boxes (string->boxes str))
  (apply + (map box->paper boxes)))

2.2 How much ribbon is needed to wrap the boxes?🔗ℹ

According to the problem, the ribbon needed is the perimeter of the smallest side plus the volume of the box.

We take the same approach, with a new box->ribbon function.

(define (box->ribbon box)
  (match-define (list x y z) box)
  (define (perimeter dim1 dim2) (* 2 (+ dim1 dim2)))
  (define perimeters
    (list (perimeter x y) (perimeter y z) (perimeter x z)))
  (+ (apply min perimeters) (* x y z)))
 
(define (q2 str)
  (define boxes (string->boxes str))
  (apply + (map box->ribbon boxes)))

2.3 Testing Day 2🔗ℹ

(module+ test
  (define input-str (file->string "day02-input.txt"))
  (check-equal? (q1 input-str) 1586300)
  (check-equal? (q2 input-str) 3737498))