อาร์เรย์ย่อยสูงสุด


21

กำหนด "อาเรย์ย่อยสูงสุด" ของอาเรย์ที่กำหนดเป็น "อาเรย์ย่อย (ต่อเนื่อง) ที่มีผลรวมมากที่สุด" หมายเหตุไม่มีข้อกำหนด "ไม่เป็นศูนย์" ผลรวมนั้น

ให้คำอธิบายรหัสของคุณถ้าเป็นไปได้

ตัวอย่างอินพุต 1:

1 2 3 -4 -5 6 7 -8 9 10 -11 -12 -13 14

ตัวอย่างผลลัพธ์ 1: 24

คำอธิบาย 1:
ผลรวมที่ยิ่งใหญ่ที่สุดเกิดจากการตัด6 7 -8 9 10ออกและสรุป

ตัวอย่างอินพุต 2: -1 -2 -3
เอาต์พุตตัวอย่าง 2: 0
คำอธิบาย 2: ง่ายมาก :) subarray ว่างเปล่าคือ "ใหญ่ที่สุด"

ต้องการ:

  • อย่าอ่านอะไรเลยยกเว้น stdin และเอาต์พุตควรไปที่ stdout
  • มาตรฐานช่องโหว่ข้อ จำกัดใช้

อันดับ: โปรแกรมที่สั้นที่สุดชนะการแข่งขันนี้


5
เขียนโปรแกรมที่สั้นที่สุด ฉันขอแนะนำให้ลบข้อกำหนดนี้เนื่องจากต้องการให้เราตรวจสอบทุกโปรแกรมที่เป็นไปได้ในภาษาของเราและตรวจสอบให้แน่ใจว่าเราใช้โปรแกรมสั้นที่สุด
Okx

ข้อกำหนดที่ 2 ก็ไม่ชัดเจนเช่นกัน มันหมายถึงห้องสมุด? ห้องสมุดที่กำหนดเอง? จ้างโปรแกรมหรือไม่ หลังถูกห้ามโดยช่องโหว่มาตรฐาน
Leun Nun

14
อย่าอ่านอะไรนอกจาก stdin และอย่าเขียนไปที่ใดนอกจาก stdout - ทำไม
Mr. Xcoder

2
คล้ายกันมากอาจเป็นล่อ นอกจากนี้ยังคล้ายกันมาก
xnor

คำตอบ:



6

Python 3 , 61 ไบต์

a=b=0
for x in eval(input()):a=max(x,a+x);b=max(a,b)
print(b)

ลองออนไลน์!

ขั้นตอนวิธีการขโมยมาจากวิกิพีเดีย


3
นี่จะสั้นกว่าขนาด 7 ไบต์ใน Python 2 (ในกรณีที่คุณยังใช้ภาษาโบราณอยู่)
Mr. Xcoder

4

Pyth , 8 ไบต์

eS+0sM.:

ลองออนไลน์!


อย่างไร?

eS + 0sM: Q - Q หมายถึงอินพุต สมมุติว่ามันเป็น [-1, -2, -3]

      .: - รายการย่อยที่ไม่ว่างที่อยู่ติดกันทั้งหมด เรามี [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]]
    sM - รับผลรวมของแต่ละรายการย่อย [-1, -2, -3, -3, -5, -6]
  +0 - ผนวก 0 เข้ากับรายการผลรวม [0, -1, -2, -3, -3, -5, -6]
eS - องค์ประกอบสูงสุด S ให้เรา [-6, -5, -3, -3, -2, -1, 0], ในขณะที่ e ส่งคืน 0 องค์ประกอบสุดท้าย

4

05AB1E , 4 ไบต์

Ό0M

ลองออนไลน์!

-1 ขอบคุณที่Adnan


เคล็ดลับเช่นเดียวกับคำตอบของ Okx: ÎŒOMควรใช้งานได้ 4 ไบต์
Adnan

@Adnan ขอบคุณฉันคิดว่ามีเพียง "1 และอินพุต" ในตัว ... รอ ... ใช่ไหม พวกเขาไม่ควรจะตัดแบ่งหรือบางสิ่งบางอย่าง?
Erik the Outgolfer

ไม่Mค้นหาหมายเลขที่มากที่สุดในรุ่นที่แบนของสแต็ก
Adnan

@Adnan ok ... นี่เป็นข่าวสำหรับฉัน lol
Erik the Outgolfer


3

C ++, 197 195 187 bytes

-10 ไบต์ขอบคุณZacharý

#include<vector>
#include<numeric>
int f(std::vector<int>v){int i=0,j,t,r=0;for(;i<v.size();++i)for(j=i;j<v.size();++j){t=std::accumulate(v.begin()+i,v.begin()+j,0);if(t>r)r=t;}return r;}

