For quest 2, I decided to implement my own Complex type and operators, because I expected parts 2 and 3 to have something unconventional, but alas it's just a regular Mandelbrot fractal.
Nim again, Nim forever:
type Complex = tuple[x,y: int]
proc `$`(c: Complex): string = &"[{c.x},{c.y}]"
proc `+`(a,b: Complex): Complex = (a.x+b.x, a.y+b.y)
proc `-`(a,b: Complex): Complex = (a.x-b.x, a.y-b.y)
proc `*`(a,b: Complex): Complex = (a.x*b.x - a.y*b.y, a.x*b.y + a.y*b.x)
proc `/`(a,b: Complex): Complex = (a.x div b.x, a.y div b.y)
proc `/`(a: Complex, b: int): Complex = (a.x div b, a.y div b)
proc parseInput(input: string): Complex =
let parts = input.split({'=','[',',',']'})
(parseInt(parts[2]), parseInt(parts[3]))
proc isStable(point: Complex, iter: int): bool =
var num: Complex
for _ in 1..iter:
num = (num * num) / 100_000 + point
if num.x notin -1_000_000 .. 1_000_000 or
num.y notin -1_000_000 .. 1_000_000:
return false
true
proc solve_part1*(input: string): Solution =
let start = parseInput(input)
var point: Complex
for _ in 1..3:
point = (point * point) / 10 + start
result := $point
proc solve_part2*(input: string): Solution =
let start = parseInput(input)
for y in 0..100:
for x in 0..100:
let point: Complex = (start.x + 10 * x, start.y + 10 * y)
if point.isStable(iter=100): inc result.intVal
proc solve_part3*(input: string): Solution =
let start = parseInput(input)
for y in 0..1000:
for x in 0..1000:
let point: Complex = (start.x + x, start.y + y)
if point.isStable(iter=100): inc result.intVal
Full solution at Codeberg: solution.nim