Максимальний пробіг між однаковими елементами


24

Це капітальний ремонт цього в даний час видалений питання по ар кан . Якщо ОП з цього питання хотів би відновити це питання або у мене є проблема, коли я розміщую це питання, я би радий прийняти

З урахуванням списку цілих чисел у якості введення знайдіть максимально можливу суму безперервного списку, який починається і закінчується тим самим значенням. Підписки повинні бути довжиною не менше 2. Наприклад, для списку

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

Є два різні безперервні підсписи, які починаються та закінчуються однаковим значенням

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

Більша сума 9, тому ви отримуєте 9.

Ви можете припустити, що кожен вхід містить щонайменше 1 дублікат.

Це тому відповіді будуть набрані в байтах, а менша кількість байтів буде кращою.

Тестові справи

[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

Має [2,8,2,3,2]бути 12 чи 17? Я припускаю 17.
NikoNyrh

@NikoNyrh Це повинно бути 17.
Чарівник пшениці

Ура для CC BY / SA. Ви маєте право опублікувати похідне запитання іншого, навіть якщо це згодом буде позначене дуепом членами громади. Здається, ви повинні додати посилання на сторінку ОП, як я отримую з цього допису в блозі. "3. Показуйте імена авторів на кожне запитання та відповідь [...] 4. Гіперпосилання кожного імені автора безпосередньо назад на сторінку його профілю на сайті джерела" - У мене немає привілеїв для перегляду видалених питань, тому я не хочу Я не знаю, хто створив оригінал.
Міндвін

@Mindwin Спасибі, я додав посилання на сторінку ОП. Я спочатку це не залишив, бо зрозумів, що якщо ОП видалить свою посаду, вони, можливо, захочуть уникнути зв'язку з цим питанням.
Пшеничний майстер

Причина видалення неактуальна і непрозора для звичайного користувача (мене). Але атрибуція має відмову. Подавши та погодившись на ліцензію, вони надали нам ці права за цих умов. Все, що знаходиться поза нею, є винятком. GJ.
Міндвін

Відповіді:


9

Хаскелл , 62 байти

f приймає список цілих чисел і повертає ціле число.

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

Спробуйте в Інтернеті!

Як це працює

  • tє стандартною Data.List.tailsфункцією "отримати всі суфікси списку без імпорту ".
  • В f l, розуміння списку повторюється через усі не порожні суфікси списку аргументів l, з першим елементом xта залишком m.
  • Для кожного він робить те саме для всіх непорожніх суфіксів m, вибираючи перший елемент yта залишок n.
  • Якщо xі yрівні, розуміння списку включає суму елементів між ними. Цей підпис є таким самим, як x:mі його nвилучений суфікс , тому суму можна обчислити якx+sum m-sum n .

8

JavaScript (ES6), 68 62 байт

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

Тестові справи

Прокоментував

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

Мене злегка збентежило замовлення y - a[i]і (x += y) < m- IMHO код буде дещо зрозумілішим, коли вони обмінюються, оскільки тоді він виглядає як простий гольф від (x += y) < m || y != a[i].
Ніл

@Neil Я бачу вашу думку, але її (x+=y)<m|y-a[i]можна неправильно трактувати (x+=y)<(m|y-a[i])так само. Я не впевнений, що це дійсно усуне двозначність. (Відредаговано так чи інакше, тому що я більше віддаю перевагу цій версії.)
Арнольд

Ну, це передбачає, що вони не трактуватимуть неправильно y-a[i]|(x+=y)<mяк (y-a[i]|(x+=y))<m...
Ніл

5

Желе , 12 байт

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

Спробуйте в Інтернеті!

Як це працює

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

Лушпиння , 10 байт

▲mΣfΓ~€;ṫQ

Спробуйте в Інтернеті!

Пояснення

▲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 байт

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

Спробуйте в Інтернеті!

combnзнову страйкує! Створює щонайменше всі підсписи довжини 2, встановлює суму підспису, -Infякщо перша і остання не рівні, і приймає максимум усіх сум.

"if"Підніме купу попереджень , але вони благополучно ігноровані - це, ймовірно , кращий гольф трюк тут, rev(p)-pдорівнює нулю в першому елементі тоді і тільки тоді p[1]==tail(p,1), і "if"використовує перший елемент його стану з попередженням.




2

Желе , 13 , 12 байт

=ṚṖḢ
ẆÇÐfS€Ṁ

Спробуйте в Інтернеті!

Один байт врятував містер Xcoder, який зараз змагається зі мною. : D

Пояснення:

        # 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 байт

eSsMf&qhTeTtT.:

Спробуйте в Інтернеті

Пояснення

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

Python 2 , 86 байт

Перевершив Денніс

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

Спробуйте в Інтернеті!

Створює всі підлісти, більші за довжину 2, де перший елемент дорівнює останньому, а потім відображає кожен на його суму і вибирає найбільше значення.


88 байт за допомогою лямбда-функції
Halvard Hummel

@HalvardHummel 86 байт з використанням enumerate.
Джонатан Фрех

Перевершив Денніс - Чесно кажучи, що ти очікував?
Містер Xcoder

@ Mr.Xcoder Я б отримав його рішення, але я пішов спати :(
FlipTack



1

Желе , 11 байт

Використовує деякі функції, які після дати виклику ставлять дату

Ẇµ.ịEȧḊµƇ§Ṁ

Спробуйте в Інтернеті!

Як це працює?

Ẇµ.ịEȧḊµƇ§Ṁ || Повна програма. Приймає вхід з CLA, виводить на STDOUT.
Ẇ || Підлісти.
 µ µƇ || Фільтр - зберігайте їх
    ȧḊ || ... Які мають довжину не менше 2 і ...
 .ị || ... Елементи підлоги (0,5) та стелі (0,5) (модульні, 1-індексовані) ...
    Е || ... рівні.
         § || Підсумовуйте кожен.
          Ṁ || Максимум.

-1 за допомогою кард .


0

Пакетна, 179 байт

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

Приймає введення як параметри командного рядка.



0

Clojure, 92 байти

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

0

Java 8, 129 баїв

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

Для кожного цілого числа Xу списку функція знаходить суму найбільшого підпису з початком і кінцем X. Потім він знаходить максимальну суму, як вказує ОП.


Я не перевіряв її, але мені здається, що це може вийти з ладу на [2,8,2,-3,2]тестовому випадку, і, можливо, [1,1,80]теж.
Ørjan Johansen

0

Perl, 61 59 байт

Включає +3 для-p :

max_ident_run.pl:

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

Виконувати як:

max_ident_run.pl <<< "1 2 -2 4 1 4 1"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.