40 lines
743 B
Nim
40 lines
743 B
Nim
type Iterator = iterator(): int
|
|
|
|
proc `^`*(base: Natural; exp: Natural): int =
|
|
var (base, exp) = (base, exp)
|
|
result = 1
|
|
while exp != 0:
|
|
if (exp and 1) != 0:
|
|
result *= base
|
|
exp = exp shr 1
|
|
base *= base
|
|
|
|
proc next(s: Iterator): int =
|
|
for n in s(): return n
|
|
|
|
proc powers(m: Natural): Iterator =
|
|
iterator it(): int {.closure.} =
|
|
for n in 0 ..< int.high:
|
|
yield n ^ m
|
|
result = it
|
|
|
|
iterator filtered(s1, s2: Iterator): int =
|
|
var v = next(s1)
|
|
var f = next(s2)
|
|
while true:
|
|
if v > f:
|
|
f = next(s2)
|
|
continue
|
|
elif v < f:
|
|
yield v
|
|
v = next(s1)
|
|
|
|
var
|
|
squares = powers(2)
|
|
cubes = powers(3)
|
|
i = 1
|
|
for x in filtered(squares, cubes):
|
|
if i > 20: echo x
|
|
if i >= 30: break
|
|
inc i
|