Compare commits

...

30 Commits

Author SHA1 Message Date
fe8e901212 Some optimisations 2021-12-17 07:02:13 +01:00
4a62be948b Cleanup 2021-12-17 06:55:22 +01:00
ac6082f993 17a+b 2021-12-17 06:48:02 +01:00
632868f7f3 Cleanup 2021-12-16 18:55:25 +01:00
7326d17948 refactor 2021-12-16 08:32:02 +01:00
a786262683 16b 2021-12-16 08:07:37 +01:00
e70e71b068 16a 2021-12-16 07:52:35 +01:00
c7e8bf103e both parts 2021-12-15 14:32:20 +01:00
2239760ce2 15b 2021-12-15 14:20:33 +01:00
07ac0b2fc5 15b slow version, do not use 2021-12-15 13:00:00 +01:00
f6fa8e6b6a 15a 2021-12-15 12:00:41 +01:00
5780588903 cosmetic fixes 2021-12-14 20:31:09 +01:00
40053ef992 Switched from string fiddling to actual character pairs 2021-12-14 20:13:34 +01:00
dac98f99b5 14b 2021-12-14 19:50:38 +01:00
ae1b714614 14a (bad version) 2021-12-14 17:24:15 +01:00
365e67056b clearer output 2021-12-13 07:45:12 +01:00
aeb51d7c68 13b 2021-12-13 07:44:50 +01:00
c4db5fad8d 13a 2021-12-13 07:34:17 +01:00
7f201a614b 12b 2021-12-12 10:43:05 +01:00
5052110cb1 12a 2021-12-12 09:26:08 +01:00
6ffaa01033 11a added missing sources 2021-12-11 11:06:13 +01:00
1104d568d0 11a 2021-12-11 11:05:39 +01:00
ab1d21241b Calculated syntax score directly 2021-12-10 07:47:04 +01:00
ec5a7feb3f Switched dequeue popping around 2021-12-10 07:43:23 +01:00
984ae73600 Cleaned up 2021-12-10 07:40:47 +01:00
d751bc64f8 10b 2021-12-10 07:33:51 +01:00
b2afe310b4 10a 2021-12-10 07:08:34 +01:00
cba675a2b2 removed unnecessary import 2021-12-09 20:18:36 +01:00
93f1c73fbf Caching neighbours 2021-12-09 20:01:26 +01:00
3dd2188f11 09b 2021-12-09 19:51:45 +01:00
35 changed files with 2424 additions and 16 deletions

View File

@ -18,7 +18,15 @@ let package = Package(
.executable(name: "06", targets: ["06"]), .executable(name: "06", targets: ["06"]),
.executable(name: "07", targets: ["07"]), .executable(name: "07", targets: ["07"]),
.executable(name: "08", targets: ["08"]), .executable(name: "08", targets: ["08"]),
.executable(name: "09", targets: ["09"]) .executable(name: "09", targets: ["09"]),
.executable(name: "10", targets: ["10"]),
.executable(name: "11", targets: ["11"]),
.executable(name: "12", targets: ["12"]),
.executable(name: "13", targets: ["13"]),
.executable(name: "14", targets: ["14"]),
.executable(name: "15", targets: ["15"]),
.executable(name: "16", targets: ["16"]),
.executable(name: "17", targets: ["17"])
], ],
dependencies: [ dependencies: [
// Dependencies declare other packages that this package depends on. // Dependencies declare other packages that this package depends on.
@ -80,6 +88,46 @@ let package = Package(
.executableTarget( .executableTarget(
name: "09", name: "09",
dependencies: [.targetItem(name: "Runner", condition: nil)] dependencies: [.targetItem(name: "Runner", condition: nil)]
),
.executableTarget(
name: "10",
dependencies: [
.targetItem(name: "Runner", condition: nil),
.product(name: "Collections", package: "swift-collections"),
]
),
.executableTarget(
name: "11",
dependencies: [ .targetItem(name: "Runner", condition: nil) ]
),
.executableTarget(
name: "12",
dependencies: [
.targetItem(name: "Runner", condition: nil),
.product(name: "Collections", package: "swift-collections")
]
),
.executableTarget(
name: "13",
dependencies: [ .targetItem(name: "Runner", condition: nil) ]
),
.executableTarget(
name: "14",
dependencies: [ .targetItem(name: "Runner", condition: nil) ]
),
.executableTarget(
name: "15",
dependencies: [ .targetItem(name: "Runner", condition: nil),
.product(name: "Collections", package: "swift-collections")]
),
.executableTarget(
name: "16",
dependencies: [ .targetItem(name: "Runner", condition: nil) ]
),
.executableTarget(
name: "17",
dependencies: [ .targetItem(name: "Runner", condition: nil),
.product(name: "Collections", package: "swift-collections")]
) )
] ]
) )

View File

@ -7,9 +7,8 @@
import Foundation import Foundation
import Runner import Runner
import Collections
struct Coord { struct Coord: Hashable {
let row: Int let row: Int
let col: Int let col: Int
@ -33,31 +32,34 @@ struct Coord {
} }
struct Field:Sequence, IteratorProtocol { struct Field:Sequence, IteratorProtocol {
typealias Element = Coord
let numbers: [[Int]] let numbers: [[Int]]
let numCols: Int let numCols: Int
let numRows: Int let numRows: Int
var neighbors = [Coord:[Coord]]()
var current: Coord? = Coord(row: 0, col: 0) var current: Coord? = Coord(row: 0, col: 0)
init(numbers: [[Int]]) { init(numbers: [[Int]]) {
self.numbers = numbers self.numbers = numbers
numCols = numbers.first!.count numCols = numbers.first?.count ?? 0
numRows = numbers.count numRows = numbers.count
} }
func getNeighborsCoordsFor(coord: Coord) -> [Coord] { mutating func getNeighborsCoordsFor(coord: Coord) -> [Coord] {
return [coord.getAbove(), coord.getRight(), coord.getBelow(), coord.getLeft()] let n = neighbors[coord] ?? [coord.getAbove(), coord.getRight(), coord.getBelow(), coord.getLeft()]
.compactMap { $0 } .compactMap { $0 }
.filter { $0.row < numRows && $0.col < numCols } .filter { $0.row < numRows && $0.col < numCols }
neighbors[coord] = n
return n
} }
func lowPointValueAt(coord: Coord) -> Int? { mutating func isLowPointAt(coord: Coord) -> Bool {
let value = numbers[coord.row][coord.col] let value = self[coord]
return getNeighborsCoordsFor(coord: coord) return getNeighborsCoordsFor(coord: coord)
.map { numbers[$0.row][$0.col] } .map { numbers[$0.row][$0.col] }
.allSatisfy { $0 > value } .allSatisfy { $0 > value }
? value
: nil
} }
private func getNextCoord() -> Coord? { private func getNextCoord() -> Coord? {
@ -79,19 +81,59 @@ struct Field:Sequence, IteratorProtocol {
} }
return current return current
} }
subscript(index: Coord) -> Int {
get {
numbers[index.row][index.col]
}/*
set(newValue) {
// Perform a suitable setting action here.
}*/
}
} }
struct Day09: Runnable { class Day09: Runnable {
let inputPath: String let inputPath: String
var lowestNeighbors = [Coord: Coord]()
var lowPoints = Set<Coord>()
var field = Field(numbers: [[Int]]())
func run() { required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath) let input = try! String(contentsOfFile: inputPath)
let entries = input let entries = input
.trimmingCharacters(in: .newlines) .trimmingCharacters(in: .newlines)
.components(separatedBy: .newlines) .components(separatedBy: .newlines)
.map { line in line.map { $0.wholeNumberValue! } } .map { line in line.map { $0.wholeNumberValue! } }
let field = Field(numbers: entries) field = Field(numbers: entries)
let sum = field.compactMap { field.lowPointValueAt(coord: $0) }.reduce(0, { $0 + $1 + 1 }) lowPoints = Set(field.filter { field.isLowPointAt(coord: $0) })
//Part 1
let sum = lowPoints.map { field[$0] }.reduce(0, +) + lowPoints.count
print(sum) print(sum)
// Part 2:
var basinSize = [Coord: Int]()
for coord in field {
guard field[coord] != 9 else {
continue
}
let bl = basinLocation(for: coord)
basinSize[bl, default: 0] += 1
}
let result = basinSize.values.sorted(by: >)[0..<3].reduce(1, *)
print(result)
}
private func basinLocation(for coord: Coord) -> Coord {
guard !lowPoints.contains(coord) else {
return coord
}
let closestNeighbor = lowestNeighbors[coord] ?? field.getNeighborsCoordsFor(coord: coord).min(by: { field[$0] < field[$1] })!
lowestNeighbors[coord] = closestNeighbor
return basinLocation(for: closestNeighbor)
} }
} }

View File

@ -8,5 +8,5 @@
import Foundation import Foundation
import Runner import Runner
Runner(target: Day09.self, day: "09", isTest: true).run() //Runner(target: Day09.self, day: "09", isTest: true).run()
//Runner(target: Day09.self, day: "09", isTest: false).run() Runner(target: Day09.self, day: "09", isTest: false).run()

106
Sources/10/10.swift Normal file
View File

