Sub-array maksimum

21

Tentukan "maksimum sub-array" dari array yang diberikan sebagai "sub-array (berturut-turut) yang memiliki jumlah terbesar". Perhatikan tidak ada persyaratan "tidak nol". Keluarkan jumlah itu.

Berikan deskripsi kode Anda jika memungkinkan.

Masukan sampel 1:

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

Output sampel 1: 24

Deskripsi 1:
Jumlah terbesar dihasilkan dengan memotong 6 7 -8 9 10dan menyimpulkan.

Input sampel 2: -1 -2 -3
Contoh output 2: 0
Deskripsi 2: Sederhana :) Subarray kosong adalah "terbesar".

Kebutuhan:

  • Jangan membaca apa pun kecuali stdin, dan output harus pergi ke stdout.
  • Batasan celah standar berlaku.

Pemeringkatan: Program terpendek memenangkan ini .

iBug
sumber
5
Tulis program yang sesingkat mungkin. Saya akan merekomendasikan menghapus persyaratan ini karena mengharuskan kami untuk memeriksa setiap program yang mungkin dalam bahasa kami dan memastikan bahwa kami menggunakan yang terpendek.
Okx
Persyaratan 2 juga tidak jelas. Apakah ini berarti perpustakaan? Perpustakaan khusus? Mengalihdayakan program? Yang terakhir sudah dilarang oleh celah standar.
Leaky Nun
14
Jangan membaca apa pun kecuali stdin, dan jangan menulis ke mana pun kecuali stdout. - Kenapa?
Tn. Xcoder
2
Sangat mirip , mungkin menipu. Juga sangat mirip .
xnor

Jawaban:

10

Sekam , 6 4 byte

▲ṁ∫ṫ

Cobalah online!

      -- implicit input (list) xs  - eg. [-1,2,3]
   ṫ  -- get all tails of xs       -     [[-1,2,3],[2,3],[3],[]]
 ṁ∫   -- map & concat cumsum       -     [0,-1,1,4,0,2,5,0,3,0]
▲     -- get maximum               -     5
ბიმო
sumber
4

Pyth , 8 byte

eS+0sM.:

Cobalah online!


Bagaimana?

eS + 0sM.: Q - Q implisit, artinya input. Katakanlah [-1, -2, -3].

      .: - Semua sub-daftar yang tidak kosong yang bersebelahan. Kami memiliki [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Dapatkan jumlah masing-masing sublist. [-1, -2, -3, -3, -5, -6]
  +0 - Tambahkan 0 ke daftar jumlah. [0, -1, -2, -3, -3, -5, -6]
eS - Elemen maksimum. S memberi kita [-6, -5, -3, -3, -2, -1, 0], sementara e mengembalikan 0, elemen terakhir.
Tuan Xcoder
sumber
4

05AB1E , 4 byte

Ό0M

Cobalah online!

-1 terima kasih kepada Adnan .

Erik the Outgolfer
sumber
Tip yang sama dengan jawaban Okx: ÎŒOMharus bekerja selama 4 byte.
Adnan
@ Adnan Terima kasih saya pikir hanya ada builtin "1 dan input" ... tunggu ... kan? Bukankah mereka seharusnya digabung atau semacamnya?
Erik the Outgolfer
Tidak, Mmencari jumlah terbesar di versi tumpukan yang rata.
Adnan
@ Adnan ok ... ini berita baru buat saya lol
Erik the Outgolfer
3

C ++, 197 195 187 bytes

-10 byte terima kasih kepada 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;}
HatsuPointerKun
sumber
Bisakah Anda menghapus kawat gigi setelah yang pertama untuk loop?
Zacharý
Juga, mengapa Anda memiliki ldan hlagian?
Zacharý
@ Zacharý l dan h adalah untuk indeks awal dan akhir dari sub array
HatsuPointerKun
3

R , 54 byte

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

Cobalah online!

Algoritma yang diambil dari: Masalah subarray maksimum

R , 65 byte

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

