-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay 19 - Linen Layout.swift
48 lines (38 loc) · 997 Bytes
/
Day 19 - Linen Layout.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import Foundation
let puzzle = """
r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb
"""
let puzzles = puzzle.components(separatedBy: "\n\n")
let towels = Set(puzzles[0].components(separatedBy: ", "))
let designs = puzzles[1].components(separatedBy: .newlines)
var arrangementCountsByDesign: [String: Int] = [:]
// Part 1
let possibleDesignCount = designs
.map(arrangementCount)
.filter { $0 > 0 }
.count
// Part 2
let totalArrangementCount = designs
.map(arrangementCount)
.reduce(into: 0, +=)
func arrangementCount(of design: String) -> Int {
guard !design.isEmpty else { return 1 }
if let count = arrangementCountsByDesign[design] {
return count
}
let count = design
.indices
.filter { towels.contains(String(design[$0...])) }
.map { arrangementCount(of: String(design[..<$0])) }
.reduce(into: 0, +=)
arrangementCountsByDesign[design] = count
return count
}