#lang scribble/lp2

@ ( require scribble/manual aoc-racket/helper )

```
```

@aoc-title [ 10 ]

```
```

@defmodule [ aoc-racket/day10 ]

```
```

@link [ " http://adventofcode.com/day/10 " ] { The puzzle } . Our @link-rp [ " day10-input.txt " ] { input } is a short numeric key.

```
```

@chunk [ <day10>

` `<day10-setup>

` `<day10-q1>

` `<day10-q2>

` `<day10-test> ]

```
```

@isection { What ' s the length of the sequence after 40 iterations? }

```
```

The puzzle asks us to compute the @italic { look and say } sequence invented by mathematician John Conway. Each iteration of the sequence is the description of the last step if you said it in numbers. So @racket [ 1 ] becomes ` ` one 1 ' ' , written @racket [ 11 ] ; @racket[11] becomes ``two ones'', or @racket[21], then @racket[1211], @racket[111221], and so on.

```
```

As in @secref { Day_1 } , this puzzle relies on cumulative state , so we ' ll loop using @iracket [ for/fold ] . To generate the new string for each pass of the loop , we ' ll use @iracket [ regexp-match* ] to find every contiguous run of digits. Each digit run is converted into a list with the number of digits and the digit itself. Then all these lists are concatenated into a new string , and the loop repeats.

```
```

The second part of the puzzle is just going to change the number of iterations. So we ' ll make one function that can be used for both parts.

```
```

@chunk [ <day10-setup>

` `( require racket rackunit )

` `( provide ( all-defined-out ) )

` `

` `( define ( look-and-say iterations input-key )

` `( for/fold ( [ start input-key ] )

` `( [ i ( in-range iterations ) ] )

` `( define digit-runs ( regexp-match* #px"(\\d)\\1*" start ) )

` `( string-append*

` `( map ~a

` `( append-map ( λ ( digit-run )

` `( list ( string-length digit-run )

` `( substring digit-run 0 1 ) ) )

` `digit-runs ) ) ) ) )

` `

` `]

```
```

@chunk [ <day10-q1>

` `

` `( define ( q1 input-key )

` `( string-length ( look-and-say 40 input-key ) ) ) ]

```
```

```
```

```
```

@section { After 50 iterations? }

```
```

We use the same @racket [ look-and-say ] function , but with an iteration argument of @racket [ 50 ] rather than @racket [ 40 ] .

```
```

@chunk [ <day10-q2>

` `

` `( define ( q2 input-key )

` `( string-length ( look-and-say 50 input-key ) ) ) ]

```
```

```
```

@section { Testing Day 10 }

```
```

@chunk [ <day10-test>

` `( module+ test

` `( define input-key ( file->string " day10-input.txt " ) )

` `( check-equal? ( q1 input-key ) 492982 )

` `( check-equal? ( q2 input-key ) 6989950 ) ) ]

```
```

```
```