欧拉计划 发表于 2016-8-10 18:25:16

题目90:用两个立方体表示平方数的奇怪方式

Cube digit pairs

Each of the six faces on a cube has a different digit (0 to 9) written on it; the same is done to a second cube. By placing the two cubes side-by-side in different positions we can form a variety of 2-digit numbers.

For example, the square number 64 could be formed:



In fact, by carefully choosing the digits on both cubes it is possible to display all of the square numbers below one-hundred: 01, 04, 09, 16, 25, 36, 49, 64, and 81.

For example, one way this can be achieved is by placing {0, 5, 6, 7, 8, 9} on one cube and {1, 2, 3, 4, 8, 9} on the other cube.

However, for this problem we shall allow the 6 or 9 to be turned upside-down so that an arrangement like {0, 5, 6, 7, 8, 9} and {1, 2, 3, 4, 6, 7} allows for all nine square numbers to be displayed; otherwise it would be impossible to obtain 09.

In determining a distinct arrangement we are interested in the digits on each cube, not the order.

{1, 2, 3, 4, 5, 6} is equivalent to {3, 6, 4, 1, 2, 5}
{1, 2, 3, 4, 5, 6} is distinct from {1, 2, 3, 4, 5, 9}

But because we are allowing 6 and 9 to be reversed, the two distinct sets in the last example both represent the extended set {1, 2, 3, 4, 5, 6, 9} for the purpose of forming 2-digit numbers.

How many distinct arrangements of the two cubes allow for all of the square numbers to be displayed?

题目:

一个立方体的六个面上每个面都有一个 0-9 的数字,另一个立方体也如此。将两个立方体用不同的方式挨着放置,我们可以得到不同的两位数。

例如,平方数 64 可以如下表示:



如果仔细选择每个立方体面上的数字,我们可以表示出 100 以下所有的平方数: 01, 04, 09, 16, 25, 36, 49, 64, 和 81。

例如,能够达到这个目的的一种方式在一个立方体上标示 {0, 5, 6, 7, 8, 9},在另一个上标示 {1, 2, 3, 4, 8, 9}。

但是在这个问题中,我们允许 6 和 9 通过颠倒来互相表示。所以 {0, 5, 6, 7, 8, 9} 和 {1, 2, 3, 4, 6, 7} 就可以表示所有 9 个平方数,否则无法标示 09。

在判断不同的安排时,我们只对每个立方体上的数字感兴趣,而不考虑顺序。

{1, 2, 3, 4, 5, 6} 等价于 {3, 6, 4, 1, 2, 5}
{1, 2, 3, 4, 5, 6} 和{1, 2, 3, 4, 5, 9} 则是不同的安排

但是由于我们允许 6 和 9 互相颠倒,所以上面的第二个例子的两个安排都可以表示 {1, 2, 3, 4, 5, 6, 9}。

要表示所有 9 个平方数的话,一共有多少种可行的安排?

jerryxjr1220 发表于 2016-10-18 10:13:55

(1217, 1217)


import itertools
resultTotal = []
numbers90 =
count = 0
for i in itertools.combinations(numbers90, 6):
    for j in itertools.combinations(numbers90, 6):
      if (0 in i and 1 in j) or (1 in i and 0 in j):
            if (0 in i and 4 in j) or (4 in i and 0 in j):
                if (0 in i and (9 in j or 6 in j)) or ((9 in i or 6 in i) and 0 in j):
                  if (1 in i and (6 in j or 9 in j)) or ((6 in i or 9 in i) and 1 in j):
                        if (2 in i and 5 in j) or (5 in i and 2 in j):
                            if (3 in i and (6 in j or 9 in j)) or ((6 in i or 9 in i) and 3 in j):
                              if (4 in i and (9 in j or 6 in j)) or ((9 in i and 6 in i) and 4 in j):
                                    if ((6 in i or 9 in i) and 4 in j) or (4 in i and (6 in j or 9 in j)):
                                        if (8 in i and 1 in j) or (1 in i and 8 in j):
                                          if i + j not in resultTotal:
                                                result = j + i
                                                resultTotal.append(result)
                                                count = count +1

print(count,len(resultTotal))

jerryxjr1220 发表于 2016-10-18 10:15:40

很垃圾的代码,但是很好用,暴力解法,速度也很快{:5_97:}

芒果加黄桃 发表于 2017-3-2 13:46:21

# encoding:utf-8
# 用两个立方体表示平方数的奇怪方式
from time import time
from itertools import combinations
squrenums = [(0, 1), (0, 4), (0, 9), (1, 6), (2, 5), (3, 6), (4, 9), (6, 4), (8, 1)]
nums =
s_pre, s_beh = set(), set()
def check(l_i, l_j):
    l_a, l_b = l_i.copy(), l_j.copy()
    if 6 in l_a or 9 in l_a:
      l_a.add(6)
      l_a.add(9)
    if 6 in l_b or 9 in l_b:
      l_b.add(6)
      l_b.add(9)
    for each in squrenums:
      if not ((each in l_a and each in l_b) or (each in l_b and each in l_a)):
            return False
    return True
def euler090(N=10000):
    count = 0
    for l_i in combinations(nums, 6):
      for l_j in combinations(nums, 6):
            if check(set(l_i), set(l_j)):
                t1, t2 = ''.join(sorted(str(x) for x in l_i)), ''.join(sorted(str(x) for x in l_j))
                if t1 in s_beh and t2 in s_pre:
                  continue
                count += 1
                s_pre.add(t1)
                s_beh.add(t2)
    print(count)
if __name__ == '__main__':
    start = time()
    euler090()
    print('cost %.6f sec' % (time() - start))
1217
cost 0.181000 sec

fc1735 发表于 2020-6-4 15:07:20

from itertools import combinations
numbers = list(map(lambda x: x ** 2, range(1, 10)))
pairs = list(map(lambda n: list(map(lambda x: 6 if x == 9 else x, )), numbers))

c = list(combinations(list(range(9)) + , 6))
ans = 0
for i in c:
for j in c:
    for a, b in pairs:
      if not ((a in i and b in j) or (b in i and a in j)):
      break
    else:
      ans += 1

print(ans // 2)
https://github.com/devinizz/project_euler/blob/master/page02/90.py
页: [1]
查看完整版本: 题目90:用两个立方体表示平方数的奇怪方式