@ -0,0 +1,106 @@
//
// File.swift
//
//
// Created by Max Nuding on 05.12.21.
//
import Foundation
import Runner
import Collections
struct Day10: Runnable {
let inputPath: String
public func run() {
let input = try! String(contentsOfFile: inputPath)
let lines = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: .newlines)
var s = Deque<String.Element>()
var illegalCharacters = [String.Element]()
var syntaxScore = 0
var autocompleteScores = [Int]()
for line in lines {
s = Deque<String.Element>()
var isIllegalLine = false
for char in line {
if char.isClosing {
guard let popped = s.popFirst() else {
fatalError()
}
guard let shouldBeClosedBy = popped.closedBy else {
fatalError()
}
if shouldBeClosedBy == char {
continue // Valid chunk
}
//print("Line: \(lineNumber): Expected \(shouldBeClosedBy), but found \(char) instead")
syntaxScore += char.score!
isIllegalLine = true
break
}
s.prepend(char)
}
if !isIllegalLine {
var lineScore = 0
while let last = s.popFirst() {
let charValue = last.closedBy!.autocompleteScore!
lineScore = lineScore * 5 + charValue
}
autocompleteScores.append(lineScore)
}
}
print(syntaxScore)
print(autocompleteScores.sorted()[autocompleteScores.count / 2])
}
}
extension String.Element {
var isClosing: Bool { self == "]" || self == ")" || self == ">" || self == "}" }
var closedBy: String.Element? {
switch self {
case "[":
return "]"
case "(":
return ")"
case "{":
return "}"
case "<":
return ">"
default:
return nil
}
}
var score: Int? {
switch self {
case ")":
return 3
case "]":
return 57
case "}":
return 1197
case ">":
return 25137
default:
return nil
}
}
var autocompleteScore: Int? {
switch self {
case ")":
return 1
case "]":
return 2
case "}":
return 3
case ">":
return 4
default:
return nil
}
}
}

12
Sources/10/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 05.12.21.
//
import Foundation
import Runner
//Runner(target: Day10.self, day: "10", isTest: true).run()
Runner(target: Day10.self, day: "10", isTest: false).run()

109
Sources/11/11.swift Normal file
View File

@ -0,0 +1,109 @@
//
// File.swift
//
//
// Created by Max Nuding on 11.12.21.
//
import Foundation
import Runner
struct Coord: Hashable {
let row: Int
let col: Int
var left: Coord { Coord(row: row, col: col - 1) }
var right: Coord { Coord(row: row, col: col + 1) }
var top: Coord { Coord(row: row - 1, col: col) }
var bottom: Coord { Coord(row: row + 1, col: col) }
var topLeft: Coord { Coord(row: row - 1, col: col - 1) }
var topRight: Coord { Coord(row: row - 1, col: col + 1) }
var bottomLeft: Coord { Coord(row: row + 1, col: col - 1) }
var bottomRight: Coord { Coord(row: row + 1, col: col + 1) }
var neighbors: [Coord] {
[topLeft, top, topRight, left, right, bottomLeft, bottom, bottomRight]
.filter {coord in coord.col >= 0 && coord.col < 10 && coord.row >= 0 && coord.row < 10}
}
}
class Day11: Runnable {
let inputPath: String
var octopuses = [[Int]]()
var flashed = Set<Coord>()
let numRows = 10
let numCols = 10
var numFlashes = 0
required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
octopuses = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: .newlines)
.map { Array($0) }
.map { ar in ar.map {c in Int(c.description)!} }
var step = 0
while(flashed.count < numRows * numCols) {
flashed = Set<Coord>()
for row in octopuses.indices {
for col in octopuses[row].indices {
octopuses[row][col] += 1
}
}
for row in octopuses.indices {
for col in octopuses[row].indices {
let coord = Coord(row: row, col: col)
checkAndFlash(at: coord)
}
}
for flash in flashed {
octopuses[flash] = 0
}
step += 1
if step == 100 {
print(numFlashes)
}
}
print("All flashing at step: \(step)")
}
func checkAndFlash(at coord: Coord) {
if octopuses[coord] <= 9 || flashed.contains(coord) {
return
}
flashed.insert(coord)
numFlashes += 1
for neighbor in coord.neighbors.filter({!flashed.contains($0)}) {
octopuses[neighbor] += 1
checkAndFlash(at: neighbor)
}
}
}
extension Array where Element == Array<Int> {
subscript(coord: Coord) -> Int {
get { self[coord.row][coord.col] }
set(newValue) {
self[coord.row][coord.col] = newValue
}
}
func fieldDescription(flashed: Set<Coord>) -> String {
var desc = ""
for row in indices {
for col in self[row].indices {
let c = flashed.contains(Coord(row: row, col: col)) ? " X" : String(format: "%02d", self[row][col])
desc.append("\(c),")
}
desc.append("\n")
}
return desc
}
}

12
Sources/11/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 05.12.21.
//
import Foundation
import Runner
//Runner(target: Day11.self, day: "11", isTest: true).run()
Runner(target: Day11.self, day: "11", isTest: false).run()

155
Sources/12/12.swift Normal file
View File

@ -0,0 +1,155 @@
//
// File.swift
//
//
// Created by Max Nuding on 12.12.21.
//
import Foundation
import Runner
import Collections
class Cave: Hashable, CustomStringConvertible, CustomDebugStringConvertible {
static func == (lhs: Cave, rhs: Cave) -> Bool { lhs.name == rhs.name }
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
var description: String { name }
var debugDescription: String { name }
let name: String
var connectedCaves = [Cave]()
var isBigCave: Bool
var isEnd: Bool
var isStart: Bool
required init(name: String) {
self.name = name
self.isBigCave = name.first!.isUppercase
self.isEnd = name == "end"
self.isStart = name == "start"
}
}
struct Path: Hashable, CustomStringConvertible {
var parts: [Cave]
var visitedSmallCaveTwice = false
var description: String
func contains(cave: Cave) -> Bool { parts.contains(cave) }
func appending(cave: Cave) -> Path {
var newParts = parts
newParts.append(cave)
return Path(
parts: newParts,
visitedSmallCaveTwice: visitedSmallCaveTwice || !cave.isBigCave && contains(cave: cave))
}
static func == (lhs: Path, rhs: Path) -> Bool { lhs.description == rhs.description }
func hash(into hasher: inout Hasher) {
hasher.combine(description)
}
init(parts: [Cave], visitedSmallCaveTwice: Bool = false) {
self.parts = parts
self.visitedSmallCaveTwice = visitedSmallCaveTwice
self.description = (visitedSmallCaveTwice ? "*" : "") + parts.map {$0.description}.joined(separator: "->")
}
}
class Day12: Runnable {
let inputPath: String
var caves = [String:Cave]()
required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
caves = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: .newlines)
.reduce(into: [String:Cave](), { caves, line in
let caveConnection = line.components(separatedBy: "-")
let caveFromName = caveConnection.first!
let caveToName = caveConnection.last!
let from = caves[caveFromName] ?? Cave(name: caveFromName)
let to = caves[caveToName] ?? Cave(name: caveToName)
from.connectedCaves.append(to)
to.connectedCaves.append(from)
caves[caveFromName] = from
caves[caveToName] = to
})
runA()
runB()
}
func runA() {
var queue = Deque<Path>(minimumCapacity: 10000)
var visited = Set<Path>(minimumCapacity: 10000)
var numFinished = 0
var cave: Path? = Path(parts: [caves["start"]!])
queue.append(cave!)
while !queue.isEmpty {
cave = queue.popFirst()
if visited.contains(cave!) {
continue
}
visited.insert(cave!)
cave!.parts.last!.connectedCaves
.filter { $0.isBigCave || !cave!.contains(cave: $0) }
.forEach {
if $0.isEnd {
numFinished += 1
//print("Finished: \(cave!.parts)->end")
return
}
var newParts = cave!.parts
newParts.append($0)
queue.append(Path(parts: newParts))
}
}
print(numFinished)
}
func runB() {
var queue = Deque<Path>(minimumCapacity: 1000000)
var visited = Set<Path>(minimumCapacity: 1000000)
var numFinished = 0
var cave: Path? = Path(parts: [caves["start"]!])
queue.append(cave!)
while !queue.isEmpty {
cave = queue.popFirst()
if visited.contains(cave!) {
continue
}
visited.insert(cave!)
cave!.parts.last!.connectedCaves
.forEach {
if $0.isStart || (cave!.visitedSmallCaveTwice && !$0.isBigCave && cave!.contains(cave: $0)) {
return
}
if $0.isEnd {
numFinished += 1
return
}
var newParts = cave!.parts
newParts.append($0)
queue.append(cave!.appending(cave: $0))
}
}
print(numFinished)
}
}

12
Sources/12/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 05.12.21.
//
import Foundation
import Runner
//Runner(target: Day12.self, day: "12", isTest: true).run()
Runner(target: Day12.self, day: "12", isTest: false).run()

113
Sources/13/13.swift Normal file
View File

@ -0,0 +1,113 @@
//
// File.swift
//
//
// Created by Max Nuding on 12.12.21.
//
import Foundation
import Runner
struct Coord: Hashable {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
init(line: String) {
let parts = line.split(separator: ",").map { Int($0)! }
x = parts.first!
y = parts.last!
}
func foldingUp(by y: Int) -> Coord {
guard self.y > y else {
return self
}
return Coord(x: x, y: y - (self.y - y))
}
func foldingLeft(by x: Int) -> Coord {
guard self.x > x else {
return self
}
return Coord(x: x - (self.x - x), y: y)
}
func folding(by instruction: FoldingInstruction) -> Coord {
switch instruction {
case .up(let y):
return foldingUp(by: y)
case .left(let x):
return foldingLeft(by: x)
}
}
}
enum FoldingInstruction {
case up(y: Int)
case left(x: Int)
init?(line: String) {
let i = line.split(separator: " ").last!.split(separator: "=")
let coord = Int(i.last!)!
switch i.first {
case "x":
self = .left(x: coord)
case "y":
self = .up(y: coord)
default:
return nil
}
}
}
class Day13: Runnable {
let inputPath: String
required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
let parts = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: "\n\n")
var dots = parts.first!
.components(separatedBy: .newlines)
.map(Coord.init)
let instructions = parts.last!
.components(separatedBy: .newlines)
.map { FoldingInstruction(line: $0)! }
var isFirst = true
for instruction in instructions {
dots = dots.map { $0.folding(by: instruction) }
if isFirst {
print(Set(dots).count)
isFirst = false
}
}
printDots(dots: dots)
}
func printDots(dots:[Coord]) {
let maxX = dots.map {$0.x}.max()!
let maxY = dots.map {$0.y}.max()!
let uniqueDots = Set(dots)
var s = ""
for y in 0...maxY {
for x in 0...maxX {
s += uniqueDots.contains(Coord(x: x, y: y)) ? "#" : " "
}
s += "\n"
}
print(s)
}
}

