Skip to content

Instantly share code, notes, and snippets.

@z3bi
Created December 21, 2022 01:34
Show Gist options
  • Save z3bi/5246e6df7670066b346a9be640b41a05 to your computer and use it in GitHub Desktop.
Save z3bi/5246e6df7670066b346a9be640b41a05 to your computer and use it in GitHub Desktop.
import UIKit
var input =
"""
2,2,2
1,2,2
3,2,2
2,1,2
2,3,2
2,2,1
2,2,3
2,2,4
2,2,6
1,2,5
3,2,5
2,1,5
2,3,5
"""
let lines = input.split(whereSeparator: \.isNewline)
struct Cube: Equatable, Hashable {
let x: Int
let y: Int
let z: Int
var coordTopEdge: Coordinate {
Coordinate(p1: x, p2: z)
}
var coordLeftEdge: Coordinate {
Coordinate(p1: y, p2: z)
}
var coordFrontEdge: Coordinate {
Coordinate(p1: x, p2: y)
}
}
struct Coordinate: Equatable, Hashable {
let p1: Int
let p2: Int
}
var cubes: Set<Cube> = []
var topEdges: [Coordinate: Int] = [:]
var bottomEdges: [Coordinate: Int] = [:]
var leftEdges: [Coordinate: Int] = [:]
var rightEdges: [Coordinate: Int] = [:]
var frontEdges: [Coordinate: Int] = [:]
var backEdges: [Coordinate: Int] = [:]
for line in lines {
let coords = line.split(separator: ",")
let cube = Cube(x: Int(String(coords[0]))!, y: Int(String(coords[1]))!, z: Int(String(coords[2]))!)
cubes.insert(cube)
if topEdges[cube.coordTopEdge] == nil {
topEdges[cube.coordTopEdge] = cube.y
} else {
topEdges[cube.coordTopEdge] = max(cube.y, topEdges[cube.coordTopEdge]!)
}
if bottomEdges[cube.coordTopEdge] == nil {
bottomEdges[cube.coordTopEdge] = cube.y
} else {
bottomEdges[cube.coordTopEdge] = min(cube.y, bottomEdges[cube.coordTopEdge]!)
}
if leftEdges[cube.coordLeftEdge] == nil {
leftEdges[cube.coordLeftEdge] = cube.x
} else {
leftEdges[cube.coordLeftEdge] = min(cube.x, leftEdges[cube.coordLeftEdge]!)
}
if rightEdges[cube.coordLeftEdge] == nil {
rightEdges[cube.coordLeftEdge] = cube.x
} else {
rightEdges[cube.coordLeftEdge] = max(cube.x, rightEdges[cube.coordLeftEdge]!)
}
if frontEdges[cube.coordFrontEdge] == nil {
frontEdges[cube.coordFrontEdge] = cube.z
} else {
frontEdges[cube.coordFrontEdge] = min(cube.z, frontEdges[cube.coordFrontEdge]!)
}
if backEdges[cube.coordFrontEdge] == nil {
backEdges[cube.coordFrontEdge] = cube.z
} else {
backEdges[cube.coordFrontEdge] = max(cube.z, backEdges[cube.coordFrontEdge]!)
}
}
var surfaceArea = 0
for cube in cubes {
let top = Cube(x: cube.x, y: cube.y + 1, z: cube.z)
let bottom = Cube(x: cube.x, y: cube.y - 1, z: cube.z)
let left = Cube(x: cube.x - 1, y: cube.y, z: cube.z)
let right = Cube(x: cube.x + 1, y: cube.y, z: cube.z)
let front = Cube(x: cube.x, y: cube.y, z: cube.z + 1)
let back = Cube(x: cube.x, y: cube.y, z: cube.z - 1)
let check: Set<Cube> = [top, bottom, left, right, front, back]
let intersect = cubes.intersection(check)
surfaceArea += (6 - intersect.count)
}
print(surfaceArea)
print(topEdges.count + bottomEdges.count + leftEdges.count + rightEdges.count + frontEdges.count + backEdges.count)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment