Jalankan maksimum antara elemen identik

24

Ini adalah perombakan dari pertanyaan yang sekarang dihapus oleh ar kang . Jika OP dari pertanyaan itu ingin mengklaim kembali pertanyaan ini atau memiliki masalah dengan saya memposting ini, saya akan dengan senang hati mengakomodasi

Diberikan daftar bilangan bulat sebagai input, temukan jumlah maksimum yang mungkin dari sublist kontinu yang dimulai dan diakhiri dengan nilai yang sama. Sublist harus paling sedikit 2. Sebagai contoh untuk daftar

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

Ada 2 daftar kontinyu yang berbeda mulai dan berakhir dengan nilai yang sama

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

Jumlah yang lebih besar adalah 9 sehingga Anda menghasilkan 9.

Anda dapat menganggap setiap input mengandung setidaknya 1 duplikat.

Ini adalah sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.

Uji kasus

[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
Wisaya Gandum
sumber
Harus [2,8,2,3,2]12 atau 17? Saya kira 17.
NikoNyrh
@NikoNyrh Seharusnya 17.
Wheat Wizard
Hore untuk CC BY / SA. Anda memiliki hak untuk memposting pertanyaan turunan dari pertanyaan lain, meskipun itu nanti akan ditandai oleh anggota komunitas. Sepertinya Anda harus menambahkan tautan ke halaman OP seperti yang saya dapatkan dari posting blog ini. "3. Tampilkan nama penulis untuk setiap pertanyaan dan jawaban [...] 4. Tautkan setiap nama penulis langsung kembali ke halaman profil pengguna mereka di situs sumber" - Saya tidak memiliki hak istimewa untuk melihat pertanyaan yang dihapus, jadi saya tidak tidak tahu siapa yang membuat yang asli.
Mindwin
@Mindwin Terima kasih, saya telah menambahkan tautan ke halaman OP. Saya meninggalkannya awalnya karena saya pikir jika OP menghapus posting mereka, mereka mungkin ingin menghindari ditautkan ke pertanyaan.
Wheat Wizard
Alasan penghapusan tidak relevan dan tidak transparan bagi pengguna umum (saya). Tetapi atribusi adalah jenis opt-out. Dengan mengajukan dan menyetujui lisensi, mereka memberi kami hak-hak itu di bawah persyaratan tersebut. Apa pun di luar itu adalah pengecualian. GJ.
Mindwin

Jawaban:

9

Haskell , 62 byte

f mengambil daftar bilangan bulat dan mengembalikan bilangan bulat.

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

Cobalah online!

Bagaimana itu bekerja

  • tadalah fungsi standar "dapatkan semua sufiks dari daftar tanpa mengimpor Data.List.tails".
  • Dalam f l, pemahaman daftar iterates melalui semua sufiks non-kosong dari daftar argumen l, dengan elemen pertama xdan sisanya m.
  • Untuk masing-masing, ia melakukan hal yang sama untuk semua sufiks nonempty m, memilih elemen pertama ydan sisanya n.
  • Jika xdan ysama, pemahaman daftar mencakup jumlah elemen di antara mereka. Sublist ini sama x:mdengan suffixnya yang ndilepas, sehingga jumlahnya dapat dihitung sebagai x+sum m-sum n.
Ørjan Johansen
sumber
8

JavaScript (ES6), 68 62 byte

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

Uji kasus

Berkomentar

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
Arnauld
sumber
Saya sedikit bingung dengan pemesanan y - a[i]dan (x += y) < m- IMHO kode akan sedikit lebih jelas dengan mereka bertukar, sejak itu sepertinya golf sederhana dari (x += y) < m || y != a[i].
Neil
@Nil Saya mengerti maksud Anda tetapi (x+=y)<m|y-a[i]bisa juga disalahtafsirkan (x+=y)<(m|y-a[i])juga. Saya tidak yakin itu akan menghapus ambiguitas. (Tetap diedit karena saya cenderung lebih suka versi ini.)
Arnauld
Nah, itu mengasumsikan bahwa mereka tidak akan salah menafsirkan y-a[i]|(x+=y)<msebagai (y-a[i]|(x+=y))<m...
Neil
5

Jelly , 12 byte

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

Cobalah online!

Bagaimana itu bekerja

ĠŒ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.
Dennis
sumber
5

Sekam , 10 byte

▲mΣfΓ~€;ṫQ

Cobalah online!

Penjelasan

▲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
Zgarb
sumber
3

R , 108 103 90 88 83 byte

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

Cobalah online!

combnmenyerang lagi! Hasilkan semua sublists dengan panjang setidaknya 2, setel jumlah sublist menjadi -Infjika yang pertama dan terakhir tidak sama, dan ambil maks semua jumlah.

The "if"akan menaikkan sekelompok peringatan tetapi mereka aman dapat diketahui - itu mungkin yang terbaik golf trik di sini, rev(p)-padalah nol di IFF elemen pertama p[1]==tail(p,1), dan "if"menggunakan elemen pertama dari kondisinya dengan peringatan.

Giuseppe
sumber
2

Jelly , 13 , 12 byte

=ṚṖḢ
ẆÇÐfS€Ṁ

Cobalah online!

Satu byte disimpan oleh Tn. Xcoder, yang saat ini bersaing dengan saya. : D

Penjelasan:

        # 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
DJMcMayhem
sumber
1

Pyth, 15 byte

eSsMf&qhTeTtT.:

Cobalah online

Penjelasan

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.

sumber
1

05AB1E , 9 byte

ŒʒćsθQ}OZ

