let x = 3
let y = 3
protocol Printable{
var symbol: String { get }
}
class Object: Printable{
let symbol: String
let isSolid: Bool
init(symbol: String, isSolid: Bool){
self.symbol = symbol
self.isSolid = isSolid
}
static func Rock() -> Object{
return Object(symbol: "x", isSolid: true)
}
static func Space() -> Object{
return Object(symbol: " ", isSolid: false)
}
static private func object(from: Character) -> Object{
if from == "x" { return Rock() }
if from == " " { return Space() }
fatalError()
}
static func objects(from: String) -> [Object]{
var objects: [Object] = []
for char in from.characters{
objects.append(object(from: char))
}
return objects
}
}
class Player: Printable{
let symbol: String = "@"
let x, y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
class MapLine{
let objects: [Object]
init(input: String) {
objects = Object.objects(from: input)
}
func printLine(player: Player?){
var line: [Printable] = objects
if let player = player{
line[player.x] = player
}
let result = line.reduce("") { res, obj in res + obj.symbol }
print(result)
}
}
class Map{
let lines: [MapLine]
var player: Player!
init(input: String...) {
var ls: [MapLine] = []
for line in input{
ls.append(MapLine(input: line))
}
lines = ls
}
func printMap(){
for (y, line) in lines.enumerated(){
line.printLine(player: player.y == y ? player : nil)
}
}
private func objectAt(x: Int, y: Int) -> Object?{
if y < 0 || y >= lines.count { return nil }
let line = lines[y]
if x < 0 || x >= line.objects.count { return nil }
return line.objects[x]
}
private func printDirection(direction: String, dx: Int, dy: Int){
let nx = player.x + dx
let ny = player.y + dy
guard let object = objectAt(x: nx, y: ny), !object.isSolid else { return }
print("\(direction): \nlet x = \(nx)\nlet y = \(ny)")
}
func printOptions(){
printDirection(direction: "right", dx: 1, dy: 0)
printDirection(direction: "left", dx: -1, dy: 0)
printDirection(direction: "up", dx: 0, dy: -1)
printDirection(direction: "down", dx: 0, dy: 1)
}
}
let map = Map(input:
"xxxxxxxxxxxxxx",
"x xxx",
"xx xx xx xx",
"x x",
"xxxxxxxxxxxxxx"
)
map.player = Player(x: x, y: y)
map.printMap()
map.printOptions()
CmxldCB4ID0gMwpsZXQgeSA9IDMKCnByb3RvY29sIFByaW50YWJsZXsKICAgIHZhciBzeW1ib2w6IFN0cmluZyB7IGdldCB9Cn0KCmNsYXNzIE9iamVjdDogUHJpbnRhYmxlewogICAgbGV0IHN5bWJvbDogU3RyaW5nCiAgICBsZXQgaXNTb2xpZDogQm9vbAogICAgCiAgICBpbml0KHN5bWJvbDogU3RyaW5nLCBpc1NvbGlkOiBCb29sKXsKICAgICAgICBzZWxmLnN5bWJvbCA9IHN5bWJvbAogICAgICAgIHNlbGYuaXNTb2xpZCA9IGlzU29saWQKICAgIH0KICAgIAogICAgc3RhdGljIGZ1bmMgUm9jaygpIC0+IE9iamVjdHsKICAgICAgICByZXR1cm4gT2JqZWN0KHN5bWJvbDogIngiLCBpc1NvbGlkOiB0cnVlKQogICAgfQogICAgCiAgICBzdGF0aWMgZnVuYyBTcGFjZSgpIC0+IE9iamVjdHsKICAgICAgICByZXR1cm4gT2JqZWN0KHN5bWJvbDogIiAiLCBpc1NvbGlkOiBmYWxzZSkKICAgIH0KICAgIAogICAgc3RhdGljIHByaXZhdGUgZnVuYyBvYmplY3QoZnJvbTogQ2hhcmFjdGVyKSAtPiBPYmplY3R7CiAgICAgICAgaWYgZnJvbSA9PSAieCIgeyByZXR1cm4gUm9jaygpIH0KICAgICAgICBpZiBmcm9tID09ICIgIiB7IHJldHVybiBTcGFjZSgpIH0KICAgICAgICBmYXRhbEVycm9yKCkKICAgIH0KICAgIAogICAgc3RhdGljIGZ1bmMgb2JqZWN0cyhmcm9tOiBTdHJpbmcpIC0+IFtPYmplY3RdewogICAgICAgIHZhciBvYmplY3RzOiBbT2JqZWN0XSA9IFtdCiAgICAgICAgZm9yIGNoYXIgaW4gZnJvbS5jaGFyYWN0ZXJzewogICAgICAgICAgICBvYmplY3RzLmFwcGVuZChvYmplY3QoZnJvbTogY2hhcikpCiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3RzCiAgICB9Cn0KCmNsYXNzIFBsYXllcjogUHJpbnRhYmxlewogICAgbGV0IHN5bWJvbDogU3RyaW5nID0gIkAiCiAgICAKICAgIGxldCB4LCB5OiBJbnQKICAgIAogICAgaW5pdCh4OiBJbnQsIHk6IEludCkgewogICAgICAgIHNlbGYueCA9IHgKICAgICAgICBzZWxmLnkgPSB5CiAgICB9Cn0KCmNsYXNzIE1hcExpbmV7CiAgICBsZXQgb2JqZWN0czogW09iamVjdF0KICAgIAogICAgaW5pdChpbnB1dDogU3RyaW5nKSB7CiAgICAgICAgb2JqZWN0cyA9IE9iamVjdC5vYmplY3RzKGZyb206IGlucHV0KQogICAgfQogICAgCiAgICBmdW5jIHByaW50TGluZShwbGF5ZXI6IFBsYXllcj8pewogICAgICAgIHZhciBsaW5lOiBbUHJpbnRhYmxlXSA9IG9iamVjdHMKICAgICAgICBpZiBsZXQgcGxheWVyID0gcGxheWVyewogICAgICAgICAgICBsaW5lW3BsYXllci54XSA9IHBsYXllcgogICAgICAgIH0KICAgICAgICBsZXQgcmVzdWx0ID0gbGluZS5yZWR1Y2UoIiIpIHsgcmVzLCBvYmogaW4gcmVzICsgb2JqLnN5bWJvbCB9CiAgICAgICAgcHJpbnQocmVzdWx0KQogICAgfQp9CgpjbGFzcyBNYXB7CiAgICBsZXQgbGluZXM6IFtNYXBMaW5lXQogICAgdmFyIHBsYXllcjogUGxheWVyIQogICAgCiAgICBpbml0KGlucHV0OiBTdHJpbmcuLi4pIHsKICAgICAgICB2YXIgbHM6IFtNYXBMaW5lXSA9IFtdCiAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXR7CiAgICAgICAgICAgIGxzLmFwcGVuZChNYXBMaW5lKGlucHV0OiBsaW5lKSkKICAgICAgICB9CiAgICAgICAgbGluZXMgPSBscwogICAgfQogICAgCiAgICBmdW5jIHByaW50TWFwKCl7CiAgICAgICAgZm9yICh5LCBsaW5lKSBpbiBsaW5lcy5lbnVtZXJhdGVkKCl7CiAgICAgICAgICAgIGxpbmUucHJpbnRMaW5lKHBsYXllcjogcGxheWVyLnkgPT0geSA/IHBsYXllciA6IG5pbCkKICAgICAgICB9CiAgICB9CiAgICAKICAgIHByaXZhdGUgZnVuYyBvYmplY3RBdCh4OiBJbnQsIHk6IEludCkgLT4gT2JqZWN0P3sKICAgICAgICBpZiB5IDwgMCB8fCB5ID49IGxpbmVzLmNvdW50IHsgcmV0dXJuIG5pbCB9CiAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1t5XQogICAgICAgIGlmIHggPCAwIHx8IHggPj0gbGluZS5vYmplY3RzLmNvdW50IHsgcmV0dXJuIG5pbCB9CiAgICAgICAgcmV0dXJuIGxpbmUub2JqZWN0c1t4XQogICAgfQogICAgCiAgICBwcml2YXRlIGZ1bmMgcHJpbnREaXJlY3Rpb24oZGlyZWN0aW9uOiBTdHJpbmcsIGR4OiBJbnQsIGR5OiBJbnQpewogICAgICAgIGxldCBueCA9IHBsYXllci54ICsgZHgKICAgICAgICBsZXQgbnkgPSBwbGF5ZXIueSArIGR5CiAgICAgICAgZ3VhcmQgbGV0IG9iamVjdCA9IG9iamVjdEF0KHg6IG54LCB5OiBueSksICFvYmplY3QuaXNTb2xpZCBlbHNlIHsgcmV0dXJuIH0KICAgICAgICBwcmludCgiXChkaXJlY3Rpb24pOiBcbmxldCB4ID0gXChueClcbmxldCB5ID0gXChueSkiKQogICAgfQogICAgCiAgICBmdW5jIHByaW50T3B0aW9ucygpewogICAgICAgIHByaW50RGlyZWN0aW9uKGRpcmVjdGlvbjogInJpZ2h0IiwgZHg6IDEsIGR5OiAwKQogICAgICAgIHByaW50RGlyZWN0aW9uKGRpcmVjdGlvbjogImxlZnQiLCBkeDogLTEsIGR5OiAwKQogICAgICAgIHByaW50RGlyZWN0aW9uKGRpcmVjdGlvbjogInVwIiwgZHg6IDAsIGR5OiAtMSkKICAgICAgICBwcmludERpcmVjdGlvbihkaXJlY3Rpb246ICJkb3duIiwgZHg6IDAsIGR5OiAxKQogICAgfQp9CgpsZXQgbWFwID0gTWFwKGlucHV0OgogICAgInh4eHh4eHh4eHh4eHh4IiwKICAgICJ4ICAgICAgICAgIHh4eCIsCiAgICAieHggeHggICB4eCAgeHgiLAogICAgInggICAgICAgICAgICB4IiwKICAgICJ4eHh4eHh4eHh4eHh4eCIKKQptYXAucGxheWVyID0gUGxheWVyKHg6IHgsIHk6IHkpCm1hcC5wcmludE1hcCgpCm1hcC5wcmludE9wdGlvbnMoKQoKCgo=