กำหนดหุบเขาที่กว้างที่สุด


12

ลองนึกภาพเราจะได้ชิ้นส่วนของภูเขาบางส่วนซึ่งจะส่งผลให้มีรูปร่างคล้ายกับนี้:

4                   _
3   _    _       __/ \
2  / \__/ \    _/     \_   /
1 /        \  /         \_/
0           \/
  12322223210012233343221112

อย่างที่เราเห็นเราสามารถแสดงสิ่งนี้ (ในระดับหนึ่ง) ด้วยลำดับของจำนวนเต็ม

สำหรับจุดประสงค์ของการท้าทายนี้เราให้คำจำกัดความว่าหุบเขาเป็นส่วนประกอบที่ต่อเนื่องกันซึ่งค่าเริ่มต้นลดลงและจากจุดหนึ่งที่เพิ่มขึ้น เป็นทางการมากขึ้นสำหรับลำดับ(ai)i=1n a หุบเขาจะเป็นดัชนี1s<r<tnซึ่งมีดังต่อไปนี้:

  • จุดเริ่มต้นและจุดสิ้นสุดของหุบเขาเหมือนกัน: as=at
  • หุบเขาเริ่มต้นและสิ้นสุดในครั้งเดียวในภูมิภาคที่ได้รับต่ำ: s > s + 1T - 1 < ทีas>as+1at1<at
  • หุบเขาไม่แบน: sRRทีasararat
  • หุบเขาแรกลดลง: i[s,r):aiai+1
  • j[r,t):ajaj+1

[s,t]ts+1

ท้าทาย

ให้โปรไฟล์ความสูง (ลำดับของจำนวนเต็มไม่เป็นลบ) งานของคุณคือกำหนดความกว้างของหุบเขาที่กว้างที่สุด

ตัวอย่าง

ด้วยโปรไฟล์ความสูง[1,2,3,2,2,2,2,3,2,1,0,0,1,2,2,3,3,3,4,3,2,2,1,1,1,2]เราสามารถเห็นภาพได้เหมือนเมื่อก่อน:

4                   _
3   _    _       __/ \
2  / \__/ \    _/     \_   /
1 /        \  /         \_/
0           \/
  12322223210012233343221112
    aaaaaa             ccccc
         bbbbbbbbb

[3,2,1,0,0,1,2,2,3]343

9

กฎระเบียบ

  • ข้อมูลที่ป้อนจะเป็นลำดับของจำนวนเต็มแบบไม่ลบ (คนขออภัยชาวดัตช์)
    • คุณสามารถสันนิษฐานได้ว่ามีอย่างน้อยหนึ่งหุบเขา
  • ผลผลิตจะเป็นขนาดของหุบเขาที่กว้างที่สุดตามที่กำหนดไว้ด้านบน

Testcases

[4,0,4] -> 3
[1,0,1,0,1] -> 3
[1,0,2,0,1,2] -> 4
[13,13,13,2,2,1,0,1,14,2,13,14] -> 4
[1,2,3,2,2,2,2,3,2,1,0,0,1,2,2,3,3,3,4,3,2,2,1,1,1,2] -> 9
[3,2,0,1,0,0,1,3] -> 4

2
กรณีทดสอบ: [3,2,0,1,0,0,1,3]. คำตอบปัจจุบันทั้งหมดส่งคืน 8 ตามนิยามของคุณฉันเชื่อว่าควรเป็น 4
Zgarb

ความลาดชันของภูเขาจะสูงกว่า 1 หรือไม่ (เช่น[3,1,2,3])
Doorknob

@Zgarb: ถูกต้องใช่ ฉันเพิ่มลงใน testcase
ბიმო

@ Doorknob: ไม่มีอะไรที่ป้องกันได้ใช่ ตัวอย่างเช่น[4,0,4]จะเป็นกรณีดังกล่าว
ბიმო

1
"การป้อนข้อมูลจะเป็นลำดับของจำนวนเต็มแบบไม่ลบ (ขออภัยชาวดัตช์) " Lol ในฐานะชาวดัตช์ที่ฉันหัวเราะคิกคักเมื่อฉันอ่านสิ่งนี้ ;)
Kevin Cruijssen

คำตอบ:


3

เยลลี่ 15 ไบต์

ẆµIṠḟ0ṢƑaMIḢ)Ṁ‘

ลองออนไลน์!

หรือดูชุดทดสอบ (เพิ่มอีกสองกรณีทดสอบซึ่งฉันทำไม่สำเร็จ)

อย่างไร?

ẆµIṠḟ0ṢƑaMIḢ)Ṁ‘ - Link: list of integers
Ẇ               - all contiguous substrings
 µ          )   - for each substring, X:
  I             -   deltas
   Ṡ            -   sign (-ve:-1, 0:0, +ve:1)
    ḟ0          -   filter out zeros
       Ƒ        -   is invariant under:
      Ṣ         -     sort
         M      -   get maximal indices of X
        a       -   (vectorising) logical AND
          I     -   deltas
           Ḣ    -   head
             Ṁ  - maximum
              ‘ - increment

3

JavaScript (ES6), 111 108 99 97 ไบต์

a=>a.map(o=(p,x)=>a.some(P=q=>(~x?x<0?i?q<P:q>P&&i++:i=0:q>=p)||(o=o<--x|q==P|q-p?o:x,P=q,0)))|-o

