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