Corsa massima tra elementi identici


24

Questa è una revisione di questa domanda ora cancellata da ar kang . Se l'OP di quella domanda desidera rivendicare questa domanda o ha un problema con la mia pubblicazione, sarei felice di accontentarti

Dato un elenco di numeri interi come input, trova la somma massima possibile di un elenco secondario continuo che inizia e termina con lo stesso valore. Le liste secondarie devono avere una lunghezza minima di 2. Ad esempio per l'elenco

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

Esistono 2 diverse liste secondarie continue che iniziano e finiscono con lo stesso valore

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

La somma maggiore è 9, quindi si ottiene 9.

Puoi presumere che ogni input contenga almeno 1 duplicato.

Si tratta di quindi le risposte verranno classificate in byte con un numero inferiore di byte migliori.

Casi test

[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

Dovrebbe [2,8,2,3,2]essere 12 o 17? Presumo 17.
NikoNyrh

@NikoNyrh Dovrebbe essere il 17.
Wheat Wizard

Evviva per CC BY / SA. Hai il diritto di pubblicare una domanda derivata di un'altra, anche se in seguito verrà segnalata dai membri della community. Sembra proprio che dovresti aggiungere un link alla pagina del PO come ottengo da questo post sul blog. "3. Mostra i nomi degli autori per ogni domanda e rispondi [...] 4. Collegamento ipertestuale a ciascun nome dell'autore direttamente alla pagina del profilo utente sul sito di origine" - Non ho i privilegi per vedere le domande cancellate, quindi so chi ha fatto quello originale.
Mindwin,

@Mindwin Grazie, ho aggiunto un link alla pagina del PO. L'ho lasciato fuori originariamente perché ho pensato che se l'OP avesse cancellato il loro post avrebbero potuto evitare di essere collegati alla domanda.
Wheat Wizard

Il motivo dell'eliminazione è irrilevante e non trasparente per l'utente comune (me). Ma l'attribuzione è di tipo opt-out. Inviando e accettando la licenza ci hanno concesso tali diritti a tali condizioni. Qualunque cosa al di fuori di essa è un'eccezione. GJ.
Mindwin

Risposte:


9

Haskell , 62 byte

f accetta un elenco di numeri interi e restituisce un numero intero.

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

Provalo online!

Come funziona

  • tè la funzione standard "ottieni tutti i suffissi di un elenco senza importare Data.List.tails".
  • In f l, la comprensione dell'elenco scorre attraverso tutti i suffissi non vuoti dell'elenco degli argomenti l, con il primo elemento xe il resto m.
  • Per ciascuno, fa lo stesso per tutti i suffissi non vuoti di m, selezionando il primo elemento ye il resto n.
  • Se xe ysono uguali, la comprensione dell'elenco include la somma degli elementi tra loro. Questo elenco secondario è lo stesso del x:msuffisso nrimosso, quindi la somma può essere calcolata come x+sum m-sum n.

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

Casi test

Commentate

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

Ero un po 'confuso dall'ordinamento di y - a[i]e (x += y) < m- IMHO il codice sarebbe leggermente più chiaro con il loro scambio, da allora sembra un semplice golf da (x += y) < m || y != a[i].
Neil

@Neil vedo il tuo punto, ma (x+=y)<m|y-a[i]potrebbe anche essere male interpretato (x+=y)<(m|y-a[i]). Non sono sicuro che eliminerebbe davvero l'ambiguità. (Modificato comunque perché tendo a preferire questa versione.)
Arnauld

Bene, questo presuppone che non avrebbero interpretato male y-a[i]|(x+=y)<mcome (y-a[i]|(x+=y))<m...
Neil

5

Gelatina , 12 byte

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

Provalo online!

Come funziona

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

Buccia , 10 byte

▲mΣfΓ~€;ṫQ

Provalo online!

Spiegazione

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

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

Provalo online!

combnColpisce ancora! Genera almeno tutte le liste secondarie di lunghezza 2, imposta la somma della lista secondaria su -Infse il primo e l'ultimo non sono uguali e prende il massimo di tutte le somme.

Il "if"solleverà un sacco di avvertimenti, ma sono tranquillamente ignorabili - che è probabilmente il miglior trucco golf qui, rev(p)-pè pari a zero nel primo IFF elemento p[1]==tail(p,1), e "if"utilizza il primo elemento della sua condizione con un avvertimento.




2

Gelatina , 13 , 12 byte

=ṚṖḢ
ẆÇÐfS€Ṁ

Provalo online!

Un byte salvato da Mr. Xcoder, che attualmente è in competizione con me. : D

Spiegazione:

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

eSsMf&qhTeTtT.:

Provalo online

Spiegazione

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 byte

ŒʒćsθQ}OZ

Provalo online!

Spiegazione

Œ          # 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 byte

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

Provalo online!

Genera tutte le liste secondarie più grandi della lunghezza 2, dove il primo elemento è uguale all'ultimo, quindi mappa ciascuno alla sua somma e seleziona il valore più grande.


88 byte usando una funzione lambda
Halvard Hummel il

@HalvardHummel 86 byte utilizzando enumerate.
Jonathan Frech,

Superato da Dennis - Onestamente, cosa ti aspettavi?
Mr. Xcoder,

@ Mr.Xcoder Avrei avuto la sua soluzione, ma sono andato a dormire :(
FlipTack



1

Gelatina , 11 byte

Utilizza alcune funzionalità che postdatano la sfida.

Ẇµ.ịEȧḊµƇ§Ṁ

Provalo online!

Come funziona?

Ẇµ.ịEȧḊµƇ§Ṁ || Programma completo. Riceve input da CLA, output su STDOUT.
Ẇ || Sottoliste.
 µ µƇ || Filtra-Mantieni quelli
    ȧḊ || ... Che hanno una lunghezza di almeno 2 e ...
 .ị || ... Gli elementi al pavimento (0,5) e al soffitto (0,5) (modulare, 1 indicizzato) ...
    E || ... Sono uguali.
         § || Somma ciascuno.
          Ṁ || Massimo.

-1 con l'aiuto di caird .


0

Lotto, 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%

Accetta input come parametri della riga di comando.



0

Clojure, 92 byte

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

0

Java 8, 129 ciao

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

Per ogni numero intero Xnell'elenco, la funzione trova la somma dell'elenco secondario più grande con inizio e fine X. Quindi trova la somma massima specificata dall'OP.


Non l'ho provato, ma mi sembra che potrebbe non riuscire sul [2,8,2,-3,2]caso di test, e forse [1,1,80]anche.
Ørjan Johansen,

0

Perl, 61 59 byte

Include +3per -p:

max_ident_run.pl:

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

Correre come:

max_ident_run.pl <<< "1 2 -2 4 1 4 1"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.