12
Sources/13/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 05.12.21.
//
import Foundation
import Runner
//Runner(target: Day13.self, day: "13", isTest: true).run()
Runner(target: Day13.self, day: "13", isTest: false).run()

82
Sources/14/14.swift Normal file
View File

@ -0,0 +1,82 @@
//
// File.swift
//
//
// Created by Max Nuding on 14.12.21.
//
import Foundation
import Runner
struct Pair: Hashable {
let first: String.Element
let second: String.Element
init(_ str: String) {
first = str.first!
second = str.last!
}
init(first: String.Element, second: String.Element) {
self.first = first
self.second = second
}
}
class Day14: Runnable {
let inputPath: String
required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
let parts = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: "\n\n")
let startingPolymer = parts.first!
let replacements = parts.last!
.components(separatedBy: .newlines)
.map {$0.components(separatedBy: " -> ")}
.reduce(into: [Pair:String.Element](), {
$0[Pair($1.first!)] = $1.last!.first!
})
var pairCounts = [Pair:Int]()
var charCount = [String.Element:Int](minimumCapacity: 26)
for i in startingPolymer.indices {
let firstCharacter = startingPolymer[i]
charCount[firstCharacter, default: 0] += 1
let next = startingPolymer.index(i, offsetBy: 1)
guard next != startingPolymer.endIndex else {
continue
}
pairCounts[Pair(first: firstCharacter, second: startingPolymer[next]), default: 0] += 1
}
for step in 1...40 {
let tmpPairCounts = pairCounts
tmpPairCounts.forEach { pairCount in
let pair = pairCount.key
let replacement = replacements[pair]!
pairCounts[pair]! -= pairCount.value
pairCounts[Pair(first: pair.first, second: replacement), default: 0] += pairCount.value
pairCounts[Pair(first: replacement, second: pair.second), default: 0] += pairCount.value
charCount[replacement, default: 0] += pairCount.value
}
if step == 10 {
printResult(charCount: charCount)
}
}
printResult(charCount: charCount)
}
func printResult(charCount: [String.Element:Int]) {
// Sort instead of min/max so we need to only go through the dict once
let sorted = charCount.sorted(by: {$0.value > $1.value })
let maxC = sorted.first!
let minC = sorted.last!
print(maxC.value - minC.value)
}
}

12
Sources/14/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 14.12.21.
//
import Foundation
import Runner
//Runner(target: Day14.self, day: "14", isTest: true).run()
Runner(target: Day14.self, day: "14", isTest: false).run()

152
Sources/15/15.swift Normal file
View File

@ -0,0 +1,152 @@
//
// File.swift
//
//
// Created by Max Nuding on 15s.12.21.
//
import Foundation
import Runner
import Collections
typealias ThreatLevel = Int
struct Coord: Hashable, CustomStringConvertible {
let row: Int
let col: Int
var description: String { "(\(row), \(col))" }
func neighbors() -> [Coord] {
[
Coord(row: row-1, col: col),
Coord(row: row, col: col+1),
Coord(row: row+1, col: col),
Coord(row: row, col: col-1)
]
}
}
class Day15: Runnable {
let inputPath: String
var lastRow: Int = 0
var lastCol: Int = 0
var parts = [[ThreatLevel]]()
var neighbors = [Coord: [Coord]]()
required init(inputPath: String) {
self.inputPath = inputPath
}
private func expandMap() {
var tmpParts = parts
for (rowNum, row) in tmpParts.enumerated() {
let newRow = [Int](0...4).flatMap { cr in
row.map { rv in cr + rv }.map { $0 > 9 ? $0 - 9 : $0 }
}
parts[rowNum] = newRow
}
tmpParts = parts
for num in 1...4 {
for i in tmpParts.indices {
let tr = tmpParts[i]
let ntr = tr.map { $0 + num }.map { $0 > 9 ? $0 - 9 : $0 }
parts.append(ntr)
}
}
lastRow = parts.count - 1
lastCol = (parts.first?.count ?? 0) - 1
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
parts = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: .newlines)
.map { Array($0) }
.map { ar in ar.map {c in ThreatLevel(c.description)!} }
lastRow = parts.count - 1
lastCol = (parts.first?.count ?? 0) - 1
calculateSafestPath()
expandMap()
neighbors = [Coord: [Coord]]()
calculateSafestPath()
}
private func calculateSafestPath() {
// Distances to startNode
var totalThreatLevel = [Coord: ThreatLevel]()
var unvisited = Set(parts.enumerated().flatMap {row in
row.element.indices.map { col in
Coord(row: row.offset, col: col)
}
})
/* Keep a seperate dictionary, to calculate which coordinates have a set threat level
* a.k.a total distance to start
* This allows to find the next coordinate to check fairly quickly, by just
* looking at the minmum key in this.
* I initially tried a PriorityQueue, but my implementation was pretty slow and it spent too much time sorting
*/
var threatLevelDistrubution = [ThreatLevel: Set<Coord>]()
let startNode = Coord(row: 0, col: 0)
totalThreatLevel[startNode] = 0
threatLevelDistrubution[Int.max] = unvisited
threatLevelDistrubution[Int.max]!.remove(startNode)
threatLevelDistrubution[0] = Set([startNode])
while let threatLevel = threatLevelDistrubution.keys.min() {
let currentNode = threatLevelDistrubution[threatLevel]!.first!
unvisited.remove(currentNode)
threatLevelDistrubution[threatLevel]!.remove(currentNode)
// Remove key from dictionary if not coords are left for a specific threat level
if threatLevelDistrubution[threatLevel]!.isEmpty {
threatLevelDistrubution.removeValue(forKey: threatLevel)
}
if neighbors[currentNode] == nil {
neighbors[currentNode] = currentNode
.neighbors()
.filter {
$0.col >= 0 && $0.col <= lastCol && $0.row >= 0 && $0.row <= lastRow
}
}
var adjacent = neighbors[currentNode]!
neighbors[currentNode] = adjacent
adjacent = adjacent
.filter {
unvisited.contains($0)
}
let currentThreatLevel = totalThreatLevel[currentNode, default: Int.max]
for a in adjacent {
let testCost = parts[a] + currentThreatLevel
let currentCost = totalThreatLevel[a, default: Int.max]
if currentCost > testCost {
totalThreatLevel[a] = testCost
threatLevelDistrubution[currentCost]!.remove(a)
threatLevelDistrubution[testCost, default: Set<Coord>()].insert(a)
// Remove key from dictionary if not coords are left for a specific threat leveli
if threatLevelDistrubution[currentCost]!.isEmpty {
threatLevelDistrubution.removeValue(forKey: currentCost)
}
}
}
}
print(totalThreatLevel[Coord(row: lastRow, col: lastCol)]!)
}
}
extension Array where Element == Array<Int> {
subscript(coord: Coord) -> Int {
get { self[coord.row][coord.col] }
set(newValue) {
self[coord.row][coord.col] = newValue
}
}
}

12
Sources/15/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 15.12.21.
//
import Foundation
import Runner
//Runner(target: Day15.self, day: "15", isTest: true).run()
Runner(target: Day15.self, day: "15", isTest: false).run()

191
Sources/16/16.swift Normal file
View File