คุณสามารถลบวงเล็บปีกกาหลังจากวงแรกหรือไม่?
Zacharý

นอกจากนี้ทำไมคุณมีlและยังhไง?
Zacharý

@ Zacharý l และ h ใช้สำหรับดัชนีเริ่มต้นและจุดสิ้นสุดของอาร์เรย์ย่อย
HatsuPointerKun

3

R , 54 ไบต์

a=b=0;for(x in scan()){a=max(x,a+x);b=max(a,b)};cat(b)

ลองออนไลน์!

อัลกอริทึมที่นำมาจาก: ปัญหา Subarray สูงสุด

R , 65 ไบต์

y=seq(x<-scan());m=0;for(i in y)for(j in y)m=max(m,sum(x[i:j]));m

ลองออนไลน์!

  • อ่านxจาก stdin
  • ตั้งเป็นดัชนีของyx
  • ทำซ้ำสองครั้งในทุกชุดย่อยที่ไม่เป็นไปได้
  • เปรียบเทียบผลรวมของชุดย่อยกับm(เริ่มแรกm=0)
  • mเก็บค่าสูงสุด
  • mพิมพ์ค่าของ

R , 72 ไบต์

n=length(x<-scan());m=0;for(i in 1:n)for(j in i:n)m=max(m,sum(x[i:j]));m

ลองออนไลน์!

  • อ่านxจาก stdin
  • ทำการค้นหาอย่างเต็มรูปแบบผ่านชุดย่อยที่ไม่ได้เป็นไปได้ทั้งหมด
  • เปรียบเทียบผลรวมของชุดย่อยกับm(เริ่มแรกm=0)
  • mเก็บค่าสูงสุด
  • mพิมพ์ค่าของ

แนวคิดที่ไม่ประสบความสำเร็จอื่น ๆ

58 ไบต์

Reduce(max,lapply(lapply(seq(x<-scan()),tail,x=x),cumsum))

63 ไบต์

Reduce(max,lapply(seq(x<-scan()),function(i)cumsum(tail(x,i))))

72 ไบต์

m=matrix(x<-scan(),n<-length(x),n);max(apply(m*lower.tri(m,T),2,cumsum))

1
a=b=0ทำงานเกินไป นอกจากนี้คุณต้องจัดการกับการพิมพ์ของผลลัพธ์ เมื่อรันเป็นโปรแกรมแบบเต็ม (ผ่านsource) สิ่งนี้จะไม่พิมพ์อะไรเลย
JAD

@ JarkoDubbeldam ฉันได้เพิ่มcat(b)แต่ถ้ามีที่มาecho=TRUEก็เพียงพอที่จะโทรbหางานพิมพ์
djhurio

ฉันเดาว่าไม่มีคำจำกัดความที่ชัดเจนเกี่ยวกับวิธีการทำงานของโปรแกรมแบบเต็มใน R มี rscript ใน commandline และแหล่งที่มาใน R เอง แต่มักจะมีการตั้งค่าสถานะที่จำเป็นเมื่อเรียกใช้สคริปต์รวมอยู่ใน bytecount (ฉันไม่ได้จัดการส่วนตัวเพื่อให้ rscript ทำงานได้ดีกับการสแกน แต่นั่นก็เป็นอีกเรื่องหนึ่ง
JAD

คุณสามารถใช้T=Fแทนa=b=0เพื่อประหยัดไบต์ที่สองเพราะmaxจะบีบบังคับไปb numeric
Giuseppe

3

Haskell , 28 ไบต์

maximum.scanl((max<*>).(+))0

ลองออนไลน์!


ค่าสูงสุดจะไม่ใช่องค์ประกอบสุดท้ายในผลลัพธ์ที่ส่งคืนมาเสมอscanlหรือไม่ งั้นfoldl((max<*>).(+))0เหรอ?
matthias

NVM ฉันเห็นความผิดพลาดของฉัน!
matthias

@matthias หากคุณเห็นประวัติการแก้ไขคุณจะเห็นว่าฉันทำผิดพลาด sma :-)
H.PWiz



2

Haskell , 41 33 ไบต์

import Data.List
g=maximum.concatMap(map sum.inits).tails
maximum.(scanl(+)0=<<).scanr(:)[]

ลองออนไลน์! ขอบคุณ Laikoni


1
g=ฟังก์ชั่นที่ไม่ระบุชื่อจะได้รับอนุญาตการส่งเพื่อให้คุณสามารถวาง แทนที่จะconcatMapใช้=<<จากรายการ monad: ลองออนไลน์! (33 ไบต์)
Laikoni

1

Japt , 11 ไบต์

£ãY mxÃc rw

