Superpermutations


26

บทนำ

คุณเป็นอาชญากรที่ได้ขโมยแผนลับจาก Dejavu เทคโนโลยีใหม่ คุณแอบเข้าไปในกำแพงด้านหลัง แต่หาประตูที่ต้องใช้หมุดเปิด คุณรับรู้ถึงการล็อคและรู้ว่ามันใช้เวลา 5 พินโดยใช้ตัวเลขทั้งหมดจาก 0 ถึง 4 หลังจากป้อนแต่ละหลักแล้วการล็อคจะตรวจสอบ 5 หลักสุดท้ายที่ป้อนและเปิดหากรหัสถูกต้อง คุณต้องผ่านล็อคนี้และรวดเร็ว

ผลสรุปโดยย่อ

การเปลี่ยนแปลงคือการรวมกันที่เป็นไปได้ทั้งหมดของชุดของตัวเลข ตัวอย่างเช่นพีชคณิตทั้งหมดของตัวเลข 0, 1, 2 คือ:

012, 021, 102, 120, 201 และ 210

ถ้าเราต่อพีชคณิตทั้งหมดนี้เข้าด้วยกันเราจะได้ผลลัพธ์ที่ยอดเยี่ยม:

012021102120201210

superpermutation นี้มีพีชคณิตทั้งหมดเป็น 0, 1, 2 แต่เป็นไปได้ที่จะทำให้สั้นกว่านี้ ฉันจะข้ามไปนิดหน่อยที่นี่ แต่ superpermutation ที่สั้นที่สุดของตัวเลขเหล่านี้คือ:

012010210

สำหรับจุดประสงค์และจุดประสงค์ของเรานี่คือสตริงหลักที่สั้นที่สุดที่มีการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดของตัวเลขเหล่านั้นนั่นคือ superpermutation

งาน

งานของคุณนั้นยากกว่าตัวอย่าง superpermutation ดังที่แสดงไว้ด้านบนเนื่องจากคุณมีตัวเลขอีกสองหลักที่ต้องกังวล - หากคุณยังไม่ได้อ่านเกี่ยวกับ superpermutations หรือตัวอย่างข้างต้นของฉันยังไม่ชัดเจนฉันขอแนะนำให้คุณอ่านบทความที่ยอดเยี่ยมจาก Patrick Honner ในเรื่องนี้ (ความท้าทายนี้ได้รับแรงบันดาลใจจากบทความของเขาดังนั้นขอชื่นชมเขา) https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/ เป้าหมายของคุณคือการเขียนโปรแกรมที่สั้นที่สุดเท่าที่จะเป็นไปได้ซึ่งจะสร้างตัวเลขที่ยิ่งใหญ่ของตัวเลข 0 ถึง 4

เกณฑ์การให้คะแนน

โปรแกรมของคุณไม่รับอินพุตใด ๆ จากการเรียงลำดับใด ๆ และสร้าง superpermutation ของตัวเลขจาก 0 ถึง 4 ผลลัพธ์ที่ได้จะต้องพิมพ์ superpermutation ไปยังคอนโซลหรือแสดงให้ผู้ใช้เห็นอย่างชัดเจนตามขอบเขตที่คุณเลือก สิ่งนี้ไม่จำเป็นต้องเป็นการเปลี่ยนรูปแบบที่สั้นที่สุดเท่าที่จะเป็นไปได้ ด้วยเหตุนี้เป้าหมายคือการเขียนโปรแกรมที่สั้นที่สุดด้วย superpermutation ที่สั้นที่สุดดังนั้นคุณควรคำนวณคะแนนของคุณดังนี้:

ขนาดไฟล์ (ไบต์) * ความยาว superpermutation ที่สร้างขึ้น (หลัก)

ตัวอย่างเช่นถ้าฉันมีโปรแกรม 40 byte และ superpermutation ของฉันมีความยาว 153 หลักคะแนนของฉันจะเป็น:

40 * 153 = 6120

เช่นเคยเป้าหมายคือการได้รับคะแนนนี้ต่ำที่สุด

แบบ

นี่คือวิธีที่คุณควรโพสต์คำตอบของคุณ:

ภาษา | คะแนน

ลิงค์ไปยังรหัสในสภาพแวดล้อมการทำงาน (ถ้าเป็นไปได้)

