parent
a57839a58a
commit
62f65846c7
@ -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.
|
||||
@ -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..<instrList.count {
|
||||
if !instrList.contains(where: { $0.before == instrList[index].complete} ) {
|
||||
availDict[instrList[index].complete] = true
|
||||
}
|
||||
}
|
||||
var available = Array(availDict.keys)
|
||||
available.sort()
|
||||
return available.first
|
||||
}
|
||||
|
||||
func completeInstructions() -> 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)")
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue