แยก Local Maxima


19

ให้อาร์เรย์ของจำนวนเต็มบวกส่งออกอาร์เรย์ขององค์ประกอบทั้งหมดที่มากกว่าหรือเท่ากับที่อยู่ติดกัน องค์ประกอบส่วนใหญ่จะมีสององค์ประกอบที่อยู่ติดกัน องค์ประกอบแรกและสุดท้ายเป็นกรณีพิเศษเนื่องจากพวกเขามีเพียงหนึ่งองค์ประกอบที่อยู่ติดกัน

คุณอาจคิดว่าอาเรย์นั้นมีองค์ประกอบอย่างน้อยสององค์ประกอบ

กรณีทดสอบ:

Input               | Output
[4,2,6,12,4,5,4,3]  | [4,12,5]
[1,2]               | [2]
[1,2,3,2,1]         | [3]
[3,2,1,2,3]         | [3,3]
[4,4]               | [4,4]
[2,4,4,4,1]         | [4,4,4]
[2,3,3,4]           | [3,4]
[4,3,3,4]           | [4,4]

นี่คือรหัสที่สั้นที่สุดชนะ!


1
@PeterTaylor ฉันคิดว่าสิ่งที่หมายถึงคือ "สำหรับองค์ประกอบแรกหรือครั้งสุดท้ายที่จะรวมอยู่ในการส่งออก ... "
xnor

@PeterTaylor xnor ถูกต้อง
Pavel


ที่เกี่ยวข้องเพิ่มเติม: การค้นหา Local Extremes
Wrzlprmft

ฉันขอเสนอ[4,3,3,4]เป็นตู้เก็บของได้ไหม ทางออกของฉันไม่ได้จัดการอย่างใดอย่างหนึ่งที่น่าเศร้ามาก
JAD

คำตอบ:


5

เยลลี่ ,  13 12  11 ไบต์

0;;0»3\f"⁸Ẏ

ลิงก์ monadic ที่รับรายการจำนวนเต็มบวกและส่งคืนรายการที่กรองที่มีเฉพาะค่าที่มากกว่าหรือเท่ากับเพื่อนบ้านทั้งหมด

ลองออนไลน์!


12 byterก่อนหน้า:

0;INżI>0ḄNMị

13 byterก่อนหน้า:

0;;0ṡ3M€ċ€2Tị

อย่างไร?

0;;0»3\f"⁸Ẏ - Link: list of positive integers, A
0;          - a zero concatenated with A
  ;0        - concatenate a zero
     3\     - 3-wise reduce with:
    »       -   maximum (yields a list of the maximums in each overlapping window of 3)
         ⁸  - chain's left argument, A
        "   - zip with:
       f    -   filter keep (i.e. keep the maximal if it is [in] the [length 1 list 
            -                     of the] respective original element)
          Ẏ - flatten by one level

ฉันคิดว่าอาจจะมีวิธีที่จะใช้การลดแบบ 3-wise แต่ฉันยังไม่ได้ผล
Jonathan Allan

ฉันถูกต้อง - การลด 3 ครั้งพร้อมกับจำนวนสูงสุด»- ประมาณ 10 เท่า ..
Jonathan Allan



6

Haskell, 50 49 42 ไบต์

f l=[j|i:j:k:_<-scanr(:)[0]$0:l,k<=j,i<=j]

ลองออนไลน์!

scanr(:)[0]ทำให้รายการของหางที่(0:l)แต่ละคนมีเป็นครั้งสุดท้าย0เช่นการl = [4,3,3,4]: [[0,4,3,3,4,0],[4,3,3,4,0],[3,3,4,0],[3,4,0],[4,0],[0]]ซึ่งเป็นรูปแบบการจับคู่ agains i:j:k:_ที่จะดึงรายการทั้งหมดที่มีอย่างน้อย 3 องค์ประกอบที่จะถูกตั้งชื่อi, และj kเก็บjถ้า> = และij

แก้ไข: Ørjan Johansen บันทึกแล้ว 7 ไบต์ ขอบคุณ!


2
i:j:k:_<-scanr(:)[0]$0:lสั้นกว่า (ปรับtails=scanr(:)[]เคล็ดลับ"มาตรฐาน" เล็กน้อย)
Ørjan Johansen

@ ØrjanJohansen: โอ้ฉันเคยใช้เคล็ดลับนั้นก่อนหน้าตัวเอง แต่ก็พลาดที่นี่ ขอบคุณมาก!
nimi

4

Dyalog APL, 31 30 28 22 21bytes

{⍵/⍨(⌈/=2⌷⊢)¨3,/∊0⍵0}

ลองออนไลน์!

คำอธิบาย (ฉันไม่เก่งในการอธิบายสิ่งต่าง ๆ ):

0⍵0       - [0,input,0]   (it looks like a face!)
∊         - flatten
3,/       - split into overlapping sections of length 3.
(⌈/=2⌷⊢)¨ - Whether the middle element is the maximum (applied to every section)
⍵/⍨       - index





2

05AB1E , 15  14  13 ไบต์

