Aynı elemanlar arasında maksimum çalışma


24

Bu bir revizyon olduğunu bu şimdi silinmiş soruya tarafından ar kang . Bu sorunun OP'si bu soruyu geri almak isterse ya da bunu gönderirken benimle ilgili bir sorun varsa, bu konuyu yanıtlamaktan memnuniyet duyarım

Girdi olarak bir tamsayı listesi verildiğinde, aynı değerle başlayan ve biten sürekli bir alt listenin mümkün olan maksimum miktarını bulun. Alt listelerin uzunluğu en az 2 olmalıdır. Örneğin liste için

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

Aynı değerde 2 farklı sürekli alt liste başlıyor ve bitiyor

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

Daha büyük toplam 9, böylece 9 çıktısını alırsınız.

Her girişin en az 1 kopya içerdiğini varsayabilirsiniz.

Bu bu nedenle cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacaktır.

Test durumları

[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

Should [2,8,2,3,2]12 veya 17 olabilir mi? 17'yi tahmin ediyorum.
NikoNyrh

@NikoNyrh 17 olmalıdır.
Buğday Sihirbazı 16

CC BY / SA için Yaşasın. Topluluk üyeleri tarafından daha sonra dupe olarak işaretlenmiş olsa bile, başka bir soruya ait türev bir soru gönderme hakkınız vardır. Görünüşe göre OP’nin sayfasına bu blog gönderisinden aldığım bağlantıyı eklemelisin . "3. Her soru ve cevap için yazar adlarını göster [...] 4. Her yazar adını doğrudan kaynak sitedeki kullanıcı profili sayfasına köprüleyin" - Silinen soruları görmek için ayrıcalıklarım yok. orijinalini kim yaptı bilmiyorum.
Mindwin

@Mindwin Teşekkürler, OP'nin sayfasına bir link ekledim. Orijinal olarak dışına bıraktım çünkü OP'nin görevini silip silmediğini soruyla ilişkilendirilmekten kaçınmak isteyebileceklerini düşündüm.
Buğday Sihirbazı,

Silme nedeni ilgisizdir ve ortak kullanıcı (ben) için şeffaf değildir. Ancak atfetme vazgeçme biçimindedir. Lisansı göndererek ve kabul ederek bize bu koşullar altında bu hakları vermişlerdir. Dışarıdaki herhangi bir şey bir istisnadır. GJ.
Mindwin

Yanıtlar:


9

Haskell , 62 bayt

f bir tamsayı listesini alır ve bir tamsayı döndürür.

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

Çevrimiçi deneyin!

Nasıl çalışır

  • t"Bir listenin tüm soneklerini almadan alma Data.List.tails" standardıdır .
  • Olarak f l, bağımsız değişken listesi olmayan tüm boş eklerinden üzerinden liste anlama dolaşır lbirinci eleman ile, xve geri kalan m.
  • Her biri için m, ilk elemanı yve kalanı seçerek, tüm boş olmayan son ekleri için aynı şeyi yapar n.
  • Eğer xve yeşitse, liste anlama, aralarındaki elementlerin toplamını içerir. Bu alt liste çıkarılmış x:msonekiyle aynıdır n, dolayısıyla toplam olarak hesaplanabilir x+sum m-sum n.

8

JavaScript (ES6), 68 62 bayt

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

Test durumları

Yorumlananlar

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

Ben sırayla biraz karıştı y - a[i]ve (x += y) < m- IMHO kod onlarla biraz daha net olurdu, o zamandan beri basit bir golf gibi görünüyordu (x += y) < m || y != a[i].
Neil

@Neil Ben senin amacını görüyorum ama aynı (x+=y)<m|y-a[i]zamanda yanlış yorumlanabilir (x+=y)<(m|y-a[i]). Bunun belirsizliği ortadan kaldıracağından emin değilim. (Yine de düzenlendi, çünkü bu sürümü tercih etme eğilimindeyim.)
Arnauld,

Onlar da bunu yanlış anlaşılabilir olmaz varsayar y-a[i]|(x+=y)<molarak (y-a[i]|(x+=y))<m...
Neil

5

Jöle , 12 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

ĠŒ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

kabuk , 10 bayt

▲mΣfΓ~€;ṫQ

Çevrimiçi deneyin!

açıklama

▲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 bayt

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

Çevrimiçi deneyin!

combntekrar grev! En azından uzunluktaki tüm alt listeleri oluşturur 2, alt liste toplamını-Inf , ilk ve durumlarda tüm toplamların maksimumunu alır.

"if"Uyarıların bir demet yükseltecektir ancak güvenle ardı vardır - burada muhtemelen en iyi golf hile olduğunu rev(p)-pilk eleman IFF içinde sıfır olduğunu p[1]==tail(p,1)ve "if"bir uyarı ile kendi durumunun ilk öğesini kullanır.




2

Jöle , 13 , 12 bayt

=ṚṖḢ
ẆÇÐfS€Ṁ

Çevrimiçi deneyin!

Şu anda benimle rekabet eden Bay Xcoder tarafından kaydedilen bir bayt. : D

Açıklama:

        # 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 bayt

eSsMf&qhTeTtT.:

Çevrimiçi deneyin

açıklama

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

05AB1E , 9 bayt

ŒʒćsθQ}OZ

