日能研の倍数パズルの問題をPythonで解いてみた。

 ちょっと前の問題ですか、日能研の倍数パズルの問題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