ちょっと前の問題ですか、日能研の倍数パズルの問題をPythonで解いてみました。(^_^;
1から6までの数字が書かれた6枚のカード[1][2][3][4][5][6]を並べかえて6桁の整数をつくります。つくった6桁の整数の上から2桁が2の倍数、上から3桁が3の倍数、上から4桁が4の倍数、上から5桁が5の倍数、上から6桁が6の倍数になるものをすべて答えなさい。
(2018年 聖光学院中学校入試問題より)
思い付きでざっと作ったのが、MultiplePuz1.pyで、条件のとこをfor文でまとめられそうだったので、ちょっと変形してみたのが、MultiplePuz2.pyです。さらに、any()を使ったのが、MultiplePuz3.pyです。実行結果は実行時間も含めて同じになります。(^_^;
ちなみに、reduce()を使った高度なやり方もあるようです。参考までにURLをはっておきました。(^_^;
ところで、2020年度から小学校でプログラミング教育が必修化されるようですが、将来的には中高生が、こういった問題をプログラムで解くようになるのかな。(^_^;
● MultiplePuz1.py
# coding: UTF-8 # MultiplePuz1.py from time import time import itertools def main(): tm = time() # Timer Start N = '123456' for p in itertools.permutations(N): s = ''.join(p) if int(s[:2])%2!=0: continue if int(s[:3])%3!=0: continue if int(s[:4])%4!=0: continue if int(s[:5])%5!=0: continue if int(s[:6])%6!=0: continue pass # チェックを潜り抜けたものだけを表示 print(s) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
● MultiplePuz2.py
# coding: UTF-8 # MultiplePuz2.py from time import time import itertools def main(): tm = time() # Timer Start N = '123456' for p in itertools.permutations(N): s = ''.join(p) for n in range(2,7): if int(s[:n])%n!=0: break else: pass # チェックを潜り抜けたものだけを表示 print(s) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
● MultiplePuz3.py
# coding: UTF-8 # MultiplePuz3.py from time import time import itertools def main(): tm = time() # Timer Start N = '123456' for p in itertools.permutations(N): s = ''.join(p) if any([int(s[:n])%n!=0 for n in range(2,7)]): continue pass # チェックを潜り抜けたものだけを表示 print(s) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
123654 321654 Runtime : 0.000 [sec]
※参考URL
●2018年11月 聖光学院中学校【算数】 | 日能研 シカクいアタマをマルくする。
●日能研の問題を解く(2018/11) - Qiita