ü‹0¸«sĆÁü›+_Ï

ลองออนไลน์!

คำอธิบาย

ü‹             # pairwise comparison for less than
  0¸«          # append 0
     s         # swap input to top of stack
      Ć        # enclose, append the head of the list
       Á       # rotate right
        ü›     # pairwise comparison for greater than
          +    # add the two boolean lists
           _   # logical negate
            Ï  # keep only elements of input that are true in the resulting list

โซลูชัน 15 ไบต์ก่อนหน้า

¬s¤)˜Œ3ùεZQ1è}Ï

ลองออนไลน์!

คำอธิบาย

¬                # get head of input
 s¤              # get tail of input
   )˜            # wrap stack in flattened list
                 # produces the input list with the first and last element duplicated
     Œ3ù         # push sublists of length 3
        ε        # apply transformation on each triple
         ZQ      # ... check each element for equality to the max
          1è     # ... get the middle element
            }    # end transform
             Ï   # keep only elements of input that are true in the resulting list

2

R, 44 ไบต์

pryr::f(x[(x>=c(0,x)&x>=x[-1])[1:sum(x|1)]])

ซึ่งประเมินการทำงาน:

function (x) 
x[(x >= c(0, x) & x >= x[-1])[1:sum(x | 1)]]

เปรียบเทียบxกับc(0,x)ดังนั้นด้วยการxเลื่อนตำแหน่งหนึ่งไปทางขวา เปรียบเทียบxกับx[-1]อีกตำแหน่งหนึ่งจึงเลื่อนไปทางซ้าย ทั้งสองอย่างนี้TRUEถ้ามีจำนวนสูงสุด &เพื่อรับและของ booleans เหล่านี้ เพราะธรรมชาติของการตัดของเวกเตอร์ R เมื่อพวกเขาไม่ได้เป็นระยะเวลาเดียวกันเราจะต้องตัดทอนผลที่ความยาวของซึ่งพบได้โดยการx sum(x|1)จากนั้นเราเสียบบูลีนเวกเตอร์โดยดูเฉพาะดัชนีที่แท้จริงของxและคืนค่านั้น

หมายเหตุเนื่องจากการดำเนินการเชิงตรรกะเหล่านี้ทำกับเวกเตอร์ที่มีความยาวไม่เท่ากัน R จะบ่น มาก. แต่ผลลัพธ์ที่ถูกต้องจะอยู่ที่นั่นท่ามกลางคำเตือน:

> pryr::f(x[(x>=c(0,x)&x>=x[-1])[1:sum(x|1)]])(c(4,2,6,12,4,5,4,3))
[1]  4 12  5
Warning messages:
1: In x >= c(0, x) :
  longer object length is not a multiple of shorter object length
2: In x >= x[-1] :
  longer object length is not a multiple of shorter object length
3: In x >= c(0, x) & x >= x[-1] :
  longer object length is not a multiple of shorter object length

2

R , 42 ไบต์

function(x)x[c(d<-diff(x),0)<=0&c(0,d)>=0]

ลองออนไลน์!

2 ไบต์สั้นกว่าการแก้ปัญหา JAD ของ diffคำนวณความแตกต่างอย่างต่อเนื่อง จากนั้นเก็บเฉพาะรายการที่มากกว่าเพื่อนบ้านทั้งสอง



1

R , 68 ไบต์

function(a)a[a==sapply(1:length(a),function(i)max(c(0,a,0)[i+0:2]))]

ลองออนไลน์!


pryr::f(expression)function(a)expressionเป็นวิธีที่สั้นกว่าจะประกาศฟังก์ชั่นกว่า
JAD

นอกจากนี้ยังเป็นทางลัดสำหรับsum(a|1) length(a)
JAD

ดูโซลูชันของฉันสำหรับวิธีการที่สั้นกว่า
JAD



1

q, 39 ไบต์

{x where x = -1 _ next 3 mmax x,last x}

ฉันไม่เคยได้ยินภาษานี้มาก่อน คุณรู้ทุกที่ฉันสามารถลองหรือดาวน์โหลดได้หรือไม่
Pavel

แน่นอนว่าkx.com , docs: code.kx.com
skeevey

1

Stax , 10 ไบต์

úâH◄(☼bM•Å

เรียกใช้และแก้ไขข้อบกพร่อง

มันสร้างผลลัพธ์เป็นค่าที่คั่นบรรทัดขึ้นบรรทัดใหม่ในเอาต์พุตมาตรฐาน

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

f       filter each value in input using the rest of the program; implicitly printing kept values
  x0|S  input pre- and post-pended with zero
  3B    split into batches of 3
  i@    get the i-th batch, where i is the iteration index
  |M=   is the current value equal to the max from the batch?

เรียกใช้อันนี้

Updated:เพิ่งพบโซลูชันขนาด 9 ไบต์ จะอัปเดตคำอธิบายในภายหลัง:

Stax , 9 ไบต์

▀▓ûa¥╓╧↨⌐

เรียกใช้และแก้ไขข้อบกพร่อง


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