ichirin2501's diary

いっちりーん。

Happy Number

anarchy golfを開いたらHappy Numberが題材になってたのでやってみた。
Happy Numberでぐぐると、海外のWikiが凄く充実してるのに対し…日本語のWikiが存在せず。

happy number

anarchy golf - happy number
1から2000までのHappyNumber数を出力する。
NappyNumber数とは、正整数nの各々の桁を2乗して足す〜を繰り返して1になる正整数のことです。
7^2 = 49
4^2 + 9^2 = 97
9^2 + 7^2 = 130
1^2 + 3^2 + 0^2 = 10
1^2 + 0^2 = 1
7 is happy number.
当然、49、97、130、10もHappyNumber数になります。


適当に書いて100byteになった。

// 100byte
i,j;
main(k)
{
	for(;i++<2e3;j-1&&j-7?:printf("%d\n",i))
		for(j=i;j>9;j=k)
			for(k=0;j;j/=10)
				k+=pow(j%10,2);
}

上記のコードを少し変更したら95byteになった。
その変更した処理を含めて再帰で書いたら長くなってしまった。

// 104byte
t;
H(n,b){
	t=n%10;
	return n?H(n/10,b+t*t):b<5?~-b:H(b,0);
}
main(i)
{
	for(;i<2e3;i++)H(i,0)||printf("%d\n",i);
}


追記:
id:incrementさんがReverse Sequenceをさらに短くしたのを参考に上記の再帰コードを書き直してみました。

// 99byte
t;
H(n,b){
	t=n%10;
	t=n?H(n/10,b+t*t):b<5?~-b:H(b,0);
}
main(i)
{
	for(;i<2e3;i++)H(i,0)||printf("%d\n",i);
}

return文の削除。
anarchy golf、手元の環境、どちらも正しい動作を確認。