https://projecteuler.net/problem=28
角から次の角を求められればよいです。
import sys alias Point = Tuple[Int, Int] fn proceed(pt: Point, n: Int) -> Tuple[Point, Int]: var x = pt.get[0, Int]() var y = pt.get[1, Int]() if x >= 0 and y >= 0: return ((x+1, -y-1), n+x*2+2) elif x >= 0: return ((-x, y), n+x*2) elif y < 0: return ((x, -y), n-x*2) else: return ((-x, y), n-x*2) fn equals(pt1: Point, pt2: Point) -> Bool: var x1 = pt1.get[0, Int]() var y1 = pt1.get[1, Int]() var x2 = pt2.get[0, Int]() var y2 = pt2.get[1, Int]() return x1 == x2 and y1 == y2 fn f(N: Int) -> Int: var M = N // 2 var n = 1 var pt = (0, 0) var s = 1 while not equals(pt, (M, M)): var t = proceed(pt, n) pt = t.get[0, Point]() n = t.get[1, Int]() s += n return s fn main() raises: var args = sys.argv() var N = atol(args[1]) print(f(N))