ปรับรายการให้เรียบ


12

คุณควรจะเขียนโปรแกรมหรือฟังก์ชั่นซึ่งจะเป็นจำนวนเต็มไม่เป็นลบkและรายการจำนวนเต็มเรียงเป็นอินพุตและเอาต์พุตหรือผลตอบแทนที่เป็นรายการที่เรียบLM

Mถูกสร้างขึ้นจากรายการจากน้อยไปมากLโดยการใส่kองค์ประกอบจำนวนเต็มส่วนใหญ่ในขณะที่เก็บรายการเรียงลำดับ จำนวนเต็มที่แทรกควรเลือกในลักษณะที่ความแตกต่างไปข้างหน้าสูงสุดของMจะมีขนาดเล็กที่สุด เราจะเรียกค่านี้ว่า "ความเรียบ" ที่เล็กที่สุด

ความแตกต่างไปข้างหน้าของรายการ-1 3 8 11 15ที่มีและความแตกต่างไปข้างหน้าสูงสุดคือ4 5 3 45

ด้วย2การแทรกความเรียบเนียนของ2 10 15มี4และการส่งออกที่เป็นไปได้มีความแตกต่างไปข้างหน้า2 6 10 11 154 4 1 4

อินพุต

  • kจำนวนเต็มไม่เป็นลบ
  • รายการจำนวนเต็มน้อยไปหามากที่Lมีองค์ประกอบอย่างน้อย 2 รายการ

เอาท์พุต

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

ตัวอย่าง

อินพุต ( k, L) => เอาต์พุตที่เป็นไปได้และความแตกต่างไปข้างหน้าสูงสุด (ซึ่งไม่ได้เป็นส่วนหนึ่งของเอาต์พุต) ในวงเล็บ

0, 10 20 => 10 20 (10)

2, 1 10 => 1 4 7 10 (3)

2, 2 10 15 => 2 6 10 11 15 (4)

3, 2 10 15 => 2 5 8 10 12 15 (3)

5, 1 21 46 => 1 8 15 21 27 33 39 46 (7)

5, 10 20 25 33 => 10 14 18 20 24 25 29 33 (4)

3, 4 4 6 9 11 11 15 16 25 28 36 37 51 61 => 4 4 6 9 11 11 15 16 22 25 28 36 37 45 51 59 61 (8)

15, 156 888 2015 => 156 269 382 495 608 721 834 888 1001 1114 1227 1340 1453 1566 1679 1792 1905 2015 (113)

8, -399 -35 -13 56 157 => -399 -347 -295 -243 -191 -139 -87 -35 -13 39 56 108 157 (52)

5, 3 3 3 => 3 3 3 3 (0)

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ

คำตอบ:


5

Pyth, 28 27 ไบต์

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

อินพุตที่ได้รับเช่น:

3
[2, 10, 15]

สาธิต. สายรัดทดสอบ

หมายเหตุ: ในเวลาที่ถามคำถามมีข้อบกพร่องเล็กน้อยใน Pyth ที่เกี่ยวข้องกับการใช้rFdภายในuซึ่งฉันเพิ่งแก้ไข ข้อผิดพลาดทำให้ไม่สามารถใช้Fภายในuซึ่งไม่ได้ตั้งใจอย่างแน่นอน

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

                               Implicit:
                               z is the number of insertions, in string form.
                               Q is the input list.
              C,QtQ            Pairs of elements, e.g. [(2, 10), (10, 15)]
           rFd                 d = (a, b) -> range(a, b)
        %hH                    Take every H+1th element of that range
       t                       And throw out the first one.
      m                        Perform this process for each element pair
     s                         And combine the results into one list.

                               The above is a minimal set of additional elements
                               To reduce the maximal difference to H+1.

  u                     hvz    Repeat until the result stops changing, where
                               the prior result is G, H starts at 0 and
                               increases by 1 each repetition, and
                               G is initialized to eval(z)+1.
   ?               >GvzG       If not G[eval(z):], return G. In other words,
                               if the prior result was short enough, stop.
                               Also, this is always false on the initial call.
    smt%hHrFdC,QtQ             Otherwise, recalculate with H incremented.
S+Q                            Take the result, add the original list, and sort.

ต่อไปนี้เป็นรุ่นที่ใช้งานร่วมกับล่ามได้ในเวลาที่ถามคำถาม ขนาด 28 ไบต์และทำงานในลักษณะเดียวกัน:

S+Qu?smt%hHr.udC,QtQ>GvzGhvz

สาธิต.

Git กระทำของรุ่นที่เหมาะสม f6b40e62


ฉันไม่เคยคิดที่rF<seq>จะใช้เพื่อคลายทูเปิลสององค์ประกอบ
orlp

@orlp มันเป็นเคล็ดลับที่ดีและฉันใช้มันย้อนกลับไปในวันที่uทำงานแตกต่างกันและeไม่ได้อยู่สั้นกว่าurGHd rhd@d1ฉันจะวางมันลงบนหน้าของ Pyth
isaacg

Uคุณสามารถโกนตัวละครที่คุณไม่จำเป็นต้อง
orlp

@ orlp ขอบคุณ ที่จริงแล้วyvzล้มเหลวเมื่อvz = 0แต่hvzทำเคล็ดลับ
isaacg

เนื่องจากรหัสไม่สามารถใช้งานได้กับรุ่น Pyth ซึ่งมีให้เมื่อถามคำถามฉันเลือกที่จะไม่ยอมรับโซลูชันนี้ หากคุณให้คำตอบที่ไม่พึ่งพาข้อผิดพลาด ping ฉันและฉันจะยอมรับมัน
randomra

8

Python 2, 104

def f(L,k,d=1):
 M=[];p=L[0]
 for x in L:M+=range(p+d,x,d);p=x
 return M[k:]and f(L,k,d+1)or sorted(L+M)

พยายามเพิ่มค่าสูงสุดต่างกันdเริ่มจาก 1 และนับขึ้น เติมช่องว่างของ(p,x)องค์ประกอบต่อเนื่องแต่ละคู่โดยการใส่dหมายเลขทุกช่องว่าง หากMเกินโควต้าที่อนุญาตให้ลองใหม่อีกครั้งเพื่อลองอีกdครั้ง มิฉะนั้นส่งคืนรายการขององค์ประกอบที่เพิ่มและเป็นต้นฉบับเรียงลำดับ

นี่เป็นกรณีทดสอบทั้งหมดโดยไม่ชักช้าบนเครื่องของฉัน


คุณลองอะไรเช่น 1, 1000000000
edc65

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