code snippet

คำอธิบายรหัส ฯลฯ

Finalities

นี่เป็นหนึ่งในคำถามแรกของฉันในเว็บไซต์นี้ ดังนั้นโปรดบอกฉันว่าฉันไม่มีสิ่งใดหรือส่วนหนึ่งของความท้าทายของฉันไม่ชัดเจน ขอบคุณและสนุกกับการเล่นกอล์ฟ!


เราสามารถทราบความยาวของ superpermutation ที่สั้นที่สุดเพื่อให้เข้าใจถึงคะแนนต่ำสุดได้หรือไม่?
เสียชีวิต

1
@Falize 153 สั้นที่สุด
TFeld

1
@Fatalize ดูA180632
Arnauld

1
เมื่อมองแวบแรกดูเหมือนว่ามันจะขอลำดับเดอบรูนน์ อย่างไรก็ตามเกณฑ์การให้คะแนนทำให้ความท้าทายนี้น่าสนใจ ทำได้ดี!
Erik the Outgolfer

3
@EriktheOutgolfer มันไม่ใช่แค่ความแตกต่างในการให้คะแนน: superpermutation นั้นมีการเรียงสับเปลี่ยนทั้งหมดที่มีความยาวในขณะที่ลำดับ de Bruijn นั้นมีความยาวทั้งหมด
Anders Kaseorg

คำตอบ:


6

05AB1Eคะแนน = 1673 (7 ไบต์· 239)

