ลำดับมายากลของความยาว n


11

ลำดับเวทย์มนตร์เป็นลำดับของจำนวนเต็มที่ไม่เป็นลบx[0..n-1]เช่นว่ามีx[i]อินสแตนซ์ของi

ตัวอย่างเช่น 6,2,1,0,0,0,1,0,0,0 เป็นลำดับเวทย์มนตร์เนื่องจากมี 6 0, 2 1's และอื่น ๆ

เขียนฟังก์ชั่นซึ่งเมื่อได้รับ n เอาต์พุตเอาท์พุตมายากลทั้งหมดที่มีความยาว n


โปรแกรมที่สามารถสร้างเอาต์พุตที่ถูกต้องสำหรับค่าสูงสุดของ n ภายใน 10 วินาที (ยินดีต้อนรับทุกโปรแกรม)

ตัวอย่างเช่นโปรแกรมของอลิซสามารถจัดการได้มากถึง n = 15 ภายใน 10 วินาทีในขณะที่บ๊อบสามารถจัดการได้มากถึง n = 20 ภายในเวลาเดียวกัน บ๊อบชนะ

แพลตฟอร์ม: Linux 2.7GHz @ 4 CPUs


5
ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายที่ยิ่งใหญ่ แต่คุณต้องมีเกณฑ์การชนะ ตัวอย่างเช่นคุณสามารถพูดได้ว่าผู้ชนะคือโปรแกรมที่สั้นที่สุด
Ypnypn


2
โปรดอย่าเปลี่ยนเกณฑ์การชนะหลังจากโพสต์คำตอบแล้ว นอกจากนี้สิ่งนี้ดีกว่ากอล์ฟรหัสมากกว่าโค้ดที่เร็วที่สุดอย่างน้อยในความคิดของฉัน
Alex A.

2
@xnor คุณสามารถเริ่มต้นด้วยการสร้างพาร์ทิชันจำนวนเต็มของ n และตรวจสอบว่าพวกเขาสามารถอธิบายได้ด้วยตนเอง
Martin Ender

2
อะไรที่เล็กที่สุดใน n>5การแก้ปัญหาไม่ใช่แบบฟอร์ม[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]? ฉันเงยหน้าขึ้นn=20และไม่พบหนึ่งและสงสัยว่าฉันทำผิด
xnor

คำตอบ:


19

Python, n≈10 8

def magic_sequences(n):
    if n==4:
        return (1, 2, 1, 0),(2, 0, 2, 0) 
    elif n==5:
        return (2, 1, 2, 0, 0),
    elif n>=7:
        return (n-4,2,1)+(0,)*(n-7)+(1,0,0,0),
    else:
        return ()

สิ่งนี้ใช้ความจริงที่ฉันจะพิสูจน์ว่า Magic sequences ที่nมีความยาวคือ:

  • [1, 2, 1, 0]และ [2, 0, 2, 0]สำหรับn=4
  • [2, 1, 2, 0, 0] สำหรับ n=5
  • [n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0] สำหรับ n>=7

ดังนั้นสำหรับn>=7หนึ่งต้องการเพียงคืน tuple ขนาดใหญ่ ฉันสามารถทำสิ่งนี้ได้มากถึงn=10^8แล็ปท็อปซึ่งอาจถูก จำกัด โดยหน่วยความจำ อีกแล้วมันค้าง (ขอขอบคุณ Trichoplax สำหรับความคิดของการใช้ tuples มากกว่ารายการ.) หรือถ้าหนึ่งแทนสามารถพิมพ์พจนานุกรมของรายการที่ไม่ใช่ศูนย์ที่{0:n-4, 1:2, 2:1, (n-4):1}หนึ่งสามารถทำเช่นนี้สำหรับ nginormous

ฉันพิสูจน์เอกลักษณ์สำหรับn>=7; คนอื่น ๆ สามารถตรวจสอบได้โดยกำลังดุร้ายหรือ casework

