各桁の和の整数乗がその数自身となる4桁の整数解を求めるawk編
こういうツイートがあったので、まずawkで。
https://twitter.com/i/web/status/797584909359464448
【各桁の和の整数乗がその数自身となる4桁の整数解を求める最短コード】
— がたろう TTLでCPUを作る爺 (@duo6750) 2016年11月12日
まだまだ若いモンには負けん! ペリルで72文字 \^o^/
for(1..14){$i=$_;for(1e3..9999){print"$_ "if(-192+unpack"%W*")**$i==$_}} https://t.co/wTcgnAmrgs
各桁分それぞれをループ、4桁の整数pと各桁の和sを求める。繰り返しsで割って行って割り切れなければハズレ、最後まで割り切れたらアタリ。和sが1の場合はなんでも割り切れてしまうため除外。
BEGIN{ for(a=1;a<=9;a++) { for(b=0;b<=9;b++) { for(c=0;c<=9;c++) { for(d=0;d<=9;d++) { s=a+b+c+d; if (s==1) continue; p=a b c d; p=p+0; t=p; while((t%s)==0) { t=t/s; if (t==s) { print p,s continue; } } } } } } }
別解。和sが1になるパターンを避けるために1001から9999までループ。各桁を文字列に分解してから和sを求める。
BEGIN{ for(i=1001;i<=9999;i++) { s=substr(i,1,1) + substr(i,2,1) + substr(i,3,1) + substr(i,4,1) t=i while(t%s==0) { t=t/s if (t==s) { print i continue } } } }