žBœ∊{3ý

ลองออนไลน์!

มันทำงานอย่างไร

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth , คะแนน = 1944 (9 ไบต์· 216)

s+R+4d.p4

ลองออนไลน์!

มันทำงานอย่างไร

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJบันทึกไบต์
Emigna

1
ในรหัส Pyth m+d-> +Rบันทึกเป็นไบต์
isaacg

8
การโพสต์สิ่งนี้เป็นคำตอบที่แยกกันสองทางจะดีกว่าหรือไม่เนื่องจากวิธีการและภาษาโปรแกรมต่างกัน?
Kevin Cruijssen

@KevinCruijssen Meh พวกเขาทั้งคู่ต่างกันในรูปแบบของการเข้าร่วมเรียงสับเปลี่ยนของ 4 องค์ประกอบที่มีองค์ประกอบที่เหลือ; คำตอบ 05AB1E ของฉันมีความเหมือนกันมากกับคำตอบ Pyth ของฉันเหมือนกับที่ใช้กับเวอร์ชันที่ต่างกัน ดังนั้นฉันไม่ต้องการขอ upvotes สองเท่าเพื่อเปลี่ยนภาษา
Anders Kaseorg

3

Brachylog , คะแนน = 2907 (19 ไบต์× 153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

ช้าเกินกว่าที่จะเห็นอะไร แต่ถ้าคุณเปลี่ยน4โดย2คุณสามารถทดสอบได้: ลองออนไลน์!

สิ่งนี้พบว่า superpermutation ที่สั้นที่สุดเช่น:

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

JavaScript (ES6), 26975 (325 * 83 ไบต์)

ด้วยระบบการให้คะแนนนี้มีช่องว่างเล็ก ๆ น้อย ๆ ระหว่าง'hardcode the supermutation ที่ดีที่สุด'และ'ใช้ short-in แบบสั้นเพื่อเรียงสับเปลี่ยนทั้งหมด'อย่างน้อยก็ไม่ใช่ esolangs

นี่คือความพยายามอยู่ดี

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

ลองออนไลน์!

มันสร้างสตริงของ 325 ไบต์:

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

คุณมีจุดที่ถูกต้องฉันจะบอกว่าฉันเป็นกังวลเล็กน้อยเกี่ยวกับระบบการให้คะแนน ในอนาคตฉันจะพยายามมีน้ำใจและให้คะแนนมากขึ้นในแบบที่ช่วยให้มีวิธีการที่หลากหลาย : D
Isaac C

หากคุณสามารถส่งคืนสตริงที่มีขนาดเล็กกว่า 23 ไบต์ให้คะแนน hardcoding ดีกว่าโซลูชันนี้ ( 26975/153-153>23)
Sanchises

เราจำเป็นต้อง @Sanchises 5 ไบต์สำเร็จรูปสำหรับสตริงหรือ4 สำหรับ bigint
Arnauld

@Sanchises เราสามารถบีบอัดสตริงเล็กน้อย: ลองออนไลน์! (หรือน้อยกว่าหากคุณไม่นับnส่วนต่อท้ายที่เป็นค่าเริ่มต้นconsole.log)
Neil


2

05AB1Eคะแนน: 5355 2160 (216 * 10 ไบต์ )

3ÝœJε4yJ}J

คำตอบPythของ@AndersKaseorgของ Port of ดังนั้นอย่าลืมโหวตให้เขา!

ลองออนไลน์

คำอธิบาย:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

อ็อกเทฟ 27 x 442 = 11934

'01234'(perms(1:5)'(4:445))

ลองออนไลน์!

ดังนั้นมันจะเปิดออกอย่างไร้เดียงสาสร้างทั้งหมดพีชคณิตและจากนั้นก็ตัดทอนไปย่อยที่สั้นที่สุดที่ยังคงเป็นที่ถูกต้อง superpermutation สั้นกว่าการสร้าง superpermutation ที่สั้นที่สุด น่าเสียดายที่เวลานี้คะแนนไม่ได้เป็น Palindrome

อ็อกเทฟ , 97 x 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

ลองออนไลน์!

รายการปรับปรุงสำหรับบางสิ่ง

  • a++ ไม่ได้ใช้งานสำหรับหมายเลขสัญลักษณ์
  • contains()ไม่ได้ใช้งานใน Octave any(regexp())แทนที่ด้วย
  • ในลิงค์ออนไลน์ฉันเข้าไปaใกล้ superpermutation ที่มีความยาว 153 เมตรด้วยตนเอง วิธีนี้ช่วยให้สามารถตรวจสอบโซลูชันได้

2

CJam (6 * 240 = 1440)

5e!72>

ออนไลน์สาธิต , การตรวจสอบ (outputs ดัชนีที่เปลี่ยนแปลงของแต่ละ0..4สามารถพบได้ก็ต้องการที่จะแผ่ส่งออกเนื่องจากโปรแกรมเดิมจะช่วยให้การส่งออกที่เหมาะสมที่ stdout แต่สิ่งที่มันวางบนสแต็คที่ไม่สามารถใช้งานได้โดยตรง)

วิธีการที่ถูกขโมยไปจาก Sanchisesแม้ว่าลำดับการเปลี่ยนแปลงของ CJam จะแตกต่างกัน แต่ให้สตริงย่อยที่แตกต่างกัน


CJam (22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

สาธิตออนไลน์ , การตรวจสอบ

การผ่า

สิ่งนี้ใช้โครงสร้างแบบเรียกซ้ำง่าย ๆ

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

Charcoal , 29 ไบต์, ความยาวเอาต์พุต 153, คะแนน 4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย: เช่นเดียวกับ @TFeld ฉันเพิ่งพิมพ์ superpermutation และสะท้อนครึ่งหนึ่ง ฉันคำนวณ superpermutation โดยใช้รหัสต่อไปนี้:

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

สิ่งนี้แปลเป็นโปรแกรมขนาด 45 ไบต์ใน Charcoal ดังนั้นจะได้คะแนน 6885




0

Perl 6 , 7191 (153 * 47 ไบต์)

say first *.comb(permutations(5).all.join),0..*

ลองออนไลน์!

ค้นหาหมายเลขแรกที่มีการเรียงสับเปลี่ยนทั้งหมดของตัวเลข 0 ถึง 4 ซึ่งจะใช้เวลานานในการดำเนินการ แต่คุณสามารถทดสอบด้วยการเปลี่ยนลำดับสองครั้งแรก0และ0,1


0

ภาษา Wolfram (Mathematica) , 153 * 95 bytes, 14535

Nest[Flatten[Join[#,{Max@#+1},#]&/@Partition[#,Max@#+1,1]]//.{b__,a__,a__,c__}:>{b,a,c}&,{0},4]

ลองออนไลน์!





ดี! ฉันแค่ต้องการโพสต์ 153- แก้ปัญหา คุณสามารถโพสต์คำตอบใหม่ได้หากคุณต้องการ
J42161217

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