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、手元の環境、どちらも正しい動作を確認。