Çevrimiçi deneyin!

açıklama

Π         # push sublists of input
 ʒ    }    # filter, keep values where
  ć        # the head of the list, extracted
     Q     # is equal to
   sθ      # the last element of the rest of the list
       O   # sum the resulting sublists
        Z  # get the max


1

Python 2,86 bayt

Dennis tarafından Outgolfed

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])

Çevrimiçi deneyin!

İlk öğenin sonuncuya eşit olduğu uzunluk 2'den büyük tüm alt listeleri oluşturur, ardından her birini toplamına eşler ve en büyük değeri seçer.


Lambda işlevini kullanarak 88 bayt
Halvard Hummel

@HalvardHummel 86 bayt kullanıyor enumerate.
Jonathan Frech

Dennis tarafından Outgolfed - Dürüst olmak gerekirse, ne bekliyordun?
Bay Xcoder,

@ Mr.Xcoder Onun çözümünü alırdım, ama uyumaya gittim :(
FlipTack



1

Jöle , 11 bayt

Mücadeleyi tarihlendiren bazı özellikleri kullanır.

Ẇµ.ịEȧḊµƇ§Ṁ

Çevrimiçi deneyin!

Nasıl çalışır?

Ẇµ.ịEȧḊµƇ§Ṁ || Tam program CLA'dan giriş alır, STDOUT çıkışına çıkar.
Ẇ || Alt listeler.
 Ƈ Ƈ || Bunları süzgeç tut
    ȧḊ || ... uzunluğu en az 2 olan ve ...
 .ị || ... Zemindeki (0.5) ve tavandaki (0.5) elemanlar (modüler, 1 indeksli) ...
    E || ... eşittir.
         § || Her birini topla.
          Ṁ || Maksimum.

Caird'in yardımıyla -1 .


0

Toplu iş, 179 bayt

@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%

Komut satırı parametreleri olarak girdi alır.



0

Clojure, 92 bayt

#(apply max(for[i(range(count %))j(range i):when(=(% i)(% j))](apply +(subvec % j(inc i)))))

0

Java 8, 129 bayt

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

XListedeki her tam sayı için, işlev başlangıç ​​ve bitiş olan en büyük alt listenin toplamını bulur X. Sonra OP'nin belirttiği maksimum toplamı bulur.


Test etmedim, ancak bu bana [2,8,2,-3,2]test davasında başarısız olmuş gibi görünüyor ve muhtemelen [1,1,80]de.
Ørjan Johansen

0

Perl, 61 59 bayt

Şunlar +3için içerir -p:

max_ident_run.pl:

#!/usr/bin/perl -p
s:\S+:$%=$&;($%+=$_)<($\//$%)||$_-$&or$\=$%for<$' >:eg}{

Olarak çalıştırmak:

max_ident_run.pl <<< "1 2 -2 4 1 4 1"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.