ลองออนไลน์!

คำอธิบาย

£ãY mxÃc rw
m@ãY mx} c rw   // Ungolfed
m@     }        // Map the input array by the following function, with Y=index
  ãY            //   Get all subsections in input array length Y
     mx         //   Sum each subsection
         c rw   // Flatten and get max

วิธีอื่น 11 ไบต์

จาก @ETHproductions ขึ้นอยู่กับสัตว์เดรัจฉานกองกำลังคำตอบแกลบ

£sY å+Ãc rw

รับค่า tails ทั้งหมดของอาร์เรย์อินพุทและผลรวมสะสมแต่ละอัน จากนั้นแผ่อาร์เรย์และรับค่าสูงสุด

ลองออนไลน์!


ดีมากดีจริงๆ ฉันไม่ได้พยายามที่จะใช้ความท้าทายนี้เมื่อฉันเห็นมันก่อนหน้านี้ แต่ฉันคิดว่าเทคนิคที่แตกต่างและคาดว่ามันจะออกมาประมาณ 15 ไบต์ดังนั้นนี่เป็นสิ่งที่ดีมาก
ETHproductions

ดูคำตอบ Husk มีวิธีที่มีประสิทธิภาพอีก: £sY å+Ãc rw(11 ไบต์เช่นกัน)
ETHproductions

@ ETHproductions สวยดีฉันจะเพิ่มคำตอบนี้เป็นวิธีอื่น อาจจะได้รับการปรับปรุงให้ดีขึ้นด้วยการรวมกันของการลด / concat บางอย่างเช่น Husk ตอบว่า?
Justin Mariner

1

Ruby, 61 59 57 ไบต์

ฉันเพิ่งเริ่มเรียนรู้ทับทิมดังนั้นนี่คือสิ่งที่ฉันคิดขึ้นมา

s=0
p [gets.split.map{|i|s=[j=i.to_i,s+j].max}.max,0].max

ฉันเห็นอัลกอริทึมนี้เป็นครั้งแรกในหนังสือภาษาฟินแลนด์ที่ยังไม่เสร็จเล่มนี้ อธิบายได้ดีมากในหน้า 23

ลองออนไลน์!


1

JavaScript ขนาด 58 ไบต์

m=Math.max;x=y=>eval("a=b=0;for(k of y)b=m(a=m(a+k,k),b)")

การใช้ JS ของ Golfed สำหรับอัลกอริทึมของ Kadane ทำสั้นที่สุด เปิดรับข้อเสนอแนะที่สร้างสรรค์!

สิ่งที่ฉันได้เรียนรู้จากโพสต์นี้:ค่าส่งคืนของeval- เมื่อสถานะล่าสุดคือforลูป - โดยทั่วไปแล้วค่าสุดท้ายที่มีอยู่ภายในลูป เย็น!

แก้ไข:บันทึกสี่ไบต์ด้วยคำแนะนำของ Justin และ Hermann


คุณสามารถหลีกเลี่ยงreturnโดยแทนที่{...;return b;}ด้วยeval("...;b")ตั้งแต่ eval ส่งกลับคำสั่งสุดท้าย
Justin Mariner

@JustinMariner ขอบคุณ! ฉันกำลังเรียนรู้สิ่งใหม่อยู่เสมอที่นี่ :)
Gaurang Tandon

คุณสามารถลบอีกสองไบต์ได้โดยลบ;bเนื่องจากมันถูกส่งกลับจาก for loop
Herman L

@HermanLauenstein โอ้ว้าวขอบคุณนั่นเป็นประโยชน์!
Gaurang Tandon


0

Python 2 , 52 51 ไบต์

f=lambda l:len(l)and max(sum(l),f(l[1:]),f(l[:-1]))

ลองออนไลน์!


1
สิ่งนี้ดูเหมือนว่าจะขัดแย้งกัน (ข้อกำหนดที่ไม่จำเป็นอื่น ๆ ) อย่าอ่านอะไรเลยนอกจาก stdin และอย่าเขียนไปที่ใดนอกจาก stdout
Mr. Xcoder



0

APL, 31 29 27 ไบต์

⌈/∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕

ลองออนไลน์!(แก้ไขแล้วจึงจะทำงานบน TryAPL)

อย่างไร?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ สร้างผลรวมของ subvectors
  • ⌈/ สูงสุด

0

CJam, 24 ไบต์

q~:A,{)Aew{:+}%}%e_0+:e>

ฟังก์ชันที่รับอาร์เรย์ของตัวเลขเป็นอินพุต

ลองออนไลน์

q~:A   e# Store array in 'A' variable
,{)Aew e# Get every possible sub-array of the array
{:+}%  e# Sum every sub array
}e_    e# flatten array of sums
0+     e# Add zero to the array
:e>    e# Return max value in array

