diff --git a/lcci/16.22.Langtons Ant/README.md b/lcci/16.22.Langtons Ant/README.md index 17d70e3e552fc..e66c8e52c7af1 100644 --- a/lcci/16.22.Langtons Ant/README.md +++ b/lcci/16.22.Langtons Ant/README.md @@ -206,6 +206,50 @@ func printKMoves(K int) []string { } ``` +```swift +class Solution { + func printKMoves(_ K: Int) -> [String] { + var x1 = 0, y1 = 0, x2 = 0, y2 = 0 + let dirs = [0, 1, 0, -1, 0] + let d = "RDLU" + var x = 0, y = 0, p = 0 + var black = Set<[Int]>() + var K = K + + while K > 0 { + let t = [x, y] + if black.insert(t).inserted { + p = (p + 1) % 4 + } else { + black.remove(t) + p = (p + 3) % 4 + } + x += dirs[p] + y += dirs[p + 1] + x1 = min(x1, x) + y1 = min(y1, y) + x2 = max(x2, x) + y2 = max(y2, y) + K -= 1 + } + + let m = x2 - x1 + 1 + let n = y2 - y1 + 1 + var g = Array(repeating: Array(repeating: "_", count: n), count: m) + + for t in black { + let i = t[0] - x1 + let j = t[1] - y1 + g[i][j] = "X" + } + + g[x - x1][y - y1] = String(d[d.index(d.startIndex, offsetBy: p)]) + + return g.map { $0.joined() } + } +} +``` + diff --git a/lcci/16.22.Langtons Ant/README_EN.md b/lcci/16.22.Langtons Ant/README_EN.md index 28448219478b4..fb1623540676b 100644 --- a/lcci/16.22.Langtons Ant/README_EN.md +++ b/lcci/16.22.Langtons Ant/README_EN.md @@ -226,6 +226,50 @@ func printKMoves(K int) []string { } ``` +```swift +class Solution { + func printKMoves(_ K: Int) -> [String] { + var x1 = 0, y1 = 0, x2 = 0, y2 = 0 + let dirs = [0, 1, 0, -1, 0] + let d = "RDLU" + var x = 0, y = 0, p = 0 + var black = Set<[Int]>() + var K = K + + while K > 0 { + let t = [x, y] + if black.insert(t).inserted { + p = (p + 1) % 4 + } else { + black.remove(t) + p = (p + 3) % 4 + } + x += dirs[p] + y += dirs[p + 1] + x1 = min(x1, x) + y1 = min(y1, y) + x2 = max(x2, x) + y2 = max(y2, y) + K -= 1 + } + + let m = x2 - x1 + 1 + let n = y2 - y1 + 1 + var g = Array(repeating: Array(repeating: "_", count: n), count: m) + + for t in black { + let i = t[0] - x1 + let j = t[1] - y1 + g[i][j] = "X" + } + + g[x - x1][y - y1] = String(d[d.index(d.startIndex, offsetBy: p)]) + + return g.map { $0.joined() } + } +} +``` + diff --git a/lcci/16.22.Langtons Ant/Solution.swift b/lcci/16.22.Langtons Ant/Solution.swift new file mode 100644 index 0000000000000..bab48138ff747 --- /dev/null +++ b/lcci/16.22.Langtons Ant/Solution.swift @@ -0,0 +1,41 @@ +class Solution { + func printKMoves(_ K: Int) -> [String] { + var x1 = 0, y1 = 0, x2 = 0, y2 = 0 + let dirs = [0, 1, 0, -1, 0] + let d = "RDLU" + var x = 0, y = 0, p = 0 + var black = Set<[Int]>() + var K = K + + while K > 0 { + let t = [x, y] + if black.insert(t).inserted { + p = (p + 1) % 4 + } else { + black.remove(t) + p = (p + 3) % 4 + } + x += dirs[p] + y += dirs[p + 1] + x1 = min(x1, x) + y1 = min(y1, y) + x2 = max(x2, x) + y2 = max(y2, y) + K -= 1 + } + + let m = x2 - x1 + 1 + let n = y2 - y1 + 1 + var g = Array(repeating: Array(repeating: "_", count: n), count: m) + + for t in black { + let i = t[0] - x1 + let j = t[1] - y1 + g[i][j] = "X" + } + + g[x - x1][y - y1] = String(d[d.index(d.startIndex, offsetBy: p)]) + + return g.map { $0.joined() } + } +} \ No newline at end of file