การทำงานสูงสุดระหว่างองค์ประกอบที่เหมือนกัน


24

นี่คือการยกเครื่องคำถามลบตอนนี้โดยเท่ง หาก OP ของคำถามนั้นต้องการกู้คืนคำถามนี้หรือมีปัญหากับฉันที่โพสต์สิ่งนี้ฉันยินดีที่จะรองรับ

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

[1, 2, -2, 4, 1, 4]

มีรายการย่อยอย่างต่อเนื่อง 2 รายการที่ต่างกันเริ่มต้นและสิ้นสุดด้วยค่าเดียวกัน

[1,2,-2,4,1] -> 6
[4,1,4]      -> 9

ผลรวมที่ใหญ่กว่าคือ 9 ดังนั้นคุณจึงเอาต์พุต 9

คุณอาจสันนิษฐานว่าทุกอินพุตมีซ้ำอย่างน้อย 1 รายการ

นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์น้อยกว่าจะดีกว่า

กรณีทดสอบ

[1,2,-2,4,1,4]  -> 9
[1,2,1,2]       -> 5
[-1,-2,-1,-2]   -> -4
[1,1,1,8,-1,8]  -> 15
[1,1,1,-1,6,-1] -> 4
[2,8,2,-3,2]    -> 12
[1,1,80]        -> 2
[2,8,2,3,2]     -> 17

ควร[2,8,2,3,2]เป็น 12 หรือ 17 ฉันเข้าใจว่า 17.
NikoNyrh

@NikoNyrh มันควรจะเป็น 17
ตัวช่วยสร้างข้าวสาลี

ไชโยสำหรับ CC BY / SA คุณมีสิทธิ์ที่จะโพสต์คำถามอนุพันธ์ของคำถามอื่นแม้ว่ามันจะถูกตั้งค่าสถานะล่อโดยสมาชิกชุมชน ดูเหมือนว่าคุณควรเพิ่มลิงค์ไปยังหน้าของ OPเมื่อฉันได้รับจากโพสต์บล็อกนี้ "3. แสดงชื่อผู้แต่งสำหรับทุกคำถามและคำตอบ [... ] 4. เชื่อมโยงหลายมิติชื่อผู้แต่งโดยตรงกลับไปที่หน้าโปรไฟล์ผู้ใช้ของพวกเขาในเว็บไซต์ต้นทาง" - ฉันไม่มีสิทธิ์ดูคำถามที่ถูกลบดังนั้นฉันจึงไม่ ไม่รู้ว่าใครเป็นคนทำต้นแบบ
Mindwin

@Mindwin ขอบคุณฉันได้เพิ่มลิงค์ไปยังหน้าของ OP ฉันทิ้งไว้ แต่เดิมเพราะฉันคิดว่าถ้า OP ลบโพสต์ของพวกเขาพวกเขาอาจต้องการหลีกเลี่ยงการเชื่อมโยงกับคำถาม
ข้าวสาลีตัวช่วยสร้าง

สาเหตุของการลบนั้นไม่เกี่ยวข้องและไม่โปร่งใสสำหรับผู้ใช้ทั่วไป (ฉัน) แต่การระบุแหล่งที่มาเป็นประเภทที่ไม่เข้าร่วม โดยการส่งและยอมรับใบอนุญาตที่พวกเขาให้เราสิทธิ์เหล่านั้นภายใต้เงื่อนไขเหล่านั้น สิ่งที่อยู่ข้างนอกมันเป็นข้อยกเว้น จีเจ
Mindwin

คำตอบ:


9

Haskell , 62 ไบต์

f รับรายการจำนวนเต็มและคืนค่าจำนวนเต็ม

f l=maximum[x+sum m-sum n|x:m<-t l,y:n<-t m,x==y]
t=scanr(:)[]

ลองออนไลน์!

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

  • tเป็นData.List.tailsฟังก์ชัน"รับส่วนต่อท้ายทั้งหมดของรายการโดยไม่ต้องนำเข้า"
  • ในf lการ iterates รายการความเข้าใจผ่านทุกคำต่อท้ายไม่ว่างเปล่าของรายการอาร์กิวเมนต์lกับองค์ประกอบแรกและส่วนที่เหลือxm
  • สำหรับแต่ละที่มันไม่เหมือนกันสำหรับคำต่อท้ายว่างทั้งหมดของmการเลือกองค์ประกอบแรกและส่วนที่เหลือyn
  • ถ้าxและyเท่ากันความเข้าใจในรายการรวมถึงผลรวมขององค์ประกอบระหว่างพวกเขา รายการย่อยนี้เป็นเช่นเดียวกับx:mมีคำต่อท้ายของถอดดังนั้นผลรวมสามารถคำนวณได้nx+sum m-sum n