ลองออนไลน์!

แสดงความคิดเห็น

a =>                        // a[] = input array
  a.map(o =                 // initialize the output o to a non-numeric value
    (p, x) =>               // for each value p at position x in a[]:
    a.some(P =              //   initialize P to a non-numeric value
      q =>                  //   for each value q in a[]:
      (                     //     exit if something goes wrong:
        ~x ?                //       if x is not equal to -1:
          x < 0 ?           //         if x is negative:
            i ?             //           if we're in the increasing part:
              q < P         //             exit if q is less than P
            :               //           else:
              q > P && i++  //             increment i if q is greater than P
          :                 //         else:
            i = 0           //           initialize i to 0 (decreasing part)
        :                   //       else:
          q >= p            //         exit if q is greater than or equal to p
      ) || (                //     if we didn't exit:
        o =                 //       update the output o:
          o < --x |         //         decrement x; if o is less than x
          q == P |          //         or the last value is equal to the previous one
          q - p ?           //         or the last value is not equal to the first one
            o               //           leave o unchanged
          :                 //         else:
            x,              //           update o to x
        P = q,              //       update the previous value P to q
        0                   //       force this iteration to succeed
      )                     //
    )                       //   end of some()
  ) | -o                    // end of map(); return -o


1

เรติน่า 0.8.2 , 77 ไบต์

\d+
$*
M&!`\b(1+),((?!\1)(?!1+\2)1*,)+((?!\1)1*(?(3)\3|\2))*\1\b
1

O^`
\G,|$

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

\d+
$*

แปลงเป็นเอก

M&!`

ทำรายการแทนที่จะจับคู่ซ้อนทับกัน

\b(1+),

จุดเริ่มต้นของหุบเขาถูกจับเข้า\1มา สิ่งนี้จะต้องไม่ตรงกันอีกจนกว่าจะสิ้นสุด เนื่องจากเราไม่จับเครื่องหมายจุลภาคนี่จึงป้องกันค่าที่สูงกว่าจากการจับคู่

((?!\1)(?!1+\2)1*,)+

จับคู่กับค่าที่ลดลง การ(?!1+\2)ป้องกันการผ่านใด ๆ ผ่านการวนซ้ำนั้นใหญ่กว่าครั้งก่อน ( \2ไม่ได้ตั้งค่าครั้งแรกผ่านดังนั้นจึงไม่สามารถจับคู่ได้เล็กน้อย) การดักจับรวมเครื่องหมายจุลภาคต่อท้ายเหมือนนักกอล์ฟ

((?!\1)1*(?(3)\3|\2))*

จับคู่กับค่าที่เพิ่มขึ้น เวลานี้((?3)\3|\2)หมายความว่าการแข่งขันแต่ละรายการต้องมีอย่างน้อยตราบใดที่ค่าก่อนหน้าหรือการจับครั้งสุดท้ายลดลงเป็นครั้งแรกผ่านลูป

\1\b

ในที่สุดจุดจบของหุบเขาจะต้องมีความสูงเท่ากับจุดเริ่มต้น

1

ลบความสูงออกจากเครื่องหมายจุลภาค (วิธีนี้ง่ายกว่าการนับความสูงเล็กน้อยเนื่องจากบางอันอาจเป็นศูนย์)

O^`

เรียงลำดับแบบย้อนกลับคือจุลภาคส่วนใหญ่ก่อน

\G,|$

นับจำนวนเครื่องหมายจุลภาคในบรรทัดแรกบวกหนึ่ง


1

Husk , 13 ไบต์

→▲mΓ€fȯΛEtġ≤Q

ลองออนไลน์!

คำอธิบาย

ผมใช้อัลกอริทึมที่คล้ายกันเป็นโจนาธานอัลลัน

→▲mΓ€fȯΛEtġ≤Q  Input is a list, say [3,1,0,1,1,0,2,3]
            Q  Nonempty slices: [[3],[1],[3,1],[0],...,[3,1,0,1,1,0,2,3]]
     f         Keep those that satisfy this:
                Argument is a slice, say [3,1,0,1,1,0,2]
          ġ≤    Cut into non-increasing pieces: [[3,1,0],[1,1,0],[2]]
         t      Drop first piece: [[1,1,0],[2]]
      ȯΛ        Each remaining piece
        E       has all elements equal: false, [1,1,0] has different elements
  m            Map over remaining slices:
                Argument is a slice, say [1,0,1,1]
   Γ            Break into head 1 and tail [0,1,1]
    €           Index of first occurrence of head in tail: 2
 ▲             Maximum: 2
→              Increment: 3

0

Japt , 31 ไบต์

¡ãYÄÃrc k_ò< Åd_äa x}îbZvÃrÔ+2

ลองออนไลน์!

บันทึก 10 ไบต์โดยรับแรงบันดาลใจจากคำตอบ Husk ของ Zgarb ฉันยังคิดว่าสิ่งนี้สามารถปรับปรุงได้ แต่ฉันยังไม่พบ

คำอธิบาย:

¡ãYÄÃrc                            Get all segments
        k_           Ã             Remove ones where:
          ò<                        A non-increasing sub-segment
             Å                      Other than the first one
              d_äa x}               Has different heights
                      ®   Ã        For each remaining segment:
                       bZv          Get the second index of the first character
                           rÔ      Maximum
                             +2    Increase by 2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.