Added code for Day 7 (Part 1)

Day 7: The Sum of Its Parts
master
Peter 7 years ago
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)")
}
}

@ -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)")

Loading…
Cancel
Save