8

JavaScript (ES6), 68 62 ไบต์

a=>a.map(m=(x,i)=>a.map((y,j)=>m=j<=i||(x+=y)<m|y-a[i]?m:x))|m

กรณีทดสอบ

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

a =>                    // a = input array
  a.map(m =             // initialize m to a function (gives NaN in arithmetic operations)
    (x, i) =>           // for each entry x at position i in a:
    a.map((y, j) =>     //   for each entry y at position j in a:
      m =               //     update m:
        j <= i ||       //       if j is not after i
        (x += y) < m |  //       or the sum x, once updated, is less than m
        y - a[i] ?      //       or the current entry is not equal to the reference entry:
          m             //         let m unchanged
        :               //       else:
          x             //         update m to the current sum
    )                   //   end of inner map()
  ) | m                 // end of outer map(); return m

ผมสับสนเล็กน้อยโดยการสั่งซื้อของy - a[i]และ(x += y) < m- IMHO (x += y) < m || y != a[i]รหัสจะเล็กน้อยชัดเจนกับพวกเขาแลกเปลี่ยนตั้งแต่นั้นมาก็มีลักษณะเหมือนกอล์ฟอย่างง่ายจาก
Neil

@ ไม่มีฉันเห็นจุดของคุณ แต่(x+=y)<m|y-a[i]อาจตีความผิด(x+=y)<(m|y-a[i])เช่นกัน ฉันไม่แน่ใจว่ามันจะกำจัดความคลุมเครือจริง ๆ (แก้ไขต่อไปเพราะฉันมักจะชอบรุ่นนี้)
Arnauld

ทีนี้สมมุติว่าพวกเขาจะไม่ตีความผิดy-a[i]|(x+=y)<mว่า(y-a[i]|(x+=y))<m...
Neil

5

เยลลี่ 12 ไบต์

ĠŒc€Ẏr/€ịḅ1Ṁ

ลองออนไลน์!

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

ĠŒc€Ẏr/€ịḅ1Ṁ  Main link. Argument: A (array)

Ġ             Group the indices of A by their corresponding values.
 Œc€          Take all 2-combinations of grouped indices.
    Ẏ         Dumps all pairs into a single array.
     r/€      Reduce each pair by range, mapping [i, j] to [i, ..., j].
        ị     Index into A.
         ḅ1   Convert each resulting vector from base 1 to integer, effectively
              summing its coordinates.
           Ṁ  Take the maximum.

5

Huskขนาด 10 ไบต์

▲mΣfΓ~€;ṫQ

ลองออนไลน์!

คำอธิบาย

▲mΣfΓ~€;ṫQ  Input is a list, say x=[1,2,-2,4,1,4]
         Q  Slices: [[1],[2],[1,2],..,[1,2,-2,4,1,4]]
   f        Keep those that satisfy this:
    Γ        Deconstruct into head and tail, for example h=2 and t=[-2,4,1]
        ;    Wrap h: [2]
      ~€     Is it an element of
         ṫ   Tails of t: [[-2,4,1],[4,1],[1]]
            Result: [[1,2,-2,4,1],[4,1,4]]
 mΣ         Map sum: [6,9]
▲           Maximum: 9


3

R , 108 103 90 88 83 ไบต์

function(l)max(combn(seq(l),2,function(x)"if"(rev(p<-l[x[1]:x[2]])-p,-Inf,sum(p))))

ลองออนไลน์!

combnนัดหยุดงานอีกครั้ง! สร้างรายการย่อยทั้งหมดที่มีความยาวอย่างน้อย2ตั้งค่าผลรวมของรายการย่อยเป็น-Infหากรายการแรกและสุดท้ายไม่เท่ากันและรับผลรวมสูงสุดของผลรวมทั้งหมด

สิ่ง"if"นี้จะทำให้เกิดการเตือนขึ้นอย่างมาก แต่พวกมันสามารถเพิกเฉยได้อย่างปลอดภัย - นั่นอาจเป็นเคล็ดลับการเล่นกอล์ฟที่ดีที่สุดที่นี่rev(p)-pคือศูนย์ในองค์ประกอบแรกของ iff p[1]==tail(p,1)และ"if"ใช้องค์ประกอบแรกของสภาพพร้อมคำเตือน