@ -0,0 +1,191 @@
//
// File.swift
//
//
// Created by Max Nuding on 15.12.21.
//
import Foundation
import Runner
enum OperatorType: Int {
case sum = 0
case product = 1
case minimum = 2
case maximum = 3
case value = 4
case greaterThan = 5
case lessThan = 6
case equal = 7
}
protocol Packet {
var version: Int { get }
func getTotalVersion() -> Int
func getValue() -> Int
}
struct ValuePacket: Packet {
let version: Int
let value: Int
func getTotalVersion() -> Int { version }
func getValue() -> Int { value }
}
struct OperatorPacket: Packet {
let type: OperatorType
let version: Int
let subPackets: [Packet]
func getTotalVersion() -> Int { version + subPackets.map { $0.getTotalVersion() }.reduce(0, +) }
func getValue() -> Int {
let spValues = subPackets.map { $0.getValue() }
switch type {
case .sum:
return spValues.reduce(0, +)
case .product:
return spValues.reduce(1, *)
case .minimum:
return spValues.min()!
case .maximum:
return spValues.max()!
case .greaterThan:
return spValues.first! > spValues.last! ? 1 : 0
case .lessThan:
return spValues.first! < spValues.last! ? 1 : 0
case .equal:
return spValues.first! == spValues.last! ? 1 : 0
case .value:
fatalError()
}
}
}
class Day16: Runnable {
let inputPath: String
required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
let parts = input
.trimmingCharacters(in: .newlines)
let bytes = parts.bits().joined()
let packets = parsePacket(bytes: bytes)
let p: Packet = packets.0
print(p.getTotalVersion())
print(p.getValue())
}
func parsePacket<S>(bytes: S) -> (Packet, S.SubSequence) where S:StringProtocol {
let version = bytes[bytes.startIndex..<bytes.index(bytes.startIndex, offsetBy: 3)].binaryToDecimal()
let typeId = bytes[bytes.index(bytes.startIndex, offsetBy: 3)..<bytes.index(bytes.startIndex, offsetBy: 6)].binaryToDecimal()
var value: Packet
var reminder: S.SubSequence
switch typeId {
case 4:
let (v, r) = parseLiteralPacketValue(bytes: bytes)
value = ValuePacket(version: version, value: v)
reminder = r
default:
let (v, r) = parseOperatorPacker(bytes: bytes)
value = OperatorPacket(type: OperatorType(rawValue: typeId)!, version: version, subPackets: v)
reminder = r
}
return (value, reminder)
}
func parseOperatorPacker<S>(bytes: S) -> ([Packet], S.SubSequence) where S:StringProtocol {
let startNextBitsIndex = bytes.index(bytes.startIndex, offsetBy: 7)
let lengthTypeId = bytes[bytes.index(bytes.startIndex, offsetBy: 6)..<startNextBitsIndex].description
let isTotalLength = lengthTypeId == "0"
let nextBitsLength = isTotalLength ? 15 : 11
let endNextBitsIndex = bytes.index(startNextBitsIndex, offsetBy: nextBitsLength)
let nextBits = bytes[startNextBitsIndex..<endNextBitsIndex]
var number = nextBits.binaryToDecimal()
var reminder = bytes[endNextBitsIndex...]
var subPackets = [Packet]()
while number > 0 {
let (p, rem) = parsePacket(bytes: reminder)
number -= isTotalLength ? (reminder.count - rem.count) : 1
subPackets.append(p)
reminder = rem
}
return (subPackets, reminder)
}
func parseLiteralPacketValue<S>(bytes: S) -> (Int, S.SubSequence) where S:StringProtocol {
var index = bytes.index(bytes.startIndex, offsetBy: 6)
var ei = index
var bits: Substring = ""
var reminder: S.SubSequence = ""
while true {
let si = bytes.index(index, offsetBy: 1)
ei = bytes.index(si, offsetBy: 4)
bits += bytes[si..<ei]
if bytes[index] == "0" {
reminder = bytes[ei...]
break
}
index = bytes.index(ei, offsetBy: 0)
}
return (bits.binaryToDecimal(), reminder)
}
}
extension StringProtocol {
func bits() -> [String] {
self.map { $0.bits }
}
func binaryToDecimal() -> Int { Int(self, radix: 2)! }
}
extension Character {
var bits: String {
switch self.hexDigitValue! {
case 0:
return "0000"
case 1:
return "0001"
case 2:
return "0010"
case 3:
return "0011"
case 4:
return "0100"
case 5:
return "0101"
case 6:
return "0110"
case 7:
return "0111"
case 8:
return "1000"
case 9:
return "1001"
case 10:
return "1010"
case 11:
return "1011"
case 12:
return "1100"
case 13:
return "1101"
case 14:
return "1110"
case 15:
return "1111"
default:
fatalError()
}
}
}

12
Sources/16/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 15.12.21.
//
import Foundation
import Runner
//Runner(target: Day16.self, day: "16", isTest: true).run()
Runner(target: Day16.self, day: "16", isTest: false).run()

95
Sources/17/17.swift Normal file
View File

@ -0,0 +1,95 @@
//
// File.swift
//
//
// Created by Max Nuding on 17.12.21.
//
import Foundation
import Runner
import Collections
struct Point:Hashable {
var x: Int
var y: Int
}
struct Area {
let topLeft: Point
let botRight: Point
init(x: String, y: String) {
let xVals = x[x.index(x.startIndex, offsetBy: 2)...].components(separatedBy: "..").map { Int($0)! }
let yVals = y[y.index(y.startIndex, offsetBy: 2)...].components(separatedBy: "..").map { Int($0)! }
topLeft = Point(x: xVals.first!, y: yVals.last!)
botRight = Point(x: xVals.last!, y: yVals.first!)
}
func contains(point: Point) -> Bool {
point.x >= topLeft.x && point.x <= botRight.x && point.y <= topLeft.y && point.y >= botRight.y
}
func overshot(point: Point) -> Bool {
point.y < botRight.y || point.x > botRight.x
}
}
struct Probe {
var position = Point(x: 0, y: 0)
var velocity: Point
mutating func move() {
position.x += velocity.x
position.y += velocity.y
if velocity.x < 0 {
velocity.x += 1
} else if velocity.x > 0 {
velocity.x -= 1
}
velocity.y -= 1
}
}
class Day17: Runnable {
let inputPath: String
required init(inputPath: String) {
self.inputPath = inputPath
}
public func run() {
let input = try! String(contentsOfFile: inputPath)
let parts = input
.trimmingCharacters(in: .newlines)
.components(separatedBy: ": ")
.last!
.components(separatedBy: ", ")
let area = Area(x: parts.first!, y: parts.last!)
var maxY = Int.min
var found = [Point]()
found.reserveCapacity(3000)
for x in 0...500 {
for y in -500...500 {
let velocity = Point(x: x, y: y)
var probe = Probe(velocity: velocity)
var maxYCurrent = Int.min
repeat {
probe.move()
if probe.position.y > maxYCurrent {
maxYCurrent = probe.position.y
}
if area.contains(point: probe.position) {
if maxYCurrent > maxY {
maxY = maxYCurrent
}
found.append(velocity)
break
}
} while !area.overshot(point: probe.position)
}
}
print(maxY)
print(Set(found).count)
}
}

12
Sources/17/main.swift Normal file
View File

@ -0,0 +1,12 @@
//
// File.swift
//
//
// Created by Max Nuding on 17.12.21.
//
import Foundation
import Runner
//Runner(target: Day17.self, day: "17", isTest: true).run()
Runner(target: Day17.self, day: "17", isTest: false).run()

View File

