Maksymalna podgrupa

21

Zdefiniuj „maksymalną pod-tablicę” danej tablicy jako „(kolejną) pod-tablicę, która ma największą sumę”. Uwaga: nie ma wymogu „niezerowego”. Wydaj tę sumę.

Podaj opis swojego kodu, jeśli to możliwe.

Przykładowe wejście 1:

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

Przykładowy wynik 1: 24

Opis 1:
Największa suma jest uzyskiwana przez wycinanie 6 7 -8 9 10i sumowanie.

Przykładowe dane wejściowe 2: -1 -2 -3
Przykładowe dane wyjściowe 2: 0
Opis 2: To proste :) Pusta podtablica jest „największą”.

Wymaganie:

  • Nie czytaj niczego poza stdin, a wyjście powinno przejść do stdout.
  • Obowiązują standardowe ograniczenia luk .

Ranking: Najkrótszy program wygrywa ten .

iBug
źródło
5
Napisz program, który jest jak najkrótszy. Zalecam usunięcie tego wymogu, ponieważ wymaga od nas sprawdzenia każdego możliwego programu w naszym języku i upewnienia się, że korzystamy z najkrótszego.
Okx,
Wymaganie 2 jest również niejasne. Czy to oznacza biblioteki? Niestandardowe biblioteki? Outsourcing programu? To ostatnie jest już zabronione przez standardowe luki.
Leaky Nun
14
Nie czytaj niczego poza stdin i nie pisz nigdzie poza stdout. - Czemu?
Pan Xcoder,
2
Bardzo podobny , prawdopodobnie dupe. Również bardzo podobny .
xnor

Odpowiedzi:

10

Łuska , 6 4 bajtów

▲ṁ∫ṫ

Wypróbuj 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
ბიმო
źródło
4

Pyth , 8 bajtów

eS+0sM.:

Wypróbuj online!


W jaki sposób?

eS + 0sM .: Q - Q jest niejawne, co oznacza dane wejściowe. Powiedzmy, że to [-1, -2, -3].

      .: - Wszystkie ciągłe niepuste listy podrzędne. Mamy [[-1], [-2], [-3], [-1, -2], [-2, -3], [-1, -2, -3]].
    sM - Uzyskaj sumę każdej podlisty. [-1, -2, -3, -3, -5, -6]
  +0 - Dodaj 0 do listy sum. [0, -1, -2, -3, -3, -5, -6]
eS - Maksymalny element. S daje nam [-6, -5, -3, -3, -2, -1, 0], podczas gdy e zwraca 0, ostatni element.
Pan Xcoder
źródło
4

05AB1E , 4 bajty

Ό0M

Wypróbuj online!

-1 dzięki Adnan .

Erik the Outgolfer
źródło
Ta sama wskazówka jak w przypadku odpowiedzi Okx: ÎŒOMpowinna działać na 4 bajty.
Adnan,
@Adnan Dzięki Myślałem, że jest tylko wbudowane „1 i wejście” ... czekaj ... prawda? Czy nie powinny być połączone?
Erik the Outgolfer,
Nie, Mszuka największej liczby w spłaszczonej wersji stosu.
Adnan,
@Adnan ok ... to wiadomość dla mnie lol
Erik the Outgolfer
3

C ++, 197 195 187 bajtów

-10 bajtów dzięki Zacharýowi

#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
źródło
Czy możesz usunąć nawiasy klamrowe po pierwszej pętli for?
Zacharý
Ponadto, dlaczego masz li htak czy inaczej?
Zacharý
@ Zacharý l i h był dla indeksu początkowego i końcowego tablicy podrzędnej
HatsuPointerKun
3

R , 54 bajty

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

Wypróbuj online!

Algorytm pobrany z: Maksymalny problem z podtablicą

R , 65 bajtów

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

Wypróbuj online!

  • Czytaj xze standardowego.
  • Ustaw yjako indeks x.
  • Iteruj dwa razy po wszystkich możliwych niepustych podzbiorach.
  • Porównaj sumę podzbioru z m(początkowo m=0).
  • Przechowuj maksymalną wartość w m.
  • Wartość wydruku m.

R , 72 bajty

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

Wypróbuj online!

  • Czytaj xze standardowego.
  • Wykonaj pełne wyszukiwanie wszystkich możliwych niepustych podzbiorów.
  • Porównaj sumę podzbioru z m(początkowo m=0).
  • Przechowuj maksymalną wartość w m.
  • Wartość wydruku m.

Inne nieudane pomysły

58 bajtów

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

63 bajty

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

72 bajty

m=matrix(x<-scan(),n<-length(x),n);max(apply(m*lower.tri(m,T),2,cumsum))
djhurio
źródło
1
a=b=0też działa. Ponadto musisz obsłużyć drukowanie wydruku. Po uruchomieniu jako pełny program (przez source) nie drukuje niczego.
JAD,
@JarkoDubbeldam, dodałem cat(b), ale jeśli pochodzą z echo=TRUEtego, wystarczy wezwać bdo wydruku.
djhurio
Wydaje mi się, że nie ma jasnej definicji tego, jak pełne programy są uruchamiane w R. Istnieje rscript w wierszu poleceń, a source w samym R. Ale zwykle potrzebne są flagi podczas uruchamiania skryptu. (Osobiście nie udało mi się sprawić, by rscript ładnie działał przy skanowaniu, ale to inna sprawa.
JAD
Można użyć T=Fzamiast a=b=0zapisać dwa bajty, ponieważ maxbędzie zmuszać bdo numeric.
Giuseppe
3

Haskell , 28 bajtów

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

Wypróbuj online!

H.PWiz
źródło
czy maksimum nie zawsze będzie ostatnim elementem zwracanego elementu scanl? więc foldl((max<*>).(+))0??
Macieja
NVM widzę mój błąd!
Matthias
@matthias Jeśli zobaczysz historię edycji, zobaczysz, że popełniłem błąd sma. :-)
H.PWiz
2