2

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

=ṚṖḢ
ẆÇÐfS€Ṁ

ลองออนไลน์!

หนึ่งไบต์บันทึกโดย Mr. Xcoder ที่กำลังแข่งขันกับฉัน : D

คำอธิบาย:

        # Helper link:
=Ṛ      # Compare each element of the list to the element on the opposite side (comparing the first and last)
  Ṗ     # Pop the last element of the resulting list (so that single elements return falsy)
   Ḣ    # Return the first element of this list (1 if the first and last are equal, 0 otherwise)

        # Main link:
Ẇ       # Return every sublist
 Ç      # Where the helper link
  Ðf    # Returns true (1)
    S€  # Sum each resulting list
      Ṁ # Return the max


1

Pyth, 15 ไบต์

eSsMf&qhTeTtT.:

ลองออนไลน์

คำอธิบาย

eSsMf&qhTeTtT.:
             .:Q  Take all sublists of the (implicit) input.
    f qhTeT       Take the ones that start and end with the same number...
     &     tT     ... and have length at least 2.
  sM              Take the sum of each.
eS                Get the largest.



1

Python 2 , 86 ไบต์

โดดเด่นกว่าเดนนิส

lambda x:max(sum(x[i:j+1])for i,v in enumerate(x)for j in range(i+1,len(x))if v==x[j])

ลองออนไลน์!

สร้างรายการย่อยทั้งหมดที่ใหญ่กว่าความยาว 2 โดยที่องค์ประกอบแรกเท่ากับรายการสุดท้ายจากนั้นจับคู่แต่ละรายการกับผลรวมและเลือกค่าที่มากที่สุด


88 ไบต์โดยใช้ฟังก์ชั่นแลมบ์ดา
Halvard Hummel

@HalvardHummel 86 ไบต์enumerateใช้
Jonathan Frech

Outgolfed โดย Dennis - สุจริตคุณคาดหวังอะไร
Mr. Xcoder

@ Mr.Xcoder ฉันจะได้แก้ปัญหาของเขา แต่ฉันไปนอน :(
FlipTack



1

เยลลี่ 11 ไบต์

ใช้คุณสมบัติบางอย่างที่โพสต์นัดท้าทาย

Ẇµ.ịEȧḊµƇ§Ṁ

ลองออนไลน์!

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

Ẇµ.ịEȧḊµƇ§Ṁ || โปรแกรมเต็มรูปแบบ รับอินพุตจาก CLA เอาต์พุตไปยัง STDOUT
Ẇ || รายการย่อย
 µ µƇ || ตัวกรอง - เก็บสิ่งเหล่านั้น
    ȧḊ || ... ที่มีความยาวอย่างน้อย 2 และ ...
 .ị || ... องค์ประกอบที่พื้น (0.5) และเพดาน (0.5) (แบบแยกส่วนดัชนี 1) ...
    E | | ... เท่าเทียมกัน
         § || สรุปรวมกัน
          Ṁ || สูงสุด.

-1 ด้วยความช่วยเหลือจากCaird


0

แบตช์ 179 ไบต์

@set s=%*
@set/a"m=-1<<30
:l
@set/at=n=%s: =,%
@set s=%s:* =%
@for %%e in (%s%)do @set/at+=%%e&if %%e==%n% set/a"m+=(m-t)*(m-t>>31)
@if not "%s%"=="%s: =%" goto l
@echo %m%

รับอินพุตเป็นพารามิเตอร์บรรทัดคำสั่ง




0

Java 8, 129 ไบต์

a->a.stream().map(b->a.subList(a.indexOf(b),a.lastIndexOf(b)+1).stream().mapToLong(Long::intValue).sum()).reduce(Long::max).get()

สำหรับแต่ละจำนวนเต็มในรายการฟังก์ชั่นพบว่าผลรวมของรายการย่อยที่ใหญ่ที่สุดที่มีการเริ่มต้นและสิ้นสุดX Xจากนั้นจะหาผลรวมสูงสุดตามที่ OP ระบุ


ฉันยังไม่ได้ทดสอบ แต่ดูเหมือนว่าฉันอาจจะล้มเหลวใน[2,8,2,-3,2]กรณีทดสอบและอาจ[1,1,80]เกินไป
Ørjan Johansen

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