Cobalah online!

  • Baca xdari stdin.
  • Tetapkan ysebagai indeks x.
  • Ulangi dua kali dari semua himpunan bagian yang tidak kosong yang mungkin.
  • Bandingkan jumlah subset dengan m(awalnya m=0).
  • Simpan nilai maksimum dalam m.
  • Nilai cetak m.

R , 72 byte

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

Cobalah online!

  • Baca xdari stdin.
  • Lakukan pencarian penuh atas semua himpunan bagian nonempty yang mungkin.
  • Bandingkan jumlah subset dengan m(awalnyam=0).
  • Simpan nilai maksimum dalam m.
  • Nilai cetak m.

Gagasan gagal lainnya

58 byte

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

63 byte

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

72 byte

m=matrix(x<-scan(),n<-length(x),n);max(apply(m*lower.tri(m,T),2,cumsum))
djhurio
sumber
1
a=b=0bekerja juga. Juga, Anda perlu menangani pencetakan output. Ketika dijalankan sebagai program lengkap (melalui source) ini tidak mencetak apa pun.
JAD
@JarkoDubbeldam, saya telah menambahkan cat(b), tetapi jika bersumber dari echo=TRUEitu sudah cukup untuk meminta bhasil cetak.
djhurio
Saya kira tidak ada definisi yang jelas tentang bagaimana program penuh dijalankan di R. Ada rscript di commandline, dan sumber di R itu sendiri. Tetapi biasanya flag yang dibutuhkan saat menjalankan skrip dimasukkan dalam bytecount. (Saya pribadi belum berhasil membuat rscript bekerja dengan baik dengan pemindaian, tapi itu hal lain.
JAD
Anda dapat menggunakan T=Fbukan a=b=0untuk menyelamatkan dua byte, karena maxakan memaksa buntuk numeric.
Giuseppe
3

Haskell , 28 byte

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

Cobalah online!

H.Piz
sumber
bukankah maksimum selalu menjadi elemen terakhir yang dikembalikan scanl? jadi foldl((max<*>).(+))0??
matthias
NVM saya melihat kesalahan saya!
matthias
@matthias Jika Anda melihat histori edit, Anda akan melihat bahwa saya membuat kesalahan kecil. :-)
H.PWiz
2

05AB1E , 4 byte

-2 byte terima kasih kepada Adnan

ÎŒOM

Cobalah online!

Okx
sumber
ÎŒOMharus bekerja selama 4 byte
Adnan
@ Adnan Cool, terima kasih.
Okx
2

Mathematica, 24 byte

Max[Tr/@Subsequences@#]&
J42161217
sumber
2

Haskell , 41 33 byte

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

Cobalah online! terima kasih untuk Laikoni

michi7x7
sumber
1
Fungsi anonim diizinkan sebagai kiriman, sehingga Anda dapat membatalkan g=. Alih-alih concatMapAnda dapat menggunakan =<<dari daftar monad: Coba online! (33 byte).
Laikoni
1

Japt , 11 byte

£ãY mxÃc rw

Cobalah online!

Penjelasan

£ã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

Metode alternatif, 11 byte

Dari @ETHproductions; berdasarkan jawaban Sekam Brute Forces .

£sY å+Ãc rw

Mendapat semua ekor dari array input dan secara total menjumlahkan masing-masing. Kemudian ratakan array dan dapatkan maks.

Cobalah online!

Justin Mariner
sumber
Bagus, sangat bagus. Saya tidak mencoba untuk mengimplementasikan tantangan ini ketika saya melihatnya sebelumnya, tetapi saya memikirkan teknik yang berbeda dan berharap untuk keluar sekitar 15 byte, jadi ini bagus.
ETHproduksi
Melihat jawaban Sekam, ada cara lain yang efisien: £sY å+Ãc rw(juga 11 byte)
ETHproduk
@ ETHproductions Cukup bagus, saya akan menambahkannya ke jawaban ini sebagai metode alternatif. Mungkinkah itu diperbaiki dengan kombinasi pengurangan / persetujuan, juga seperti itu jawaban Husk?
Justin Mariner
1

Ruby, 61 59 57 byte

Saya baru mulai belajar Ruby, jadi inilah yang saya hasilkan.

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

Saya pertama kali melihat algoritma ini di versi bahasa Finlandia dari buku yang belum selesai ini . Ini dijelaskan dengan sangat baik di halaman 23.

Cobalah online!

Yytsi
sumber
1

JavaScript, 58 byte

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

Implementasi JS Golf dari algoritma Kadane. Dibuat sesingkat mungkin. Terbuka untuk saran yang membangun!

Apa yang saya pelajari dari posting ini: nilai balik eval- ketika statment terakhirnya adalah sebuah forloop - pada dasarnya adalah nilai terakhir yang ada di dalam loop. Keren!

EDIT: disimpan empat byte berkat saran Justin dan Hermann.

Gaurang Tandon
sumber
Anda dapat menghindari returndengan mengganti {...;return b;}dengan eval("...;b")karena eval mengembalikan pernyataan terakhir.
Justin Mariner
@JustinMariner terima kasih! Saya selalu belajar sesuatu yang baru di sini :)
Gaurang Tandon
Anda dapat menghapus dua byte lagi dengan menghapus ;b, karena itu dikembalikan dari for loop
Herman L
@HermanLauenstein Oh, wow, terima kasih, itu berguna!
Gaurang Tandon
0

