とあるSEの手順書

個人的な技術メモです。無保証ですが参考になりましたら幸いです。

レイトン教授 不思議な街のナゾ099を解く

レイトン教授面白いですね。
ナゾ099に、こんなのがありました。
1から9までの数字を1回ずつ使い、□□□□□-□□□□=33333になるよう□に数字を当てはめるというものです。

私は解けませんでした。

Pythonで無理やり解いてみようとソースコードを書きました。

import numpy as np
import re

def isKiri(x):
	if re.match('^([0-9])\\1+$', str(x)):
		return True
	if str(x) in '12345':
		return True
	return False

def hantei(z):
    ans = z[0] * 10000 + z[1] * 1000 + z[2] * 100 + z[3] * 10 + z[4] - z[5] * 1000 -z[6] * 100 - z[7] * 10 - z[8]
    if isKiri(ans):
        print (str(ans) + ',' + str(z))

def tansaku(x,y):
    for n in x:
        # xから1つ要素を減らす
        next_x = np.array([ i for i in x if n != i ])
        # yに選択した要素を追加する
        next_y = np.append(y , n)
        if next_y.size == 9:
            hantei(next_y)
            return
        # xがなくなるまで再帰
        tansaku(next_x , next_y)

if __name__ == '__main__':
    x = np.arange(1,10)
    y = np.array([] , dtype='int32')
    tansaku(x, y)

調べてみると33333は、2件しかないですが、
33333を除き、11111から77777は、結構数パターン存在するみたいですね。

キリ番判定は、下記を参考にさせていただきました。
pythonでキリ番かどうか判定する - BlankTar