0

MY , 11 ไบต์

⎕𝟚35ǵ'ƒ⇹(⍐↵

ลองออนไลน์! MY อยู่ใน TIO ทันที! ดีจัง!

อย่างไร?

  • = อินพุตที่ได้รับการประเมิน
  • 𝟚 = subvectors
  • 35ǵ'= chr(0x53)(Σ, รวม)
  • ƒ = string เป็นฟังก์ชันของฉัน
  • = แผนที่
  • ( = ใช้
  • = สูงสุด
  • = เอาต์พุตด้วยบรรทัดใหม่

ผลรวมได้รับการแก้ไข ( 0ในอาร์เรย์ที่ว่างเปล่า) เพื่อให้สามารถใช้งานได้ สินค้าได้รับการแก้ไข


0

J, 12 ไบต์

[:>./@,+/\\.

คล้ายกับโซลูชัน K ของ zgrep: ผลรวมการสแกนของส่วนต่อท้ายทั้งหมด (สร้างเมทริกซ์), raze, ใช้เวลาสูงสุด

ลองออนไลน์!

บันทึก

สำหรับไบต์ไม่มากเกินไปคุณสามารถหาโซลูชันที่มีประสิทธิภาพ (กอล์ฟขนาด 19 ไบต์):

[: >./ [: ({: - <./)\ +/\

0

ความจริง 127 ไบต์

f(a:List INT):Complex INT==(n:=#a;n=0=>%i;r:=a.1;for i in 1..n repeat for j in i..n repeat(b:=reduce(+,a(i..j));b>r=>(r:=b));r)

นี่จะเป็น O (# a ^ 3) อัลโก; ฉันคัดลอกมาจากผลลัพธ์ C ++ one ...

(3) -> f([1,2,3,-4,-5,6,7,-8,9,10,-11,-12,-13,14])
   (3)  24
                                                    Type: Complex Integer
(4) -> f([])
   (4)  %i
                                                    Type: Complex Integer
(5) -> f([-1,-2,3])
   (5)  3
                                                    Type: Complex Integer

0

สกาลา 105 ไบต์

val l=readLine.split(" ").map(_.toInt);print({for{b<-l.indices;a<-0 to b+2}yield l.slice(a,b+1).sum}.max)

ฉันไม่พบวิธีที่ดีกว่าในการสร้างอาร์เรย์รายการย่อย


0

Java 8, 242 ไบต์

import java.util.*;v->{List a=new Stack();for(String x:new Scanner(System.in).nextLine().split(" "))a.add(new Long(x));int r=0,l=a.size(),i=l,j,k,s;for(;i-->0;)for(j=l;--j>1;r=s>r?s:r)for(s=0,k=i;k<j;)s+=(long)a.get(k++);System.out.print(r);}

ลองที่นี่

106 ไบต์โดยไม่ใช้ข้อกำหนด STDIN / STDOUT .. >.>

a->{int r=0,l=a.length,i=l,j,k,s;for(;i-->0;)for(j=l;--j>1;r=s>r?s:r)for(s=0,k=i;k<j;s+=a[k++]);return r;}

ลองที่นี่

คำอธิบาย:

import java.util.*;      // Required import for List, Stack and Scanner

v->{                     // Method with empty unused parameter and no return-type
  List a=new Stack();    //  Create a List
  for(String x:new Scanner(System.in).nextLine().split(" "))
                         //  Loop (1) over the STDIN split by spaces as Strings
    a.add(new Long(x));  //   Add the String converted to a number to the List
                         //  End of loop (1) (implicit / single-line body)
  int r=0,               //  Result-integer
      l=a.size(),        //  Size of the List
      i=l,j,k,           //  Index-integers
      s;                 //  Temp sum-integer
  for(;i-->0;)           //  Loop (2) from `l` down to 0 (inclusive)
    for(j=l;--j>1;       //   Inner loop (3) from `l-1` down to 1 (inclusive)
        r=               //     After every iteration: change `r` to:
          s>r?           //      If the temp-sum is larger than the current `r`:
           s             //       Set `r` to the temp-sum
          :              //      Else:
           r)            //       Leave `r` the same
      for(s=0,           //    Reset the temp-sum to 0
          k=i;k<j;)      //    Inner loop (4) from `i` to `j` (exclusive)
        s+=(long)a.get(k++);
                         //     Add the number at index `k` in the List to this temp-sum
                         //    End of inner loop (4) (implicit / single-line body)
                         //   End of inner loop (3) (implicit / single-line body)
                         //  End of loop (2) (implicit / single-line body)
  System.out.print(r);   //  Print the result to STDOUT
}                        // End of method
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.