รหัสกอล์ฟเรียงสับเปลี่ยนที่ดีที่สุด


14

ท้าทาย

รับจำนวนเต็มn ≥ 4ส่งออกค่าการเปลี่ยนแปลงของจำนวนเต็ม[0, n-1]ด้วยคุณสมบัติที่ไม่มีจำนวนเต็มต่อเนื่องสองตัวติดกัน มูลค่าของการเปลี่ยนแปลงการให้piคือผลรวมของดัชนีทั้งหมดabs(pi[i] - i)i

ตัวอย่าง

  • (1, 3, 0, 2) มีค่า 6
  • (0, 2, 4, 1, 3) มีค่า 6
  • (0, 2, 4, 1, 3, 5) มีค่า 6
  • (0, 2, 4, 1, 5, 3, 6) มีค่า 8

คะแนนคำตอบของคุณ

คะแนนคำตอบของคุณคือผลรวมของค่าการเรียงสับเปลี่ยนของคุณn = 4 .. 14บวกกับจำนวนไบต์ที่โค้ดของคุณใช้ ยิ่งคะแนนต่ำเท่าไหร่ก็ยิ่งดีเท่านั้น nรหัสของคุณจะต้องให้การส่งออกที่ถูกต้องสำหรับค่าเหล่านั้นทั้งหมด

คุณต้องสามารถเรียกใช้การส่งของคุณให้เสร็จสมบูรณ์บนเครื่องของคุณ

ในกรณีที่มีความสัมพันธ์กันเวลาของการแก้ไขครั้งสุดท้ายที่ส่งผลให้คะแนนที่เกี่ยวข้องจะเป็น decider

นี่ไม่ใช่คำถามเดียวกันกับคำถามนี้ใช่หรือไม่

คำตอบของคำถามที่เชื่อมโยงจะไม่สามารถแข่งขันกับคำถามนี้ได้เนื่องจากไม่ได้พยายามเพิ่มประสิทธิภาพของการเปลี่ยนแปลง ตัวอย่างเช่นสำหรับn=10, การเปลี่ยนลําดับที่กำหนดโดยส่วนใหญ่ของคำตอบที่มีให้คุ้มค่าของ[1, 3, 5, 7, 9, 0, 2, 4, 6, 8] 30คุณสามารถทำได้ดีกว่านั้น

120สำหรับส่วนการเปลี่ยนแปลงของคำถามที่ว่าค่าที่ดีที่สุดโดยรวมเป็นอย่างมาก (ขอขอบคุณ @Laikoni.) โดยคำตอบที่เดนนิสคะแนนคำถามก่อนหน้านี้222 (ขอบคุณ @@20202929)


4
@ โจ้กกิ้งทุกคำตอบสามารถจัดวางได้โดยไม่มีการเปลี่ยนแปลง แต่จะทำคะแนนได้แย่มากในการท้าทายนี้ การโพสต์รหัสนั้นในความท้าทายนี้เทียบเท่ากับการโพสต์รหัสจากการตรวจสอบรหัสไปยังการแข่งขันกอล์ฟ
Stewie Griffin

2
การผสมปริมาณต่าง ๆ ในคะแนนอาจเป็นปัญหาได้ คำตอบด้วยอัลกอริธึมที่ดีที่สุดมักจะได้รับการส่งผ่านไปยังภาษาใด ๆ ซึ่งในกรณีนี้การให้คะแนนจะลดลงเป็นกอล์ฟรหัสปกติ
Angs

4
ค่าที่ดีที่สุดมี[6,6,6,8,10,12,12,12,14,16,18]ไว้สำหรับ 120 คะแนนที่น่าสนใจรูปแบบนี้สามารถพบได้ในA078706 A078706
Laikoni

3
ตกลงมันเริ่มที่จะแตกต่างจากA078706ที่มีซึ่งจะมีคะแนนของn=1720
Laikoni

4
ฉันสามารถเข้าใจความท้าทายได้อย่างชัดเจนและชัดเจน หากคุณไม่เห็นด้วยและโหวตให้ปิดให้แสดงความคิดเห็นที่นี่
user202729

คำตอบ:


7

วุ้น , 36 34 33 32 31 30 ไบต์, ผลลัพธ์: 120

ขอบคุณเดนนิสสำหรับ -1 ไบต์! (โดยปริยายโดยการแก้ไขข้อบกพร่องของเจลลี่แม้ว่าคุณสมบัติจะโพสต์ความท้าทาย)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

คุณลักษณะใหม่: ยอดรวมสะสม ( Ä)

ลองออนไลน์!

ใช้การจัดทำดัชนี 1 รายการ

ใช้เวลาเชิงเส้นด้วย


