ihit's diary

ちょっとしたメモに

Project Euler 32

32番
パンデジタルといって1から9までの数字を1回ずつ使って掛け算の式を成立させる問題
できたもののイマイチ…

今回は順列を求めるのにitertoolsを使った
またリストやタプルの数字列を一つの数値にするためにreduceを使った
例 reduce(lambda x,y: x*10+y, [1,2,3]) →123

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import itertools

num_list = [1,2,3,4,5,6,7,8,9]
ans = 0
ans_list = []
#積は4桁しかない
#掛けられる数>掛ける数としたとき、掛けられる数は4桁か3桁
for i in [4,3]:
	now_num_list = num_list[:]
	for left_list in itertools.permutations(num_list,i):
		now_num_list = num_list[:]
		for k in left_list:
			now_num_list.remove(k)
		for right_list in itertools.permutations(now_num_list,5-i):
			new_now_num_list = now_num_list[:]
			for k in right_list:
				new_now_num_list.remove(k)
			answer = reduce(lambda x,y:10*x+y,left_list) * reduce(lambda x,y:10*x+y,right_list)
			if sorted(map(lambda x:int(x),list(str(answer)))) == new_now_num_list and not answer in ans_list:
				ans_list.append(answer)
				ans += answer
print ans