#if !hasFeature(Embedded) import Foundation #endif @main struct Day01 { static func run() { guard let input = realInput else { print("input sttring nil") return } print("Started...") let parsed = parseInput(input) part1(parsed) part2(parsed) print("Press Start to exit...") } static func parseInput(_ input: String) -> [(Direction, Int)] { input.split(separator: "\n").map({ line in return ( Direction(line.first!), Int(line.dropFirst())! ) }) } static func part1(_ input: [(Direction, Int)]) { var cur = 50 var count = 0 for (dir, num) in input { cur = switch dir { case .Left: (cur - num) % 100 case .Right: (cur + num) % 100 } if (cur < 0) { cur += 100 } if (cur == 0) { count += 1 } } print("Part 1: \(count)") } static func part2(_ input: [(Direction, Int)]) { var cur = 50 var count = 0 for (dir, num) in input { let start = cur let fullCycles = num - (num % 100) count += fullCycles / 100 cur = switch dir { case .Left: (cur - num) % 100 case .Right: (cur + num) % 100 } if (cur < 0) { cur += 100 } switch dir { case .Left: if (start - (num % 100)) < 0 && start != 0 { count += 1 } case .Right: if (start + (num % 100)) >= 100 && start != 0 && cur != 0 { count += 1 } } if (cur == 0) { count += 1 } } print("Part 2: \(count)") } #if hasFeature(Embedded) static func main() { gfxInitDefault() consoleInit(GFX_TOP, nil) guard romfsInit() == 0 else { print("Couldn't init RomFS") return } testInput = stringFromFile("romfs:/test.txt") realInput = stringFromFile("romfs:/input.txt") run() while aptMainLoop() { hidScanInput() let kDown = hidKeysDown() if kDown & KEY_START != 0 { break } gfxFlushBuffers() gfxSwapBuffers() } gfxExit() } static func stringFromFile(_ path: String) -> String { let file = fopen(path, "r") var ret = "" var buf = [CChar](repeating: 0, count: 100) while fgets(&buf, 100, file) != nil { ret += String(cString: buf) } guard feof(file) != 0 else { print("Error reading file \(path)") return "" } return ret } #else static func main() { testInput = try? String(contentsOfFile: "romfs/test.txt") realInput = try? String(contentsOfFile: "romfs/input.txt") run() } #endif } enum Direction { case Left case Right init(_ char: Character) { self = switch char { case "L": Direction.Left case "R": Direction.Right default: fatalError() } } } var testInput: String? = nil var realInput: String? = nil