/*
Happy numbers in Picat.
From Rosetta code:
http://rosettacode.org/wiki/Happy_numbers#SETL
"""
From Wikipedia, the free encyclopedia:
A happy number is defined by the following process. Starting
with any positive integer, replace the number by the sum of
the squares of its digits, and repeat the process until the
number equals 1 (where it will stay), or it loops endlessly
in a cycle which does not include 1. Those numbers for which
this process ends in 1 are happy numbers, while those that do
not end in 1 are unhappy numbers. Display an example of
your output here.
Task: Find and print the first 8 happy numbers.
"""
Model created by Hakan Kjellerstrand, hakank@gmail.com
See also my Picat page: http://www.hakank.org/picat/
*/
main => go.
go =>
writeln([H : H in 1..40, happy(H)]),
writeln(happy_len(8)),
nl.
happy(N) =>
S = [N],
Happy = 1,
while (Happy == 1, N > 1)
N := sum([to_integer(I)**2 : I in N.to_string()]),
if member(N,S) then
Happy := 0
else
S := S ++ [N]
end
end,
Happy == 1.
happy_len(Limit) = S =>
S = [],
N = 1,
while (S.length < Limit)
if happy(N) then
S := S ++ [N]
end,
N := N + 1
end.