Mathematica, 24 bajty

Max[Tr/@Subsequences@#]&
J42161217
źródło
2

Haskell , 41 33 bajtów

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

Wypróbuj online! dzięki Laikoni

michi7x7
źródło
1
Anonimowe funkcje są dozwolone jako przesyłanie, więc możesz upuścić g=. Zamiast tego concatMapmożesz użyć =<<monady z listy: Wypróbuj online! (33 bajty).
Laikoni
1

Japt , 11 bajtów

£ãY mxÃc rw

Wypróbuj online!

Wyjaśnienie

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

Metoda alternatywna, 11 bajtów

Od @ETHproductions; na podstawie odpowiedzi Łuski Brutalnych Sił .

£sY å+Ãc rw

Pobiera wszystkie ogony z tablicy wejściowej i sumuje każdą z nich. Następnie spłaszcza tablicę i uzyskuje maks.

Wypróbuj online!

Justin Mariner
źródło
Miło, naprawdę miło. Nie próbowałem wdrożyć tego wyzwania, kiedy go widziałem wcześniej, ale pomyślałem o innej technice i spodziewałem się, że wyniesie około 15 bajtów, więc to świetnie.
ETHproductions
Patrząc na odpowiedź Łuski, istnieje inny skuteczny sposób: £sY å+Ãc rw(także 11 bajtów)
ETHproductions
@ETHproductions Całkiem nieźle, dodam to do tej odpowiedzi jako alternatywną metodę. Czy można to poprawić za pomocą kombinacji zmniejszania / konkatowania, podobnie jak odpowiedź Husk?
Justin Mariner,
1

Rubin, 61 59 57 bajtów

Właśnie zacząłem uczyć się Ruby, więc to właśnie wymyśliłem.

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

Pierwszy raz zobaczyłem ten algorytm w fińskiej wersji tej niedokończonej książki . Jest to bardzo dobrze wyjaśnione na stronie 23.

Wypróbuj online!

Yytsi
źródło
1

JavaScript, 58 bajtów

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

Implementacja algorytmu Kadane'a w golfa JS. Wykonane tak krótko, jak to możliwe. Otwarty na konstruktywne sugestie!

Czego nauczyłem się z tego postu: zwracana wartość eval- gdy jej ostatnią instrukcją jest forpętla - jest zasadniczo ostatnią wartością obecną w pętli. Fajne!

EDYCJA: zapisano cztery bajty dzięki sugestiom Justina i Hermanna.

Gaurang Tandon
źródło
Można uniknąć returnzastępując {...;return b;}z eval("...;b")ponieważ eval zwraca ostatni oświadczenie.
Justin Mariner,
@JustinMariner dzięki! zawsze uczę się tutaj czegoś nowego :)
Gaurang Tandon
Możesz usunąć jeszcze dwa bajty ;b, ponieważ został on zwrócony z pętli for
Herman L
@HermanLauenstein Och, wow, dzięki, to jest przydatne!
Gaurang Tandon
0

Python 2 , 52 51 bajtów

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

Wypróbuj online!

Syzyf
źródło
1
Wydaje się, że jest to sprzeczne (w przeciwnym razie niepotrzebne) wymaganie Nie czytaj niczego oprócz standardowego wejścia i nie pisz nigdzie poza standardowym wyjściem.
Pan Xcoder,
0

Common Lisp, 73 bajty

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

Wypróbuj online!

Renzo
źródło
0

k , 14 bajtów

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

Wypróbuj 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
źródło
0

APL, 31 29 27 bajtów

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

Wypróbuj online! (zmodyfikowany, aby działał na TryAPL)

W jaki sposób?

  • ∊∘.{+/W[X/⍨⍺≤X←⍳⍵]}⍨⍳⍴W←⎕ Generuj sumy podwektorów
  • ⌈/ Maksymalny
Zacharý
źródło
0

CJam, 24 bajty

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

Funkcja, która przyjmuje tablicę liczb jako dane wejściowe.

Wypróbuj 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
źródło
0

MY , 11 bajtów

⎕𝟚35ǵ'ƒ⇹(⍐↵

Wypróbuj online! MY jest teraz na TIO! Łał!

W jaki sposób?

  • = obliczone dane wejściowe
  • 𝟚 = podwektory
  • 35ǵ'= chr(0x53)(Σ, suma)
  • ƒ = ciąg jako MOJA funkcja
  • = mapa
  • ( = zastosuj
  • = maksimum
  • = wyjście z nową linią.

Suma została naprawiona ( 0na pustych tablicach), aby to działało. Produkt został również naprawiony.

Zacharý
źródło
0

J, 12 bajtów

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

Podobne do rozwiązania K zgrepa: suma skanowania wszystkich sufiksów (tworzy matrycę), zetrzyj, weź maks

Wypróbuj online!

UWAGA

za niewiele więcej bajtów, możesz uzyskać wydajne rozwiązanie (19 bajtów golfowych):

[: >./ [: ({: - <./)\ +/\
Jonasz
źródło
0

Aksjomat, 127 bajtów

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)

Byłoby to O (# a ^ 3) Algo; Kopiuję go z wyników 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
źródło
0

Scala, 105 bajtów

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

Nie znalazłem lepszego sposobu na generowanie tablic list podrzędnych .

6infinity8
źródło
0

Java 8, 242 bajty

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

Wypróbuj tutaj.

106 bajtów bez użycia wymagania 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;}

Wypróbuj tutaj.

Wyjaśnienie:

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
źródło