On this page:
<day08>
8.1 What’s the difference between the literal length of the strings, and their length in memory?
<day08-setup>
<day08-q1>
8.2 What’s the difference between the re-encoded length of the literal string, and the original length?
<day08-q2>
8.3 Testing Day 8
<day08-test>
7.1

8 Day 8

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

The puzzle. Our input consists of a list of seemingly random strings within quotation marks.

8.1 What’s the difference between the literal length of the strings, and their length in memory?

The puzzle relies the fact that within strings, certain single characters — like the backslash \ and double-quote mark " — are described with more than one character. Thus, the question asks us to compare the two lengths.

The literal length of the string is trivial — use string-length. The memory length requires interpreting a string as a Racket value, which (as seen in Day 7) simply means using read.

(require racket rackunit)
(provide (all-defined-out))

(define (memory-length str) (string-length (read (open-input-string str))))
 
(define (q1 strs)
  (- (apply + (map string-length strs)) (apply + (map memory-length strs))))

8.2 What’s the difference between the re-encoded length of the literal string, and the original length?

This question simply comes down to — do you know how to use the string-formatting functions in your programming language?

In Racket, a string can be re-encoded with ~v. Not a very puzzling puzzle overall.

(define (encoded-length str) (string-length (~v str)))
 
(define (q2 strs)
  (- (apply + (map encoded-length strs)) (apply + (map string-length strs))))

8.3 Testing Day 8

(module+ test
  (define input-strs (file->lines "day08-input.txt"))
  (check-equal? (q1 input-strs) 1333)
  (check-equal? (q2 input-strs) 2046))