Cobalah online!

Penjelasan

Œ          # 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
Emigna
sumber
1

Bersih , 94 90 86 byte

import StdEnv,StdLib
@l=last(sort[sum(l%(i,j))\\e<-l&i<-[0..],j<-elemIndices e l|j>i])

Cobalah online!

Suram
sumber
Saya khawatir ini gagal untuk [1, 1, 80]test case.
Ørjan Johansen
@ ØrjanJohansen memperbaikinya
Οurous
1

Python 2 , 86 byte

Dikalahkan oleh Dennis

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

Cobalah online!

Menghasilkan semua sublists lebih besar dari panjang 2, di mana elemen pertama sama dengan yang terakhir, lalu memetakan masing-masing ke jumlahnya dan memilih nilai terbesar.

FlipTack
sumber
88 byte menggunakan fungsi lambda
Halvard Hummel
@HalvardHummel 86 byte menggunakan enumerate.
Jonathan Frech
Dikalahkan oleh Dennis - Jujur, apa yang Anda harapkan?
Tn. Xcoder
@ Mr.Xcoder Saya akan mendapatkan solusinya, tetapi saya tidur :(
FlipTack
1

Julia 0,6 , 70 byte

a->maximum(sum(a[i:k]) for b=[findin(a,x) for x=a] for i=b,k=b if k>i)

Cobalah online!

gggg
sumber
1

Jeli , 11 byte

Menggunakan beberapa fitur yang mengunggah tantangan.

Ẇµ.ịEȧḊµƇ§Ṁ

Cobalah online!

Bagaimana itu bekerja?

Ẇμ.ịEȧḊμƇ§Ṁ || Program lengkap. Mengambil input dari CLA, output ke STDOUT.
Ẇ || Sublists.
 µ µƇ || Filter-Simpan itu
    ȧḊ || ... Yang memiliki panjang minimal 2 dan ...
 .ị || ... Elemen di lantai (0,5) dan langit-langit (0,5) (modular, 1-diindeks) ...
    E || ... Adalah sama.
         § || Jumlahkan masing-masing.
          Ṁ || Maksimum.

-1 dengan bantuan dari caird .

Tuan Xcoder
sumber
0

Batch, 179 byte

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

Mengambil input sebagai parameter baris perintah.

Neil
sumber
0

C, 104 byte

i,j,s,l;f(a,n)int*a;{for(i=0,l=1<<31;i<n;++i)for(s=a[j=i];++j<n;l=a[j]-a[i]?l:s>l?s:l)s+=a[j];return l;}

Cobalah online!

C (gcc) , 99 byte

i,j,s,l;f(a,n)int*a;{for(i=0,l=1<<31;i<n;++i)for(s=a[j=i];++j<n;l=a[j]-a[i]?l:s>l?s:l)s+=a[j];l=l;}

Cobalah online!

Steadybox
sumber
99 byte , jika Anda suka perilaku yang tidak terdefinisi.
Jonathan Frech
0

Clojure, 92 byte

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

Java 8, 129 bye

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

Untuk setiap bilangan bulat Xdalam daftar, fungsi menemukan jumlah sublist terbesar dengan awal dan akhir X. Kemudian, ia menemukan jumlah maksimum yang ditentukan OP.

Mario Ishac
sumber
Saya belum mengujinya, tetapi bagi saya itu sepertinya gagal pada [2,8,2,-3,2]test case, dan mungkin [1,1,80]juga.
Ørjan Johansen
0

Perl, 61 59 byte

Termasuk +3untuk -p:

max_ident_run.pl:

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

Jalankan sebagai:

max_ident_run.pl <<< "1 2 -2 4 1 4 1"
Ton Hospel
sumber