[PYTHON] Project Euler 32

problem

Let's say that a number with 1 to n used only once in every digit is a pandigital number with n digits: For example, the 5-digit number 15234 is a pandigital with 1 to 5.

7254 has an interesting property. Write 39 x 186 = 7254, and it becomes a pandigital with a number to be multiplied, a number to be multiplied, and a product of 1 to 9.

Find the sum of the products such that the number to be multiplied / the number to be multiplied / the product is Pandigital from 1 to 9.

HINT: Some products have one or more multiply / multiply / product combinations, but count only once. http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2032

Answer

There are 9! Pandigital numbers because of their significance. That is, decimal numbers from 0 to less than 9! Correspond to each of the Pandigital numbers. The answer is obtained by converting this decimal number less than 9! To a pandigital number, dividing the pandigital number, and determining whether or not the condition is satisfied. Also, paying attention to HINT, the value of the product is memorized and the same calculation is excluded. (It's probably more efficient to first create a function that simply extracts the product. In addition, since it can be seen from a simple consideration that the product to be calculated cannot be 3 digits or 5 digits, the following code is set to 4 digits.

import math
def create_pandigital(target,n,seeds):

  ret = ''
  while n > 0:
    kaijo = math.factorial(int(n))
    (q, r) = (target//kaijo, target%kaijo)
    ret += str(seeds.pop(q))
    target = r
    n -= 1
  return ret + str(seeds[0])

def main():
  N = 10
  MAX = math.factorial(int(N-1))
  ans = 0
  seeds = []
  seq = range(1,N)
  ls = []
  for target in range(3,MAX):
    seeds[:] = seq
    n = N - 2
    pan =  create_pandigital(target, n, seeds)

    for i in range(1,4):
      if not (pan[:4] in ls) and int(pan[:4]) == (int(pan[4:4+i+1]) * int(pan[4+i+1:])):
        ls.append(pan[:4])
        ans += int(pan[:4])
        break
  print ans

main()

Recommended Posts

Project Euler 37
Project Euler 7
Project Euler 47
Project Euler 4
Project Euler 38
Project Euler 17
Project Euler 26
Project Euler 8
Project Euler 23
Project Euler 22
Project Euler 19
Project Euler 50
Project Euler 42
Project Euler 33
Project Euler 32
Project Euler 43
Project Euler 35
Project Euler 36
Project Euler 24
Project Euler 46
Project Euler 48
Project Euler 45
Project Euler 6
Project Euler 44
Project Euler 39
Project Euler 40
Project Euler 49
Project Euler 29
Project Euler 27
Project Euler 41
Project Euler 18
Project Euler 13
Project Euler 30
Project Euler 16
Project Euler 14
Project Euler 34
Project Euler 25
[Project Euler] problem1
Project Euler15 "Lattice Path"
Project Euler 2 Acceleration 2.21 Save microseconds.
Project Euler Original Method Group 1
What is Project Euler 3 Acceleration?
Functional programming in Python Project Euler 1
Project Euler 10 "Sum of Prime Numbers"
[Note] Project Euler in Python (Problem 1-22)
Functional programming in Python Project Euler 3
Project Euler # 5 "Minimum Multiples" in Python
Project Euler 4 Attempt to speed up
Functional programming in Python Project Euler 2
Project Euler 11 "Maximum product in grid"
Project Euler # 15 "Lattice Path" in Python
Project Euler # 4 "Maximum Palindrome" in Python
Project Euler 9 Retention of calculation results
Project Euler # 3 "Maximum Prime Factors" in Python
Project Euler # 11 "Maximum Product in Grid" in Python
Project Euler # 7 "1000 1st prime number" in Python
Project Euler # 16 "Sum of Powers" in Python
Project Euler # 9 "Special Pythagorean Triple" in Python
Project Euler # 14 "Longest Collatz Sequence" in Python
I wrote Project Euler 1 in one liner.
Project Euler # 2 "Even Fibonacci Numbers" in Python