โปรแกรม C ++ นี้สร้างการเรียงสับเปลี่ยนที่เล็กที่สุดของ lexicographically โดยสันนิษฐานว่า| i - p i | ความกว้าง ((โดยที่ความกว้างคือค่าคงที่ hardcoded) สำหรับ0 ≤ i <n ทั้งหมดโดยมีความซับซ้อนของเวลาเกี่ยวกับO (ความกว้าง2 × 2 2 ×ความกว้าง × n) (ซึ่งเป็นเพียงO (n)สำหรับการแก้ไขความกว้าง ): ลองออนไลน์ !


อย่างไร?

  1. เขียนโปรแกรม C ++ ที่พยายามแก้ไขปัญหาอย่างเหมาะสม
  2. สังเกตรูปแบบ เราทราบว่าลำดับขององค์ประกอบทั้งหมดยกเว้น 4 รายการสุดท้ายเป็นคำนำหน้าของ

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. คำนวณความแตกต่างที่เพิ่มขึ้นของลำดับ

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    สังเกตช่วงเวลา 5

  4. การใช้งานเยลลี่:

    • องค์ประกอบแรกn-4ถูกนำมาจากลำดับด้านบน บน)(n)
    • สำหรับองค์ประกอบสุดท้าย4 รายการเพียงแค่เดรัจฉานบังคับความเป็นไปได้ทั้งหมด 24ข้อ O (1)(1)

      (หมายเหตุ: ฉันไม่เดรัจฉานบังคับ 24 ความเป็นไปได้ทั้งหมดจากรุ่น 32- ไบต์อีกต่อไป)


อาคุณไปกับคำนำหน้าที่แตกต่างกับฉัน ฉันเริ่มต้น0 2 4 1 3 5 8 6และมีปัจจัยการแตกแขนงที่ใหญ่กว่า แต่ไม่มีรูปแบบที่เรียบง่าย
Peter Taylor

7

CJam (60 ไบต์ + 120 = 180 คะแนน)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

ชุดทดสอบออนไลน์พร้อมการให้คะแนนในตัว

ส่วนขยายสูงสุด n = 24

การผ่า

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}

ที่น่าประทับใจมาก! ฉันหวังว่าจะค้นพบวิธีที่คุณทำมัน
Anush

มันเหมาะสมที่สุดจนถึง 24 หรือไม่?
Anush

@Anush ตามโปรแกรมของฉันน่าจะ
user202729

@Anush ฉันยังไม่ได้พิสูจน์ แต่ฉันเชื่อว่าเป็นไปได้
ปีเตอร์เทย์เลอร์

ฉันทึ่งในอัลกอริทึมของคุณมากยิ่งขึ้น!
Anush

6

Haskell , 146 + 89 คะแนน + ไบต์

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

ทำซ้ำรูปแบบ [1,3,0,2] ครั้งสุดท้าย mod i 4องค์ประกอบจะถูกปรับด้วยมือ

อัลกอริทึมก่อนหน้า (132 + 116):

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

bruteforces จำนวนกระโดดที่ถูกต้อง± 2 หรือ± 3 เลือกหมายเลขสุดท้ายที่มีตัวเลขที่ถูกต้องดูเหมือนว่าจะใช้ได้ดีและราคาถูกกว่าการนำคะแนนไปใช้ Tio หมดเวลาก่อนคะแนนสุดท้ายซึ่งก็คือ 18

ลองออนไลน์!


2

Japt, 120 + 20 = 140

(การคัดลอกหนึ่งในโซลูชันของฉันจากความท้าทายอื่นจะให้คะแนนฉัน 227)

o á k_äa d¥1ÃñxÈaYÃg

ลองใช้หรือใช้เวอร์ชันนี้เพื่อตรวจสอบคะแนน ทั้งสองเวอร์ชันอาจเริ่มคลั่งไคล้คุณประมาณ 9 คน


คำอธิบาย

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array

9
" คุณต้องสามารถเรียกใช้การส่งข้อมูลของคุณให้เสร็จสมบูรณ์บนเครื่องของคุณ " คุณจัดการการประมวลผลเรียงลำดับ 87E9 จาก 14 องค์ประกอบในสองชั่วโมงนับตั้งแต่คำถามถูกโพสต์หรือไม่
ปีเตอร์เทย์เลอร์

3
นอกจากนี้ให้พิจารณาว่า Japt คิดตามจาวาสคริปต์แล้วสามารถจัดการกับพีชคณิต 87E9 ได้หรือไม่? คำถามนี้บอกว่าอาร์เรย์ Javascript สามารถมีความยาวได้สูงสุด ~ 4E9 Japtive มีการสร้างฟังก์ชั่นหรือบางอย่าง ... \
user202729

2

Ruby , 120 คะแนน + 112 106 91 82 ไบต์

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

ลองออนไลน์!

(a-2)+(a+2)%5ลำดับเป็นพื้น

หาก n mod 5 ไม่ใช่ 0 หรือ 1 องค์ประกอบ 3 หรือ 4 ตัวสุดท้ายจะแตกต่างกัน

นี่ยังคงเป็นฮาร์โค้ดอยู่ครึ่งหนึ่งค้นหาวิธีแก้ปัญหาที่ดีที่สุดอยู่เสมอบางทีมันอาจจะเล่นกอล์ฟเพิ่มอีกนิดหน่อย แต่ฉันหมดความคิดไปแล้ว


1

JavaScript (Node.js) , 148 คะแนน + 109 73 ไบต์

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

ลองออนไลน์! คำอธิบาย: lติดตามหมายเลขสุดท้ายที่สร้างและmติดตามการทำงานของจำนวนต่อไปของความเท่าเทียมกันตรงกันข้ามกับl; หนึ่งครั้งlเกินกว่าm+2ตัวแปรที่มีการแลกเปลี่ยน การปรับจะทำในช่วงเริ่มต้นของลำดับเพื่อให้ลำดับที่มีความยาวไม่ได้หลายรายการ 5 ไม่พลาดออกหมายเลขใด ๆ n=4และปรับอีกจะทำสำหรับ

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