今回のトリビアの検証!

●「123456789」は数字をどう並び替えても3で割り切れる 57へぇ
(数字の各位を全部足すと3の倍数になるから)

本当か??ということで、実際にやってみた。

早速プログラム書き。
試行錯誤しながら書いたのでインデントめちゃくちゃ、意味のない処理満載。

!/usr/local/bin/perl
#
#Ver.1.10
#
#funa@sra.co.jp
#
@num=(1,2,3,4,5,6,7,8,9);
$str ="100000";
$a = $str/3;
print"DEBUG:$str/3 = $a\n";
$cnt=1;
foreach $n1(@num){
foreach $n2(@num){
if($n1 eq $n2){next};
foreach $n3(@num){
if(($n2 eq $n3)or($n1 eq $n3)){next};
foreach $n4(@num){
if(($n3 eq $n4)or($n2 eq $n4)or($n1 eq $n4)){next};
foreach $n5(@num){
if(($n4 eq $n5)or($n1 eq $n5)or($n2 eq $n5)or($n3 eq $n5)){next};
foreach $n6(@num){
if(($n5 eq $n6)or($n1 eq $n6)or($n2 eq $n6)or($n3 eq $n6)or($n4 eq $n6)){next};
foreach $n7(@num){
if(($n6 eq $n7)or($n1 eq $n7)or($n2 eq $n7)or($n3 eq $n7)or($n4 eq $n7)
or($n5 eq $n7)){next};
foreach $n8(@num){
if(($n7 eq $n8)or($n1 eq $n8)or($n2 eq $n8)or($n3 eq $n8)or($n4 eq $n8)
or($n5 eq $n8)or($n6 eq $n8)){next};
foreach $n9(@num){
if(($n8 eq $n9)or($n1 eq $n9)or($n2 eq $n9)or($n3 eq $n9)or($n4 eq $n9)
or($n5 eq $n9)or($n6 eq $n9)or($n7 eq $n9)){next};
$ok=1;
foreach $c(@num){
$str="$n1$n2$n3$n4$n5$n6$n7$n8$n9";
$f=index($str,$c);
$r=rindex($str,$c);
if(($f eq -1)or($r eq -1)){$ok=0;}
if($f ne $r){$ok=0;}

}
if($ok){
$a = $str/3;
print"$cnt:$str/3 = $a\n";
$cnt++;
}
}
}
}
}
}
}
}
}
}
print"\n";
exit;

んで、実行結果

DEBUG:100000/3 = 33333.3333333333
1:123456789/3 = 41152263
2:123456798/3 = 41152266
3:123456879/3 = 41152293
4:123456897/3 = 41152299
5:123456978/3 = 41152326
6:123456987/3 = 41152329
7:123457689/3 = 41152563
(((中略)))
362872:987653241/3 = 329217747
362873:987653412/3 = 329217804
362874:987653421/3 = 329217807
362875:987654123/3 = 329218041
362876:987654132/3 = 329218044
362877:987654213/3 = 329218071
362878:987654231/3 = 329218077
362879:987654312/3 = 329218104
362880:987654321/3 = 329218107


DEBUG文で3で割ったときに余りが出れば小数点が出ることを確認してから
開始、大体3-4分かかって終わった。
if 文の嵐で汚いね。if 文で判定しているのにそのあと1-9が重なっていないかチェックしている
2重チェックだが、このチェックが有効に働いているか疑問だ。

たしかに、123456789の順番の並び替えても3で割れた。
36万2880通り全部試した(笑)

うーん、4へぇー。
結果ファイルはここ(長いよ!)