동일한 요소 사이의 최대 실행


24

이것은 ar kang 이 삭제 한 질문 에 대한 점검입니다 . 해당 질문의 OP가이 질문을 되찾고 싶거나 이것을 게시하는 데 문제가있는 경우 기꺼이 수용하겠습니다.

입력으로 정수 목록이 주어지면 동일한 값으로 시작하고 끝나는 연속 서브리스트의 가능한 최대 합계를 찾으십시오. 하위 목록의 길이는 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를위한 Hooray 나중에 커뮤니티 회원이 속인 것으로 표시 되더라도 다른 질문에 대한 파생 질문을 게시 할 권리가 있습니다. 이 블로그 게시물에서 얻을 수 있듯이 OP 페이지에 링크를 추가 해야 합니다 . "3. 모든 질문에 대한 작성자 이름 표시 및 답변 [...] 4. 각 저자 이름을 소스 사이트의 사용자 프로필 페이지로 직접 다시 하이퍼 링크" -삭제 된 질문을 볼 수있는 권한이 없기 때문에 누가 원래를 만들 었는지 모르겠다.
Mindwin

@Mindwin 감사합니다. OP 페이지에 링크를 추가했습니다. OP가 게시물을 삭제하면 질문에 연결되지 않도록 할 수 있다고 생각했기 때문에 원래 제외했습니다.
밀 마법사

삭제 이유는 관련이 없으며 일반 사용자 (me)에게는 투명하지 않습니다. 그러나 귀속은 거부 유형입니다. 라이센스를 제출하고 동의함으로써 해당 조건 하에서 해당 권한을 부여했습니다. 그 밖의 모든 것은 예외입니다. GJ.
Mindwin

답변:


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.
  • 경우 xy동일한 목록의 이해는 이들 사이의 요소들의 합을 포함한다. 이 하위 목록은 x:m접미사를 n제거한 상태 와 동일 하므로 합계를로 계산할 수 있습니다 x+sum m-sum n.

8

자바 스크립트 (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

@ Neil 나는 당신의 요점을 보았지만 (x+=y)<m|y-a[i]마찬가지로 잘못 해석 될 수 있습니다 (x+=y)<(m|y-a[i]). 나는 그것이 모호성을 실제로 제거 할 것이라고 확신하지 못한다. (어쨌든이 버전을 선호하는 경향이 있기 때문에 편집되었습니다.)
Arnauld

글쎄, 그건 가정 그들이 것없는 오해 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입니다. 첫 번째 요소 iff에서 0 p[1]==tail(p,1)이고 "if"경고와 함께 해당 상태의 첫 번째 요소를 사용합니다.




2

젤리 , 13 , 12 바이트

=ṚṖḢ
ẆÇÐfS€Ṁ

온라인으로 사용해보십시오!

현재 나와 경쟁하고있는 Xcoder가 저장 한 1 바이트. :디

설명:

        # 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

05AB1E , 9 바이트

ŒʒćsθQ}OZ

온라인으로 사용해보십시오!

설명

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

파이썬 2 , 86 바이트

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

온라인으로 사용해보십시오!

첫 번째 요소가 마지막 요소와 같은 길이 2보다 큰 모든 하위 목록을 생성 한 다음 각 요소를 해당 합계에 매핑하고 가장 큰 값을 선택합니다.


람다 함수를 사용하는 88 바이트
Halvard Hummel

@HalvardHummel 사용하여 86 바이트enumerate .
Jonathan Frech

Dennis의 아웃 고프 – 정직하게, 당신은 무엇을 기대 했습니까?
Mr. Xcoder

@ Mr.Xcoder 나는 그의 해결책을 얻었
을지 모르지만



1

젤리 , 11 바이트

도전 과제 이후의 일부 기능을 사용합니다.

Ẇµ.ịEȧḊµƇ§Ṁ

온라인으로 사용해보십시오!

어떻게 작동합니까?

Ẇµ.ịEȧḊµƇ§Ṁ || 전체 프로그램. CLA에서 입력을 가져 와서 STDOUT으로 출력합니다.
Ẇ || 하위 목록.
 µ µƇ || 필터 유지
    ȧḊ || ... 길이가 2 이상이고 ...
 .ị || ... floor (0.5) 및 ceil (0.5)의 요소 (모듈 식, 1- 색인) ...
    전자 || ... 같다.
         § || 각각 합산하십시오.
          Ṁ || 최고.

caird의 도움으로 -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

클로저, 92 바이트

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

0

자바 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목록의 각 정수 에 대해 함수는 start 및 end가있는 가장 큰 하위 목록의 합계를 찾습니다 X. 그런 다음 OP가 지정한 최대 합계를 찾습니다.


나는 그것을 테스트하지는 않았지만 [2,8,2,-3,2]테스트 케이스에서 실패했을 수도 있고 아마도 실패 할 수도 [1,1,80]있습니다.
Ørjan Johansen 님이

0

펄, 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.