usestrict;sub _p{return$_[0][0]*$_[0][1];}sub _s{return$_[0][0]+$_[0][1];}sub _c{return($a->[0]<=>$b->[0])||($a->[1]<=>$b->[1]);}sub solve{my($ceil)=@_;my@pairs;# 組み合わせのリスト。my%pdup;# 積の重複度。my%sdup;# 和の重複度。# 初期状態。全ての組み合わせと、積・和の重複度を求める。{for(my$i=1;$i<=$ceil;$i++){for(my$j=$i;$j<=$ceil;$j++){my$e=[$i,$j];push(@pairs,$e);$pdup{&_p($e)}=[]if(!$pdup{&_p($e)});$sdup{&_s($e)}=[]if(!$sdup{&_s($e)});$pdup{&_p($e)}[$#{$pdup{&_p($e)}}+1]=$e;$sdup{&_s($e)}[$#{$sdup{&_s($e)}}+1]=$e;}}}# (1) A さんも B さんも教えられた数字(積と和)から判定出来ない。{my@tmp;foreachmy$e(@pairs){nextif(@{$pdup{&_p($e)}}==1);nextif(@{$sdup{&_s($e)}}==1);push(@tmp,$e);}@pairs=@tmp;}# (2) B さんは A が判定不能だと云う事を判っていた。# つまり和を分解して得られる組み合わせの全てに於いて、# その積の取り得る組み合わせが複数在ると云う事。{my@tmp;foreachmy$e(@pairs){my$is_exclude=0;foreachmy$f(@{$sdup{&_s($e)}}){if(@{$pdup{&_p($f)}}==1){$is_exclude=1;last;}}push(@tmp,$e)if(!$is_exclude);}@pairs=@tmp;}# (3) それを聞いた A さんは判ったのであるから、# 残りの組み合わせに積の重複は無い筈。{my@tmp;my%dup;foreachmy$e(@pairs){$dup{&_p($e)}=0if(!$dup{&_p($e)});$dup{&_p($e)}++;}foreachmy$e(@pairs){push(@tmp,$e)if($dup{&_p($e)}==1);}@pairs=@tmp;}# (4) A さんが判ったと聞いた B さんも判つたので、# 残りの組み合わせに和の重複は無い筈。{my@tmp;my%dup;foreachmy$e(@pairs){$dup{&_s($e)}=0if(!$dup{&_s($e)});$dup{&_s($e)}++;}foreachmy$e(@pairs){push(@tmp,$e)if($dup{&_s($e)}==1);}@pairs=@tmp;;}return@pairs;}foreachmy$n(1..100){printf("%4d: ",$n);my@pairs=&solve($n);if(!@pairs){printf("None");}else{foreachmy$e(sort_c@pairs){printf("[%2d, %2d], ",@{$e});}}print("\n");}
ぴょん #3629() [ Perl ] Rating0/0=0.00
Rating0/0=0.00-0+