diff --git a/Sources/AOC2018/data/day07.txt b/Sources/AOC2018/data/day07.txt new file mode 100644 index 0000000..609cd83 --- /dev/null +++ b/Sources/AOC2018/data/day07.txt @@ -0,0 +1,101 @@ +Step G must be finished before step X can begin. +Step X must be finished before step B can begin. +Step A must be finished before step I can begin. +Step D must be finished before step H can begin. +Step O must be finished before step T can begin. +Step H must be finished before step C can begin. +Step S must be finished before step E can begin. +Step U must be finished before step M can begin. +Step M must be finished before step Z can begin. +Step R must be finished before step N can begin. +Step C must be finished before step Q can begin. +Step T must be finished before step P can begin. +Step I must be finished before step W can begin. +Step W must be finished before step N can begin. +Step P must be finished before step J can begin. +Step N must be finished before step F can begin. +Step Y must be finished before step J can begin. +Step J must be finished before step L can begin. +Step L must be finished before step E can begin. +Step E must be finished before step B can begin. +Step Q must be finished before step B can begin. +Step F must be finished before step K can begin. +Step V must be finished before step K can begin. +Step Z must be finished before step B can begin. +Step B must be finished before step K can begin. +Step G must be finished before step U can begin. +Step E must be finished before step V can begin. +Step A must be finished before step Z can begin. +Step C must be finished before step V can begin. +Step R must be finished before step B can begin. +Step Q must be finished before step Z can begin. +Step R must be finished before step K can begin. +Step T must be finished before step B can begin. +Step L must be finished before step B can begin. +Step M must be finished before step K can begin. +Step T must be finished before step Z can begin. +Step W must be finished before step B can begin. +Step I must be finished before step E can begin. +Step A must be finished before step M can begin. +Step V must be finished before step Z can begin. +Step Y must be finished before step B can begin. +Step Q must be finished before step F can begin. +Step W must be finished before step Y can begin. +Step U must be finished before step K can begin. +Step D must be finished before step F can begin. +Step P must be finished before step F can begin. +Step N must be finished before step L can begin. +Step H must be finished before step T can begin. +Step H must be finished before step L can begin. +Step C must be finished before step T can begin. +Step H must be finished before step I can begin. +Step Z must be finished before step K can begin. +Step L must be finished before step Z can begin. +Step Y must be finished before step K can begin. +Step I must be finished before step V can begin. +Step P must be finished before step K can begin. +Step P must be finished before step N can begin. +Step G must be finished before step D can begin. +Step I must be finished before step J can begin. +Step H must be finished before step K can begin. +Step L must be finished before step Q can begin. +Step D must be finished before step M can begin. +Step O must be finished before step V can begin. +Step R must be finished before step L can begin. +Step D must be finished before step W can begin. +Step M must be finished before step J can begin. +Step O must be finished before step R can begin. +Step N must be finished before step Z can begin. +Step Y must be finished before step V can begin. +Step W must be finished before step L can begin. +Step U must be finished before step Y can begin. +Step S must be finished before step V can begin. +Step M must be finished before step P can begin. +Step X must be finished before step A can begin. +Step A must be finished before step E can begin. +Step A must be finished before step L can begin. +Step A must be finished before step R can begin. +Step V must be finished before step B can begin. +Step P must be finished before step B can begin. +Step E must be finished before step F can begin. +Step T must be finished before step V can begin. +Step S must be finished before step R can begin. +Step T must be finished before step F can begin. +Step P must be finished before step Y can begin. +Step A must be finished before step C can begin. +Step J must be finished before step F can begin. +Step H must be finished before step B can begin. +Step C must be finished before step E can begin. +Step P must be finished before step E can begin. +Step D must be finished before step I can begin. +Step X must be finished before step F can begin. +Step T must be finished before step Q can begin. +Step J must be finished before step B can begin. +Step C must be finished before step B can begin. +Step P must be finished before step Q can begin. +Step H must be finished before step R can begin. +Step F must be finished before step B can begin. +Step T must be finished before step J can begin. +Step A must be finished before step W can begin. +Step N must be finished before step K can begin. +Step T must be finished before step E can begin. diff --git a/Sources/AOC2018/day07.swift b/Sources/AOC2018/day07.swift new file mode 100644 index 0000000..78f438a --- /dev/null +++ b/Sources/AOC2018/day07.swift @@ -0,0 +1,125 @@ +// +// Advent of Code 2018 "Day 7: The Sum of Its Parts" +// + +import Foundation + +struct Instruction: Equatable, Comparable { + var complete = Character(" ") + var before = Character(" ") + + static func == (lhs: Instruction, rhs: Instruction) -> Bool { + return (lhs.complete == rhs.complete) && (lhs.before == rhs.before) + } + + static func < (lhs: Instruction, rhs: Instruction) -> Bool { + return lhs.complete < rhs.complete + } +} + +class SumParts { + var instrList: [Instruction] = [] + var inventoryComplete: [Character] = [] + + // Supply filename for input ex: '/home/peterr/AOC2018/Sources/AOC2018/data/day07.txt' + init(withFile filename: String) { + let instrString = Tools.readFile(fromPath: filename) + var instrArray = instrString.components(separatedBy: "\n") + // This gurd statement is just an excuse to use guard + // I'm assuming the last string is an empty string, if not DON'T remove the last string + guard let lastStr = instrArray.last, lastStr.count == 0 else { return } + instrArray.removeLast() // empty string + parseData(withInstructions: instrArray) + } + + // Supply test data in the form of a String + init(withString instrString: String) { + let instrArray = instrString.components(separatedBy: "\n") + parseData(withInstructions: instrArray) + } + + func parseData(withInstructions instr: [String]) { + for ins in instr { + instrList.append(Instruction(complete: ins[5], before: ins[36])) + } + } + + func getNextAvailable() -> Character? { + var availDict: [Character : Bool] = [:] + for index in 0.. String { + var retVal = "" + var last: Character = "*" + while let instruction = getNextAvailable() { + retVal.append(instruction) + if let lastInstr = instrList.first(where: { $0.complete == instruction }) { + last = lastInstr.before + } + instrList.removeAll(where: { $0.complete == instruction }) + } + retVal.append(last) + return retVal + } +} + +class Day07: AOCDay { + lazy var tests: (() -> ()) = day07Tests + lazy var final: (() -> ()) = day07Final + + let testData = """ + Step C must be finished before step A can begin. + Step C must be finished before step F can begin. + Step A must be finished before step B can begin. + Step A must be finished before step D can begin. + Step B must be finished before step E can begin. + Step D must be finished before step E can begin. + Step F must be finished before step E can begin. + """ + + func testSumPartsInit() { + var instr = SumParts(withString: testData) + XCTAssertEqual(test: "testSumPartsInit string 0", withExpression: (instr.instrList[0].before == "A")) + XCTAssertEqual(test: "testSumPartsInit string 4", withExpression: (instr.instrList[4].complete == "B")) + instr = SumParts(withFile: "/home/peterr/AOC2018/Sources/AOC2018/data/day07.txt") + XCTAssertEqual(test: "testSumPartsInit file 0", withExpression: (instr.instrList[0].before == "X")) + XCTAssertEqual(test: "testSumPartsInit file 4", withExpression: (instr.instrList[4].complete == "O")) + } + + func testGetNextAvailable() { + let instr = SumParts(withString: testData) + if let avail = instr.getNextAvailable() { + XCTAssertEqual(test: "testGetNextAvailable", withExpression: (avail == "C")) + } else { + XCTAssertEqual(test: "testGetNextAvailable", withExpression: (false)) + } + } + + func testCompleteInstructions() { + let instr = SumParts(withString: testData) + let answer = instr.completeInstructions() + XCTAssertEqual(test: "testCompleteInstructions", withExpression: (answer == "CABDFE")) + } + + func day07Tests() { + testSumPartsInit() + testGetNextAvailable() + testCompleteInstructions() + } + + func day07Final() { + let retVal = "None" + let instr = SumParts(withFile: "/home/peterr/AOC2018/Sources/AOC2018/data/day07.txt") + let answer = instr.completeInstructions() + print("Answer to part 1 is: \(answer)") + print("Answer to part 2 is: \(retVal)") + } +} diff --git a/Sources/AOC2018/main.swift b/Sources/AOC2018/main.swift index fba28c2..a037f89 100644 --- a/Sources/AOC2018/main.swift +++ b/Sources/AOC2018/main.swift @@ -5,7 +5,7 @@ import Foundation let showTests = true -let onlyOneDay = 0 +let onlyOneDay = 7 var allTests: [(() -> ())] = [] var allFinal: [(() -> ())] = [] @@ -18,6 +18,7 @@ allTests.append(Day03().tests) allTests.append(Day04().tests) allTests.append(Day05().tests) allTests.append(Day06().tests) +allTests.append(Day07().tests) // Compile list of Answers allFinal.append(Day01().final) @@ -26,6 +27,7 @@ allFinal.append(Day03().final) allFinal.append(Day04().final) allFinal.append(Day05().final) allFinal.append(Day06().final) +allFinal.append(Day07().final) if onlyOneDay > 0 { print("\nDay \(onlyOneDay)")