@ -0,0 +1,90 @@
([<([{{<<(<<{[<><>)}<([][])<<>{}>>>{[{(){}}(()[])]<{()()}<()()>>}>([<<{}<>>(<><>)><[{}[]](<>())>][
({{<<(<<<<{{[({}{})<[]()>]<([]{}){[]<>}>}{([{}[]]}}}>({(((()()))<{<>()}[<>()]>)[{(<>{})(()[])}[{[]
[{{[([<({[([<{[]}({}<>)>]{(([]())[()[]]){<[]<>>[<><>]}}>{<[(()<>){[]<>}][[<>{}]<()()>]>[[[<>[]][()
{(<<{([([<(<{(<>[])<()<>>}>){[[<<>()>[<>[]]]{[{}{}]{[]<>}}]{<{{}<>}{{}()}>{[()()]<[]<>>})}>[{({[{}
<{<<<<<{{{({<<[][]>[()[]]><<(){}>([]{})>}{{<[]{}><{}[]>}{<{}{}>({}<>)}}){([(()[]){[]()}][<[]()><[]{}>])
<{({{<{{{<(({(<>)({}[])}{<()>{(){}}})[[(<><>)[[]]]<[{}[]]{<>()}>])>{<<([{}()]{[][]})({{}{}}{()})><
<([[<<[{[{({{({}<>)[(){}]}{[{}<>]{[]{}}}}({[()()]<<><>>}(<{}[]><[]{}>)))}<({<<[]<>>({}[])>
[[{<{{[{<{<[{[()[]]<()()>}][<(<>[]){<>()}>[{<><>}(<>())]]><[{{{}<>}<{}{}>}{[{}[]][[][]]}]<[([]<>){[]{}}]<(
[({[<([[{<[{{(()[])<[]{}>}<[{}<>>{[][]}>}(<<[]{}>([]<>)>[([]){()[]}])]<[[[[]()][<>{}]]<(<>{})((
<{[[{{{[([([{[<>()]{[]{}}}<{[][]}[<>()]>](<<<><>>{()()}>))<<{{<><>}[{}()]}{(<><>)[<>{}]}>>])]{[<<[<([]
[[(<<<({[(((([<>()]([]{}))((<>){[]()})})[[<[[]<>]<{}<>>>[<()()>[()<>]]][[[<>{}]{[][]}]]])<<(({{}[
{{{[[<<{{[{<[[{}()]]>[{[<>[]]([][])}<{{}()}{{}[]}>]}([[{()}{(){}}]([<>{}]<{}<>>)][{{[]<>}}[{{}{}}[{
{[{[(<{{([{<<<[][]><()<>>>[{{}()}{[]<>}]>({<{}()>[()[]]}<<()[]>([][])>)}{[([[]{}][<><>]){{{}[]}<
{[({<{[<{{[(({()<>}({}[]))([()]{<>[]}))({{[]{}}<<>[]>>)]{((<()[]>{(){}})[{[]<>}])}}}<[[<<<(){}><()
[[[[[{{[{<<[<<{}<>>>{<()()><{}[]>}]>(<([()<>}<<>[]>)(((){})<()[]>)><({{}{}}<[]()>)<{{}<>}(
{{<<[<{(<[([(<{}<>>[[][]])[(()())]]{[([][])({}<>)]<(<>{}){[][]}>})([{(<>{})<()<>>}])]>(([[[(<>{})](<[]
<<([{<(<{({<{({}<>)<()()>}{<<>[]>[{}{}]}>(<((){})>(<[]()>[<><>]))}<<(([])[()])<([][])(()<>)>>>)([{([<>{}]([]<
{[[{{[[({{[([{<>[]}[{}[]]]){(<[]{}>[()()]){[<>{}][<>]>}]}{<{<<{}()>({}())>}{[[<>[]]{<>{}}]<[{}[]]{{}{}}>}
{<[[{({<{<[<(<(){}><<>{}>)>{[[(){}]]{({}())({}[])}}]{[{{(){}}}]}>}(<{{{([]{})[{}<>]}(<<>{}>)}(
<[[<(<([[({(<{<>()}([][])><(<>[])[<>{}]>)((<<>()>[[]()])<{()<>}<()()>>)}>[[({{{}<>}[[]<>]}
<{([{({[[({([[{}()]<()()>][<()[]>[[]<>]]}([<(){}>{<><>}][<{}<>><<>{}>])}[(([<>[]][<>[]])){
<{[<(<(<[[[{[{<>{}}]((())({}()))}][(([{}<>]{{}{}}))[{[[]()]((){})}<[<>[]]([][])>]]]][[((({
({[<<([[[<[[<(<>{}){{}[]}>[((){})[<><>]]][{{<>{}}{(){}}}(<[]{}}({}<>))]]{((<{}[]>({}<>))<<<>{}>[[]{}]>)[((
{[<<[([[([{<<[{}{}]({}[])><<{}<>)(<>[])>>[([()()]{<><>}){[[]{}]{(){}}}]}{<([<>]([]())){<(){}>{()<>}}><<{
[<[[[[({{([{{(<>[])<<><>>}<{[]{}}<<>>>}(<{[]{}}<<>()>>)][{(<<><>><()[]>){[{}()]>}<[{{}{}}{<>[]}]>]
{<{[<(([{{({[<<>[]><{}[]>]<{<>{}}{()()}>}([<{}{}>{[]<>}]{<{}<>><[]>}))<([([]<>){[]{}}]<{[]<>}
[<<(({<<[{[([[<>]<()[]>]{[[]<>]{()<>}}){{<<><>>{[]<>]}[({}<>){()<>}]}](<{{()[]}}({{}[]}<{}[
({(<{<{<([([[((){})<{}<>>]<[{}[]](<>{})>])])<<[{<<<>[]>>}<[(<><>){<>{}}][(()[])(<>{})]>]<(<{<>{}}
([<{<<[([({<<<()()>(())><[[]<>]{<>[]}>>([(()())]{[[]()]<{}<>>})})[<[[(()<>){<>{}}]][<(<><>){<>[]}>]><<([{}
([[<[[[({[<<[[{}()](()<>)]<{()[]}>>{<[{}<>]<()[]>><<[][]>>}>]<(<<[{}<>){<>}>{<[]()>[[][]]}>)>}({
(<[(<[([<{<{<[(){}][<>()]><(<>())(()<>)>}{{[{}>([]<>)}[<<>{}>(()())]}>[{([<><>]<()()>)}{([()]{()<
({{{{<[{{<{<<(()[])>{[(){}]{[]{}}}>}{{([<><>][<><>])<(()<>)[[][]]>}<<(()<>)><{<>()}>>}>}}][(<{(<[{<><>}[{}[
<{[{((([({{({<()()>(())}){([()<>]((){}))<(()<>)[(){}]>}}{[{([]())((){})}[{[]<>>{<>{}}]]<<<()[]><()<>>>((()()
{([({[(<[<([{[<>[]][()<>]}{[(){}]{{}<>}}][<<{}()>>[<<>()>[()}]])<((({}{})[[]<>]))<{[[]{}]([]<>)}>>><{
([[[{<[<([{(<<<>()>({}<>)><[<>{}]>)[[<<><>><()[]>](<()<>>(<>[]))]}([({()()}([]())){<[]{}>[[]<>]}][<
<<((<({{(<((<({}[])(<>())>{({}[])({}<>)}))<<<([]<>)[()[]]>{<()<>>[[]<>]}>>)({(<[<>{}]((){})><{()()}[{}(
{({([(({{<{{{<[]()>{{}[]})[[(){}](()<>)]}(([[]{}]{()<>}))}>{(<[{()()}]{[<>[]][()()]}>{{<()()
{[(<{<[<<[{<<<<>{}>>[[[]{}]<<>()>]>((<[]{}>{{}()}))}{({[{}()](()<>)}<<[][]>[{}<>]>)({[{}[]]}<<{}[]
{{{<{<{[[{([{{[]()}}({()[]}(<>))]<((<><>)({}{}))>)}]]{[({<(<{}[]>{<>{}})((()<>)([]()))>})[<[[{<>{}}<<><>>]<{<
[[<{<<[(<<<([<{}()>[{}()]](<{}[]>[{}()]))[([[]<>][{}{}])[<[]()><[]()>]]><[[[[]<>]({}{})][{[]}{<>[]}]][<[<>
(<<<<(<<[<[(({[]()}[[]<>]))({(())(()[])}[<<>[]>{()[]}])]{<({{}{}}(<>{}))><[[<>[]]<[]()>]>}>{({{(<>()){
<<(<[(<<<{({[<()>{()()}][([]{})([][])]}{({{}}{<>{}})<(())[{}()]>})}[[{<[[][]]{()}){[{}<>]<{}(
<<{<{{[<[(({({[][]}<<><>>)}<((<><>)[{}[]])<<[]<>>>>)[{{[()[]][[]<>]}{({}())<(){}>}}])({[([[]<>](<><>))<
<<{<[(<(<([[{{()()}{<>()}}(<<>()>({}[]))]<<{{}{}}{()<>}>(({})(()()))>])[[([(<>[])(<>)](<(){
({[((({[([<{[{<><>}[()[]]][{[][]}{(){}}]>>(<{{[]{}}<()[]>}<{()<>}<[]()>>>[{({}<>)<{}()>}])])]<(<{{{<[]()
<[{<<{<<{<(({[<><>]{{}<>}})){<[{<>[]}({}{})]([{}()]{<>()})>[<{<><>}<<>{}>}([<>[]]<[]()>)]}>(
(<<(({<<(<(({[<>[]]<[][]>}({<>()}[[]()])){((<>[])){([]{}){[][]}}}){{[[[]{}][{}[]]][<{}[]>([]<>)]}[(({
<(<(<<<[<{({([<>()])[[[][]]{<>[]}]}[<[()]<{}<>>><[(){}]<()()>>])((<(()[])<{}{})>)((([][]))))}>]<[<([[<<>()
{{<[<<<{((([[([]{})][[<>[]]]])(<[[(){}]<<>[]>]>{[({}())([]<>)][<<>{}><[]()>]}))){{<[[[[][]
{([<{[<<[{({({<>{}}[[][]])[{(){}}{{}()}]}[[[{}()]<()()>]])({<[{}{}]>({{}{}}[[]{}])}{{({}())<()()>}{{<><>}<[]
[<{[{<{{<{<[{{{}{}}[[]()]}([{}[]]<{}()>)](<{()()}{<>[]}><(<>[])>)>}{{{((()<>)[<><>])[[()()]
([{[<[({([<<<([][])<{}{}>>[[()<>](<>{})]>{{({}<>)}([<><>]<()<>>)}>](<(<<[]<>>({}[])>[<<>{}>[()()]])(<<()[]>((
(<[{<({<([<({<<>()><{}()>}(<[]{}>({}<>)))[([[]()][<><>>){[<>[]]{{}<>}}]>({[{[]{}}({}[])]<{[
<<[<(<({<(<({<()><[]()>})>{[{[[]()]<{}>}<(()<>)(<>())>)(((()())[<><>])([(){}]))})([(<{<>()}([]())>{[{}{
[{<{<{<[<((({[()[]]{{}}}[[<><>]<<>{}>])<({[][]}{()[]})<([]())([]{})>>))((<([{}<>]{(){}})>[
[[[[([<{[[(<{{{}[]}[<>()]}<{[]}{<><>}>><{({}<>){()<>}}[{[]{}}{<>[]}]>)[([({}<>}([]<>)]{{{}{}
<{{[[<{[(({({<{}>[(){}]}(<[]()>))}<<<[{}{}]>(<[]{}>(<>[]))>([{{}<>}(()())]<{<><>}{<>()}>)>)<[<<
{[{{{(<<([([((()[])[[]<>])({{}{}}({}<>))]<({{}[]}{[][]})<{[][]}>>){<<({})[[]<>]>(<[][]>(<>{}))>}]<[
<[<(<{<[([[[{[()[]][<>{}]}[{(){}}{<><>}]]{<([]{}){()<>}>[({}<>)<<>[]>]}][<[({}[]){()[]}][<<>{}><()<>>]>]]<(
([<{(([[<<{([([]{})([]())]<{(){}}{[]<>}>)([<<>{}>[()()]]{[[]{}]<[]<>>})}[({{()()}<<>{}>>){[<()
([({{{[[[([{<{<><>}{()()}>(<[]())[<>])}{([<><>]<(){}>){(<>())[{}()]}}]<{[[<><>]{{}[]}]([{}<>]{[]()
[[<<<{{({[{[({{}{}}<(){}>)<[[]{}]({}<>)>]}][(<{<<>{}>}{{[]{}}{()[]}}>[{[<>{}]<[][]>}<{<><>
[([{(([{(([{[{[]()}[{}]][[[]<>]{<>{}}]}{[<{}{}>({}[])][<<><>>(()<>)]}]{<({[]{}}{<>{}}}>}){
(<<<<<[{<{({({[]{}}({}())){([][])[{}{}]}}([{<><>}{{}{}}][[{}[]]({}{})]))[[[{{}()}[<>{}]][{{}<>}{()}]
(([{<(<[(<{{{[[]<>](<>[])}{[()<>]<()()>}}}>)<{{({<{}<>>[{}{}]}({<>[]}[()()]))}([([<>[]][[]{}])(<<><>
((<{[(([{{([<[<>()]<<>[]>>{((){})([])}][<{[]()}<<>()>>(<{}()>(<>))])}[{{{{[]()}}{(<>[])[()<
<[[{{[<<({[<<{(){}}{(){}}>>(<{[]<>}<<>()>>({()<>}{{}<>}))]{[([[][]][{}<>])][((<>{})(()[]))[<()[]>{<>()}]]}
{<{<<[{[([{{{{{}()}<()<>>}<[()[]]>}<[<[]<>><()<>>](({}())<{}>)>}<<({[]()}(()()))({{}<>}{{}<>
{{[<{[<{[[{{({[]<>}<{}[]>)((<>{})({}{}))}([[[]{}]<{}[]>]<({}()){()<>}>)}[<([{}<>}<<><>>)><{[()[]][<>[]]}{
([{{{[{(<<<[<{<>[]}{()[]}>(([]())<<>{}>)]>[[(<{}()><[]<>>)][{[[][]]<(){}>}<<()()>({}[])>)]>>)<<[[(<(<>())((
<({[{{(({(<<<{[]()}(<>{})>{(()<>)[[]<>]}><[[<>()]]{([]{})[[]()]}>>)})({[{<(<[]<>>{{}[]])[<<>{}>[(){}]]><(({}(
((<(([{([{<[{<[]()>(()[])}<({})[<>[]]>]>}]{[<<{[[]()]<<>()>)<<{}[]>{<><>}>>>[[([(){}](<>[]))]{{<
[([<<([(<[<<([[]{}]<(){}>)([()[]][{}{}])>([([]<>)<(){}>]([[][]]{[]<>}))>{{[{[]<>}[{}[]]]{([]
[<{<[[<{<({<[<()<>><[]<>>][<{}<>><<>()>]><{((){})(()())}>}{[([{}<>]({}{})){(<>{})}]([[<><>](<>)])})><{<{
[(<[[<({{<<([<(){}><<><>}]<<{}()>({}<>)>){[(<>())[(){}]]<<<><>>[{}<>]>}><{[{(){}}][<{}{}>[()(
<[<{[{{<([{<[{()<>}{()<>}]]{<[{}<>](<>{})>([{}<>]{{}()})}}<[([(){}](()[]))<{{}{}}>]{{{<>}<[
(<{[[{[[{[[(<[[][]][<>{}]>(<()<>>(<>{})))[{([]{}}<{}[]>}[[[]{}]{()()}]]]{<[<<>{}>(()<>)]<{{}<>}<[
(<<<[[(<{<({{(<>())<(){}>}<(()())<()[]>>}<[({}{})[()[]]]>)>}{<{[<[()<>][<>[]]>[([]{})(()())]][({{}{}}
({({[[[(<<[{<<<>[]][{}()]>(({}())([]()))}]{<{[()[]]({}())}>({<()[]><[]{}>}[{<>()}<[]{}>])}>>)]]]}[({[[{({(((
((([[<{[(<({<{<><>}[[]]>[{(){}}>}((<()<>>{()()})<<<>()>({}())>))((([<>()]{[][]})[[(){}]<{}
<[{([(<[({[[([{}()]({}{}))([<><>]({}()))](({(){}}{()[]}><[[]()]<<><>>>)](<([(){}][{}{}])[{
{<((({<((<[[<{()[]}<{}{}>>](<<[]>{<>}><[[]{}]({})>)]<<{[{}{}]}[{<>{}}}>>><(([<<>>(()())]<(
{[[[<<(<{(<(<[{}<>]<[]()>>[{{}{}}{()<>}])[<{{}()}{{}{}}><{[]<>}({}())>]>)<<(<<()<>><<><>>>)>>}[(
[<{<[([({([[[{{}()}{{}()}]([[]()])]])}<<<[<<<>{}>[<><>)><{[]<>}(()<>)>](({{}<>}[()<>]){{<>[]}((){})})>({(
([[{{[[[<(<({(()())<{}[]>}<({}<>){[][]}>)[<{()()}[[]<>]>]>)([[({<>[]}[()()])[{[]<>}[{}{}]]][[<
({[(<<<{((<{<[()()][[]<>]>{<{}<>><()()>}}<{[()[]]([]<>)}<<{}()><{}{}>>>>[<<{(){}}[()[]]>[([]<
([({{{<[{[{{[([]{})<[]{}>][<<>[]>[{}[]]]}}[{[<<><>>{[][]}]((<>()){<>{}})}]]]][[(<({[[]()][[]{}]
(((<{{<<<([[{(<><>)<{}>}<{{}{}}[{}<>]>]{[(()())[{}<>}]}]{<(<[]()>)>([<()[]>{{}()}]<({}()){(){}}>)})<[({(<>()
[{(([[<(<<(<{<[]()>(<>{})}[{()[]}[()()]]><[<[]()>[[]<>]]>)<{<[[]<>]<()<>>>{[()[]]<{}[]>}}>>([((<[][
{<{<{[([(<<[{<()<>>(<>[])}[(<><>)[[]<>]]]<<<[]<>><(){}>>{{{}<>}<<><>>}>>(<{{<>()}[()<>]}><[

View File

@ -0,0 +1,10 @@
[({(<(())[]>[[{[]{<()<>>
[(()[<>])]({[<{<<[]>>(
{([(<{}[<>[]}>{[]{[(<()>
(((({<>}<{<{<>}{[]{[]{}
[[<[([]))<([[{}[[()]]]
[{[{({}]{}}([{[{{{}}([]
{<[[]]>}<{[{[{[]{()[[[]
[<(<(<(<{}))><([]([]()
<{([([[(<>()){}]>(<<{{
<{([{{}}[<[[[<>{}]]]>[]]

View File

@ -0,0 +1,10 @@
5251578181
6158452313
1818578571
3844615143
6857251244
2375817613
8883514435
2321265735
2857275182
4821156644

View File

@ -0,0 +1,10 @@
5483143223
2745854711
5264556173
6141336146
6357385478
4167524645
2176841721
6882881134
4846848554
5283751526

View File

@ -0,0 +1,25 @@
start-kc
pd-NV
start-zw
UI-pd
HK-end
UI-kc
pd-ih
ih-end
start-UI
kc-zw
end-ks
MF-mq
HK-zw
LF-ks
HK-kc
ih-HK
kc-pd
ks-pd
MF-pd
UI-zw
ih-NV
ks-HK
MF-kc
zw-NV
NV-ks

View File

@ -0,0 +1,7 @@
start-A
start-b
A-c
A-b
b-d
A-end
b-end

View File

@ -0,0 +1,812 @@
726,774
246,695
579,249
691,724
246,820
738,887
1088,75
264,887
704,775
907,625
676,117
507,658
1009,24
547,735
157,126
599,113
445,226
363,691
918,794
927,113
999,400
443,305
654,729
408,767
1066,863
1148,473
321,35
1093,803
1044,718
202,889
262,164
378,541
619,662
1034,849
432,595
1145,656
1295,668
1125,705
1161,529
759,619
1170,147
688,742
328,729
718,439
935,701
246,647
594,110
845,495
160,189
1225,315
580,486
469,481
440,401
584,774
897,719
1007,516
547,159
112,117
982,645
62,439
192,441
631,211
654,16
113,698
378,865
373,19
441,777
390,7
1263,312
1121,610
509,582
893,352
44,131
1092,19
592,719
918,100
326,820
62,719
520,889
718,103
571,579
1165,267
1208,334
525,415
268,588
769,464
596,716
734,436
1283,747
35,457
982,94
1235,849
932,752
1265,243
262,752
99,704
547,732
1096,829
791,329
1222,320
199,568
671,494
1079,93
569,315
129,415
868,878
788,803
1175,889
965,676
904,660
552,560
619,484
507,236
566,768
1215,30
45,410
885,441
478,336
945,397
596,306
1145,686
189,495
1153,126
79,444
719,403
903,91
27,105
441,329
768,565
671,400
507,205
224,390
867,753
425,441
1123,67
833,14
793,278
1237,724
238,808
1099,32
411,243
1,574
726,120
862,441
212,94
80,199
1047,312
164,389
440,773
185,189
412,114
537,792
403,697
1208,768
408,527
1135,831
746,826
1064,110
15,226
102,574
1001,442
769,16
1236,408
440,121
1309,131
771,473
1064,527
189,284
427,704
276,865
986,593
1009,870
745,276
965,291
1190,5
1084,768
313,750
976,544
1222,658
223,619
718,791
976,574
705,822
785,863
388,390
1235,716
579,645
90,378
497,849
1308,145
658,301
648,94
1150,189
231,129
408,639
390,119
132,556
639,220
885,453
413,651
639,68
177,544
552,782
239,130
867,645
187,67
1163,494
1227,19
249,658
132,270
740,82
73,206
1166,525
262,506
1092,875
923,509
967,400
813,849
734,364
604,541
566,758
90,852
190,831
1047,65
313,144
542,157
720,304
129,863
1280,149
448,441
947,484
1048,506
408,863
657,803
480,834
201,369
489,208
1275,36
1064,784
781,845
1071,152
1251,61
455,500
564,68
758,798
922,390
443,421
505,792
60,784
1059,645
741,315
89,164
142,637
348,705
763,735
165,686
711,781
1220,852
455,120
1205,859
1208,413
1098,240
33,505
821,208
35,289
1251,833
1131,226
745,730
75,625
905,75
738,7
1223,316
923,395
7,884
1153,299
552,96
1047,134
642,266
537,698
1211,190
959,235
1235,625
711,614
510,798
73,306
47,582
657,875
468,75
638,346
144,525
612,665
917,57
1235,402
211,249
831,63
1197,250
493,686
887,801
85,315
263,65
924,306
140,595
997,141
657,173
579,850
489,686
448,5
572,7
1248,103
445,674
711,113
1232,884
1121,278
845,732
786,630
114,712
691,662
140,147
1088,299
408,191
897,691
92,662
904,754
1309,621
102,768
7,10
33,429
903,803
2,749
1083,704
157,819
325,91
830,386
763,284
175,63
902,199
887,129
1285,297
1287,683
590,304
714,716
6,686
1136,834
452,889
653,315
135,145
683,329
251,473
1110,455
959,516
1091,838
407,220
654,800
549,239
765,355
113,250
771,93
194,270
864,803
517,417
345,291
253,724
365,145
522,624
692,495
830,834
1021,301
825,595
145,890
1125,481
48,119
82,7
965,666
540,630
542,121
731,290
85,763
957,297
1277,617
1089,239
619,612
62,175
427,190
401,724
1133,798
475,882
1062,140
246,784
1001,515
244,31
759,171
1246,282
249,236
919,816
907,25
755,403
557,725
15,332
840,861
1031,760
965,218
813,45
440,829
885,457
45,243
351,435
191,565
984,820
715,275
689,641
289,845
575,892
605,822
1136,508
137,278
870,513
59,621
79,539
89,276
1,621
753,725
1119,301
1,763
1159,539
1059,25
267,843
1072,236
1203,607
425,453
62,551
788,624
576,884
326,430
345,452
539,473
1195,337
981,432
23,683
455,394
1098,654
1118,441
1277,429
567,625
773,698
23,459
441,464
870,488
567,269
517,399
935,302
436,875
309,442
900,191
1277,277
1310,165
383,781
149,792
492,578
88,658
736,500
103,275
731,44
720,794
1278,600
981,462
1020,623
329,462
333,483
977,880
1181,863
509,890
846,831
246,527
570,754
841,481
78,884
1231,355
618,47
413,719
850,786
174,386
364,175
1193,196
162,421
221,239
373,875
718,7
1231,539
1218,662
333,868
885,9
30,149
1299,511
227,190
1197,698
1150,705
657,238
783,717
1159,383
212,688
241,719
618,495
1232,458
985,432
27,75
918,506
328,800
145,582
387,395
90,516
1019,773
334,574
1285,149
716,558
413,236
353,477
607,193
845,844
874,875
1099,648
264,63
99,491
263,312
303,67
463,565
433,239
902,527
132,355
1300,550
606,119
291,849
25,86
301,865
1046,831
805,102
408,598
1101,693
1215,864
947,691
64,730
1237,170
970,628
1136,60
947,730
334,544
1149,686
1009,198
691,282
691,457
378,142
599,614
648,320
507,400
1178,803
478,558
267,51
279,701
965,452
691,232
401,170
219,838
1292,413
296,373
246,127
446,91
894,86
115,480
1287,155
433,655
263,134
87,630
965,403
107,623
189,610
330,749
1121,271
965,603
135,749
1059,473
328,165
27,147
443,134
1210,320
1211,470
415,824
835,882
405,819
957,870
493,721
1246,164
935,591
895,824
264,455
99,470
408,296
803,400
1084,126
1135,63
835,46
830,60
653,721
1104,453
525,863
102,334
1235,45
870,121
375,591
60,336
348,880
895,600
517,477
427,526
100,551
37,301
477,880
0,94
383,390
266,718
212,240
634,329
291,493
976,320
751,30
1119,593
443,753
1099,645
79,450
189,278
358,745
870,355
1064,820
353,597
770,630
157,75
22,371
214,493
465,726
1205,655
740,469
125,49
1019,849
735,556
1148,421
832,336
803,338
848,441
946,175
301,149
115,305
528,215
6,208
6,320
691,410
238,658
16,346
735,892
689,725
661,320
1136,386
1153,810
363,730
326,464
321,819
885,885
1048,388
425,9
127,809
656,16
599,280
74,408
387,509
73,724
293,877
557,687
656,878
1304,320
1034,865
704,119
126,663
141,656
914,859
1230,647
340,266
33,501
1262,352
505,344
1283,105
1198,289
855,500
574,871
540,598
465,844
1210,343
825,96
290,623
174,508
132,539
867,93
1101,201
392,142
472,126
552,320
631,739
867,473
763,758
467,67
251,269
1273,301
619,282
1148,130
801,4
566,136
1098,94
1274,47
333,411
401,82
48,352
1230,522
907,269
870,829
631,683
406,660
440,488
800,798
244,765
657,768
662,94
33,465
785,415
83,450
1159,355
653,686
392,730
417,352
691,829
902,598
947,282
242,469
135,301
174,834
816,189
914,894
671,562
460,786
1079,765
125,525
213,430
480,60
1086,390
1111,809
375,302
1227,390
1072,684
343,494
443,473
904,234
485,45
1285,86
977,299
758,782
242,425
460,718
37,593
730,486
559,877
505,102
401,812
231,254
403,269
493,238
1181,479
189,29
545,355
264,439
547,60
900,695
689,393
1079,254
408,199
846,383
1223,630
1121,284
345,666
441,117
237,800
191,525
1066,255
552,768
639,494
798,705
1004,189
1169,861
686,745
1121,29
554,126
1277,465
977,432
711,399
12,628
fold along x=655
fold along y=447
fold along x=327
fold along y=223
fold along x=163
fold along y=111
fold along x=81
fold along y=55
fold along x=40
fold along y=27
fold along y=13
fold along y=6

View File

@ -0,0 +1,21 @@
6,10
0,14
9,10
0,3
10,4
4,11
6,0
6,12
4,1
0,13
10,12
3,4
3,0
8,4
1,10
2,14
8,10
9,0
fold along y=7
fold along x=5

View File

@ -0,0 +1,102 @@
FNFPPNKPPHSOKFFHOFOC
VS -> B
SV -> C
PP -> N
NS -> N
BC -> N
PB -> F
BK -> P
NV -> V
KF -> C
KS -> C
PV -> N
NF -> S
PK -> F
SC -> F
KN -> K
PN -> K
OH -> F
PS -> P
FN -> O
OP -> B
FO -> C
HS -> F
VO -> C
OS -> B
PF -> V
SB -> V
KO -> O
SK -> N
KB -> F
KH -> C
CC -> B
CS -> C
OF -> C
FS -> B
FP -> H
VN -> O
NB -> N
BS -> H
PC -> H
OO -> F
BF -> O
HC -> P
BH -> S
NP -> P
FB -> C
CB -> H
BO -> C
NN -> V
SF -> N
FC -> F
KK -> C
CN -> N
BV -> F
FK -> C
CF -> F
VV -> B
VF -> S
CK -> C
OV -> P
NC -> N
SS -> F
NK -> V
HN -> O
ON -> P
FH -> O
OB -> H
SH -> H
NH -> V
FF -> B
HP -> B
PO -> P
HB -> H
CH -> N
SN -> P
HK -> P
FV -> H
SO -> O
VH -> V
BP -> V
CV -> P
KP -> K
VB -> N
HV -> K
SP -> N
HO -> P
CP -> H
VC -> N
CO -> S
BN -> H
NO -> B
HF -> O
VP -> K
KV -> H
KC -> F
HH -> C
BB -> K
VK -> P
OK -> C
OC -> C
PH -> H

View File

@ -0,0 +1,18 @@
NNCB
CH -> B
HH -> N
CB -> H
NH -> C
HB -> C
HC -> B
HN -> C
NN -> C
BH -> H
NC -> B
NB -> B
BN -> B
BB -> N
BC -> B
CC -> N
CN -> C

View File

@ -0,0 +1,100 @@
4644191171337732143712186124233573969322319997149343221542323211321212169142231235619969739483792471
2221293392911371411593639962951141752813313921357129613938931533621918583683134152965492646642538116
2795791297555313411382761825567331471819212315341825911232943151936415218119321513121916912261697597
1214537613992125712382233916937264885938549131332876391646112221213144242126287714516436119191917362
1412811515321221111439182464221331329974283623974241113548427128422112192118983384463232121843121141
3245255675412351991191259591561111991221265214221291175137165299373379821323142951719393624496355173
7821636439137114454815234184431131151885565811162122141111291739141236111319913333811111656913241523
1418191421242372241523343828141122624329116111754397113548982293191411111144261229944124833111847376
1415223811928588114168213319591148928517427169381184991691112118229218263638951854741122722159931213
1185112211216296846141231621592158511243111111346117648971911331811279689234291837116151264761299521
2157175132842918592376386235452686111324627214122733298544113111534712212591393262313832165437912113
1116112493319299432145649149992697711725421154424224312213396977142985512232427326338299642149836196
6549229499212395113283291496151231611431251843344129142294319947252811251219755391642553173113821296
4113393621316222283852914519968238256112711138455548538191592324236277743141198979959471862712168221
1741128134354414241419176117119212641541117881955126161946213118193312324857619874348283423325548598
3751141123712163925113282172764932353534116546231281293118591422522113149152261498874515989313554314
4514551971341761251629465312511329291978512148461991612957411327621224192111126296379215871233811481
3293217144136116298991343111524616863893234462111723531219141172273261192421911186619159615299151135
7774221151285219996117174373446146141833811666627831912921211686311331622326641123291596353856612959
1351122214751889195351764143332617127231529144667721221129811142151686112447161472232912114911498432
7225121617125257598871963211815844737221578124248727132498851251391513323133165922818784851344161916
1112187345141297179198141512813725433119213925696911577227241222816471151855194112221672612468122119
1121991355992132552111213132191442529433379222141737721118515814411171128371158391185211772681121151
3611317119849285611931216381814841117111553118123151123429121933733781431918246438319192543378241244
2216973154335197135211535821482816136121216777138722357726122631253431191217262219637112927427564151
5191998411823118893385217392312149124881216981988142455391121911741599925291712131939112984622594162
9512532169823462117945393432541745813525811441272984121112552932917817923383181475411441151349226821
3411874821911569271324123211326163841991128122341482721111115399651299314699266658849911711231323912
7694685861132348951471861817731787685615352753172139744392721512255361251492221911127122613845334296
1113697413329171211439739511931411924968888839312278319759419239814972811121854533399269742318264862
3261667141191721233392311941113633191795822122212119221174142635691755551245192319949176814814316991
2128111325114212336337636612529217112293426976253814989893331386522713418281571915911922457712133131
8388911376618344994992583184752685539238543959953246364821659122425889299729352751111921721511272199
2122155921932542114611151421752127825727141198197413114255419142717265333392684821477226612894862559
1951121655921881375819253119554413525181757211271911799915211551299921612352952113953924955851737855
8195214285611188396611335793711117151312316188149873422613973825989185924514991359346339783843843334
5456833919619253912174733996922156217884375932117373542943268995816113232121789731392898427391181116
4777217181611414812166144323146981138677578415811253842294432341423919922422381614691619319263292673
1871985126952132273312531611829113511331968253631512251863889446196571436982662319393312117814312223
4144118646856288731789179912621365532752715112255935546128459221171311137762973879129462196861223341
5331743126787154471212425952845476245991112234222998154272399175132112413123715171136641911131729182
6459321122282315131822523312117117212329381828311268157731316333126392285181951389374121861573611883
1129519121932136168211173395152156158311198521161721877242125629612171323591229332881655592295117452
4341822521595939622189164981116331219261274132118781411796193741169311918311822217877764111699911254
4194536129171715722286327511111124828745972271325116713569374751324429292311753151131516413241834449
2654142945631129956123367481172912142744199122191626922239395112592217148883514168932621184272178615
4157713294921232144519182476441189526311311114777342965936356951743225131121191824416924178512318511
6912411821531292292181267613662222516132574199134177394148798111514136319121566731314235317164439911
1437321155329217229142678137571111359263414123211224312882335825119927798139832929124119648129273158
1732391818138229589491914619358266961163398213919395213291514999415122435132113734813288381419819249
4113346921421917866111857654393412952122411689932611554121571489921198684193331141319469559362897418
3936181514241719511931294342174121311321234132821683441143221627121222912219121123417289754991212193
5231211979311961116116212251613682828181291627731949883315367221227411122625338116897436595199253162
2316316823133527186851941188913312213143341419114417621723676119643866413111512137248492799272283874
3119192116842719272523136623911313937534137524214481191735181477319325633146114939176412112636323417
2492714192521612141248169319193626151911919321234131296181642619511212191466114432116195132659299995
8479281136811514162331236428357598113492342253565417152872842112725149934866538744331141447117166111
8119623422439216225228196551954272643443171919589198617821835123212386869188415911424183945151334241
2441131613411116653297822116736662114797231228699315262527411234919279976921765231169112216112919848
3831541198992925558534136856443141276992238182251969817995131132423277612211112197312711991832328931
4857223123934311294131922752993114976915557976818181275728832322272499252323121313288171744324765443
6288391134124416473924343716745649381453218212143281127971317811511748813199842175114288225452114924
2198193117421166796123194192539312141215519112972453238891813111365441112114115347214113916577619519
4829218134763351139297321322168924116121484533211291255719399319238352153167888261311881156385931422
1128131518795612511811698671411951513233914459321461852952978173818789621743591166392521464181816178
1238497511773695513118432223193651911824333381942211111917892631655191328368558712842618374164192141
5197814252643194532182168116535512142118911412974122512425237539834313411221165712489961923581131921
5911812939579518465461451173198646171335111185511687173891229811734589488111952535421341871929712588
1671651526181764772599923144212312319733142231365158737371635371423522142829181192112264525227179493
7421112826829293192119831269314941212923232123538851869151292117144743917691154582417433994491521943
9191346716972561945245244324428371279373282126116111451618129133112293262414113689369614111711445421
2316166312199999129455391528271939493421961982164811491114318795721435615291362213311318321186121151
9931241122891924292311432346646113846761512131981437311511562199358147246719196723818191337753291332
1222114361952914555221222296169622784558836751121518966219244215831746229685414172141737963133114493
5218313115227314139655246183769219129243229111742851151185617522413973822128342227812919165581163524
9291132423113289278354324575153169229992171127124135461837121234526253159331631693469211222922141974
8452363325897641925169932431428139199613218111915136812112119111995795222511113131372723121212711118
2197227213274819481124191141229711865192112947469114147211523239645218213151193132942921122111792371
9275351123144952331922211614314212365538513531132558123126944517881183166133275219943389521111173193
1676123311913129662665831191951759436541912564748652528469419649571161712679147469912553225741913996
3191353128953131423711131716711282864474834951441111829112836519349724223297611712534725619191814221
4173761111187311916392959649155953281454675178259425336991997957211941375122951384157137917823346849
6231866821187632943121892433531142499383519821114756411214331534451221651412644522124791217848229112
4218513612717224329629361592483513734819131413112231512426831431594336223618413472242122315818213821
1672513521112672575721281934545322131861691451188212512246411624946313848511278356324319145934746199
7277435215413485681311177121429997231927125112162783124381311646223581365917794813269411132811948118
1171256993195581123322244392112531112921826117456633951228891118213977135113912128736772927396511155
7513423614827252911431224428129419471913857316347921811289615226221512981231328492565212872149824422
4172392667172923414112281271468455913321542234539111143311488844993986926526232111912899467919673129
2266423275271832192191927133161851111718244711617612592821169634215492721212529519332171925375214519
2961251383676393331912784833198316856114611437958511134729539811313332428111416135419161136827381511
2191313432414523594719493126599684313513119243281212311968932355513797175111911888954498999447129422
4116222439791495331225415853138639142821696183279788473226912132161296116634441352242287514831641639
2456122986411166492928291613291461786611191281413582887271831192125366139197116411714187313721143319
3137321286181773323297599141911589613214333724715721771326962716833251289731121417114311929432923141
4471591643429412532212412921891262226734323514259112982727616315933911299142522382749595219893774213
8361434437271446111531163739832741723991191369215895121472249713859411711382822931149329516384858813
7162151376995138977914242232912263921431263824116411237115179847816871745736216484215173821453691814
1221412352976445211311141195476196991326389881615412212286967548955857131279126264116711124668334891
6982434645865366398413542122219772368658463742631121963313814929811193197282524243293233246445611618

View File

@ -0,0 +1,10 @@
1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581

View File

@ -0,0 +1 @@
020D708041258C0B4C683E61F674A1401595CC3DE669AC4FB7BEFEE840182CDF033401296F44367F938371802D2CC9801A980021304609C431007239C2C860400F7C36B005E446A44662A2805925FF96CBCE0033C5736D13D9CFCDC001C89BF57505799C0D1802D2639801A900021105A3A43C1007A1EC368A72D86130057401782F25B9054B94B003013EDF34133218A00D4A6F1985624B331FE359C354F7EB64A8524027D4DEB785CA00D540010D8E9132270803F1CA1D416200FDAC01697DCEB43D9DC5F6B7239CCA7557200986C013912598FF0BE4DFCC012C0091E7EFFA6E44123CE74624FBA01001328C01C8FF06E0A9803D1FA3343E3007A1641684C600B47DE009024ED7DD9564ED7DD940C017A00AF26654F76B5C62C65295B1B4ED8C1804DD979E2B13A97029CFCB3F1F96F28CE43318560F8400E2CAA5D80270FA1C90099D3D41BE00DD00010B893132108002131662342D91AFCA6330001073EA2E0054BC098804B5C00CC667B79727FF646267FA9E3971C96E71E8C00D911A9C738EC401A6CBEA33BC09B8015697BB7CD746E4A9FD4BB5613004BC01598EEE96EF755149B9A049D80480230C0041E514A51467D226E692801F049F73287F7AC29CB453E4B1FDE1F624100203368B3670200C46E93D13CAD11A6673B63A42600C00021119E304271006A30C3B844200E45F8A306C8037C9CA6FF850B004A459672B5C4E66A80090CC4F31E1D80193E60068801EC056498012804C58011BEC0414A00EF46005880162006800A3460073007B620070801E801073002B2C0055CEE9BC801DC9F5B913587D2C90600E4D93CE1A4DB51007E7399B066802339EEC65F519CF7632FAB900A45398C4A45B401AB8803506A2E4300004262AC13866401434D984CA4490ACA81CC0FB008B93764F9A8AE4F7ABED6B293330D46B7969998021C9EEF67C97BAC122822017C1C9FA0745B930D9C480

View File

@ -0,0 +1 @@
38006F45291200

View File

@ -0,0 +1 @@
target area: x=128..160, y=-142..-88

View File

@ -0,0 +1 @@
target area: x=20..30, y=-10..-5