RosettaCodeData/Task/Iterated-digits-squaring/11l/iterated-digits-squaring.11l
2023-07-01 13:44:08 -04:00

51 lines
962 B
Text

F next_step(=x)
V result = 0
L x > 0
result += (x % 10) ^ 2
x I/= 10
R result
F check(number)
V candidate = 0
L(n) number
candidate = candidate * 10 + n
L candidate != 89 & candidate != 1
candidate = next_step(candidate)
I candidate == 89
V digits_count = [0] * 10
L(d) number
digits_count[d]++
V result = factorial(number.len)
L(c) digits_count
result I/= factorial(c)
R result
R 0
V limit = 100000000
V cache_size = Int(ceil(log10(limit)))
assert(10 ^ cache_size == limit)
V number = [0] * cache_size
V result = 0
V i = cache_size - 1
L
I i == 0 & number[i] == 9
L.break
I i == cache_size - 1 & number[i] < 9
number[i]++
result += check(number)
E I number[i] == 9
i--
E
number[i]++
L(j) i + 1 .< cache_size
number[j] = number[i]
i = cache_size - 1
result += check(number)
print(result)