ผลรวมของรายการของเป็นจำนวนรวมของตัวเลขทั้งหมดของรายการซึ่งเป็นความยาวของมันl nรายการมีl[0]ศูนย์และn-l[0]รายการที่ไม่ใช่ศูนย์ แต่โดยความหมายl[0]จะต้องเป็นศูนย์หรือที่เราได้รับความขัดแย้งและแต่ละรายการภัณฑ์อื่น ๆ อย่างน้อย 1 นี้แล้วบัญชีสำหรับผลรวมของออกจากผลรวมโดยรวมของl[0] + (n-l[0]-1)*1 = n-1 nดังนั้นไม่นับl[0]อาจมีอย่างน้อยหนึ่ง 2 และไม่มีรายการใหญ่กว่า 2

แต่นั่นหมายถึงเฉพาะรายการที่ไม่ใช่ศูนย์เป็นl[0], l[1], l[2], and l[l[0]], ที่มีค่าเป็นอย่างมากl[0]และการเปลี่ยนแปลงของซึ่งจะช่วยให้ผลรวมสูงสุด1,1,2 l[0]+4เนื่องจากผลรวมนี้nคืออย่างน้อย 7 เราจึงมีl[0]>=3และอื่นl[l[0]]=1ๆ ขณะนี้มีอย่างน้อยหนึ่ง1ซึ่งหมายถึงl[1]>=1แต่ถ้าl[1]==1ที่อื่น1ดังนั้นl[1]>=2ซึ่งหมายถึงเป็นคนเดียวl[1] 2สิ่งนี้ให้l[2]=1และรายการที่เหลือทั้งหมดคือ0ดังนั้นl[0]=n-4ซึ่งจะแก้ปัญหาให้เสร็จสมบูรณ์


และภาษาก็คือ ... ?
edc65

@ edc65 ดูเหมือนว่างูหลาม แต่ฉันไม่แน่ใจ.
Ismael Miguel

4

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ฉันสงสัยว่ามันจะคงอยู่ตลอดไปซึ่งในกรณีนี้มันเป็นเรื่องเล็กน้อยที่จะเอาท์พุทเป็นจำนวนมาก แม้ว่าจะไม่ใช่ความเข้าใจทางคณิตศาสตร์เกี่ยวกับวิธีแก้ปัญหาที่เป็นไปได้จะช่วยเร่งการค้นหาได้อย่างมาก


@Ypnypn n=0ฉันได้พิเศษดาด ฉันคิดถึงว่าเรากำลังกลับมาผลการเดียวnไม่นับถึงn's n=40นี้ได้รับฉันขึ้นไป
xnor

0

Pyth - 15 ไบต์

ใช้กำลังดุร้ายตามลำดับที่เป็นไปได้ทั้งหมดของ len nและตัวกรอง

f.A.eq/TkYT^UQQ

คำอธิบายแบบเต็มเร็ว ๆ นี้

ลองมันนี่เกมออนไลน์


2
FYI, OP เปลี่ยนเกณฑ์การชนะเป็นรหัสที่เร็วที่สุด
Alex A.

2
โดยไม่คำนึงถึงเกณฑ์ที่ชนะนี่คือ 3 ไบต์กอล์ฟ: `fqm / TdQT ^ UQQ`
Jakube

0

K, 26 ไบต์

{f@&{x~(+/x=)'!#x}'f:!x#x}

เช่นเดียวกับแนวทางของ Maltysen กำลังดุร้าย หัวใจของโปรแกรมเป็นเพรดิเคตซึ่งทดสอบว่าเวกเตอร์ที่ให้นั้นเป็น "เวทย์มนตร์":

{x~(+/x=)'!#x}

สร้างเวกเตอร์ iota ตราบเท่าที่เวกเตอร์อินพุต ( !#x) นับจำนวนการเกิดของแต่ละหลัก ( (+/x=)') และเปรียบเทียบผลลัพธ์กับเวกเตอร์อินพุต ( x~) หากมีการแข่งขันคุณมีลำดับมายากล

น่าเสียดายที่การแทงครั้งแรกดูเหมือนว่าช้า การทดสอบโดยใช้ Kona บนแล็ปท็อปของฉันใช้เวลาประมาณ 12 วินาทีเพื่อจัดการ n = 7 ฉันต้องคิดอีกหน่อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.