Python 2 , 52 51 byte

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

Cobalah online!

Sisyphus
sumber
1
Ini tampaknya bertentangan (persyaratan yang tidak perlu) Jangan membaca apa pun kecuali stdin, dan jangan menulis ke mana pun kecuali stdout.
Tn. Xcoder
0

Common Lisp, 73 byte

(lambda(a &aux(h 0)(s 0))(dolist(x a s)(setf h(max x(+ h x))s(max s h))))

Cobalah online!

Renzo
sumber
0

k , 14 byte

|/,/+\'(1_)\0,

Cobalah online!

            0, /prepend a zero (in case we're given all negatives)
       (1_)\   /repeatedly remove the first element, saving each result
    +\'        /cumulative sum over each result, saving each result
  ,/           /flatten (fold concat)
|/             /maximum (fold max)
zgrep
sumber
0

APL, 31 29 27 byte

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

Cobalah online!(dimodifikasi sehingga akan berjalan di TryAPL)

Bagaimana?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ Hasilkan jumlah subvektor
  • ⌈/ Maksimum
Zacharý
sumber
0

CJam, 24 byte

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

Fungsi yang mengambil array angka sebagai input.

Cobalah secara Online

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
geokavel
sumber
0

SAYA , 11 byte

⎕𝟚35ǵ'ƒ⇹(⍐↵

Cobalah online! MY ada di TIO sekarang! Woo hoo!

Bagaimana?

  • = input yang dievaluasi
  • 𝟚 = subvektor
  • 35ǵ'= chr(0x53)(Σ, jumlah)
  • ƒ = string sebagai fungsi SAYA
  • = peta
  • ( = berlaku
  • = maksimum
  • = keluaran dengan baris baru.

Jumlah telah diperbaiki ( 0pada array kosong) agar ini berfungsi. Produk juga diperbaiki.

Zacharý
sumber
0

J, 12 byte

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

Mirip dengan solusi K zgrep: jumlah pindaian semua sufiks (menghasilkan matriks), meratakan, ambil maks

Cobalah online!

CATATAN

untuk tidak terlalu banyak byte, Anda bisa mendapatkan solusi yang efisien (19 byte golf):

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

Aksioma, 127 byte

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)

Ini akan menjadi O (# a ^ 3) Algo; Saya menyalinnya dari hasil 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
RosLuP
sumber
0

Scala, 105 byte

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

Saya tidak menemukan cara yang lebih baik untuk menghasilkan array daftar sub .

6infinity8
sumber
0

Java 8, 242 byte

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);}

Coba di sini.

106 byte tanpa menggunakan persyaratan 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;}

Coba di sini.

Penjelasan:

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
Kevin Cruijssen
sumber