Python 3, n≈40
def plausible_suffix(l,N):
if sum(l)>N:
return False
pairs = [(N-1-i,l[i]) for i in range(len(l))]
if sum(i*x for i,x in pairs)>N:
return False
num_remaining = N - len(l)
for index, desired_count in pairs:
count = l.count(index)
more_needed = desired_count - count
if more_needed<0:
return False
num_remaining -= more_needed
if num_remaining<0:
return False
return True
plausible_func = plausible_suffix
def generate_magic(N):
l=[0]
while l:
extend = False
if plausible_func(l,N):
if len(l)==N:
yield l[::-1]
else:
extend = True
if extend:
l.append(0)
else:
while l[-1]>=N-2:
l.pop(-1)
if not l:raise StopIteration
l[-1]+=1
n=40 #test parameter
if n>0:
for x in generate_magic(n):
print(n,x)
ทำการค้นหารายการที่เป็นไปได้อย่างกว้าง ๆ ก่อนโดยป้อนข้อมูลจากขวาไปซ้ายหยุดการค้นหาที่ส่วนต่อท้ายหากไม่น่าเชื่อถือซึ่งอาจเกิดขึ้นได้หาก:
- ผลรวมของรายการในส่วนต่อท้ายเกิน
n
(ผลรวมสำหรับรายการทั้งหมดต้องเป็นn
)
- ผลรวมถ่วงน้ำหนักของ
i*l[i]
ในคำต่อท้ายเกินn
(ผลรวมสำหรับรายการทั้งหมดต้องเป็นn
)
- หมายเลขใด ๆ ที่ปรากฏในคำต่อท้ายเพิ่มเติมครั้งที่คำต่อท้ายบอกว่าควร
- จำนวนสปอตที่ยังไม่ได้บรรจุเหลือน้อยเกินไปสำหรับจำนวนทั้งหมดที่ต้องปรากฏขึ้นอีกครั้ง
ฉันมีคำนำหน้าทดสอบดั้งเดิมจากซ้ายไปขวา แต่นั่นช้ากว่า
เอาต์พุตจนถึงn=30
:
4 [1, 2, 1, 0]
4 [2, 0, 2, 0]
5 [2, 1, 2, 0, 0]
7 [3, 2, 1, 1, 0, 0, 0]
8 [4, 2, 1, 0, 1, 0, 0, 0]
9 [5, 2, 1, 0, 0, 1, 0, 0, 0]
10 [6, 2, 1, 0, 0, 0, 1, 0, 0, 0]
11 [7, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0]
12 [8, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]
13 [9, 2, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
14 [10, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
15 [11, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
16 [12, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
17 [13, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
18 [14, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
19 [15, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
20 [16, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
21 [17, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
22 [18, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
23 [19, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
24 [20, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
25 [21, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
26 [22, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
27 [23, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
28 [24, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
29 [25, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
30 [26, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
ยกเว้นสามรายการแรกที่[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
มีอยู่ตรงหนึ่งรายการของแต่ละความยาวและมีรูปแบบn>6
รูปแบบนี้ยังคงเพิ่มขึ้นอย่างน้อย[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
n=50
ฉันสงสัยว่ามันจะคงอยู่ตลอดไปซึ่งในกรณีนี้มันเป็นเรื่องเล็กน้อยที่จะเอาท์พุทเป็นจำนวนมาก แม้ว่าจะไม่ใช่ความเข้าใจทางคณิตศาสตร์เกี่ยวกับวิธีแก้ปัญหาที่เป็นไปได้จะช่วยเร่งการค้นหาได้อย่างมาก