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>
8.12

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))