최소값과 최대 값 사이에서 가장 긴 하위 시퀀스의 가장 큰 곱을 찾습니다


22

입력:

0보다 큰 정수의 비어 있지 않은 시퀀스 (길이가 1보다 큼)

산출:

시퀀스를 포함하여 최소 및 최대 시퀀스 요소 사이에서 가장 긴 하위 시퀀스의 모든 요소 중 가장 큰 곱입니다.

노트 :

최소 및 최대 요소가 반복 될 수 있기 때문에, 가능한 한 가장 긴 서브 시퀀스를 찾기 위해 필요한 정답에 이르기까지, 그 한쪽 끝이 시퀀스의 최소 요소이고 다른 끝이 최대 요소입니다. 가장 긴 하위 시퀀스가 ​​여러 개인 경우 제품이 가장 큰 하위 시퀀스를 선택하십시오.

예 :

첫 번째 예 :

입력: [5, 7, 3, 2, 1, 2, 2, 7, 5]

산출: 42

설명 : min == 1, max == 7. 끝에 min과 max가있는 두 가지 가능한 하위 시퀀스가 ​​있습니다 : [1, 2, 2, 7][7, 3, 2, 1]. 길이는 동일하므로 제품 비교 : 7*3*2*1 == 421*2*2*7 == 28. 이므로 42 >= 28답변하십시오 42.

두 번째 예 :

입력: [1, 2, 2, 2, 4, 3, 3, 1]

산출: 32

설명 : min == 1, max == 4. 2 개의 하위 시퀀스 : [1, 2, 2, 2, 4][4, 3, 3, 1]. 길이 [1, 2, 2, 2, 4]가 길이보다 깁니다 [4, 3, 3, 1]. 제품 : 1*2*2*2*4 == 32=> 답변은 32입니다.

3d 예 :

입력: [1, 2, 3, 4, 3, 3, 1]

산출: 36

간단한 설명 : min == 1, max == 4. 2 개의 하위 시퀀스 : [1, 2, 3, 4][4, 3, 3, 1]. 1*2*3*4 == 24, 4*3*3*1 == 36, 36 >= 24=> 답이다 36.

네 번째 예 :

입력: [2, 2, 2]

산출: 8

설명 : min == 2, max == 2. 두 가지 다른 하위 시퀀스 : [2, 2][2, 2, 2]. 길이 [2, 2, 2]가 길이보다 깁니다 [2, 2]. 제품 : 2*2*2 == 8=> 답변은 8입니다.

더 많은 (무작위) 예 :

>>>[7, 2, 3, 6, 8, 6, 2, 5, 4, 3]
288
>>>[3, 3, 8, 9, 1, 7, 7, 2, 2, 4]
9
>>>[3, 2, 6, 5, 4, 1, 8, 8, 7, 9]
4032
>>>[7, 4, 2, 8, 8, 3, 9, 9, 5, 6]
31104

솔루션을 확인하십시오.

다음은 작업의 요구 사항을 충족시키는 Python 3 람다 (788 바이트)입니다 .

lambda O: __import__('functools').reduce(__import__('operator').mul,O[[[slice(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1),slice(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1)][__import__('functools').reduce(__import__('operator').mul,O[O.index(min(O)):(len(O)-1-O[::-1].index(max(O)))+1],1)>=__import__('functools').reduce(__import__('operator').mul,O[O.index(max(O)):len(O)-1-O[::-1].index(min(O))+1],1)],slice(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1),slice(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1)][(len(range(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1))>len(range(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1)))-(len(range(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1))<len(range(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1)))]],1)

우승자:

가장 짧은 해결책이 이길 것입니다. 모든 프로그래밍 언어가 허용됩니다.

추신 : 나는 당신의 해결책에 대한 설명에 기뻐할 것입니다

답변:


5

젤리 , 14 바이트

.ịạ/;L;P
ẆÇ€ṀṪ

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

작동 원리

ẆÇ€ṀṪ     Main link. Argument: A (array)

Ẇ         Window; generate all substrings of A.
 ǀ       Map the helper link over the substrings.
   Ṁ      Take the maximum.
    Ṫ     Tail; select the last element.


.ịạ/;L;P  Helper link. Argument: S (array / substring)

.ị        At-index 0.5; select the last and first element of S.
  ạ/      Reduce by absolute difference.
    ;L    Append the length of S.
      ;P  Append the product of S.

5

젤리 , 15 바이트

NMpMr/€LÐṀịµP€Ṁ

TryItOnline!

방법?

NMpMr/€LÐṀịµP€Ṁ - Main link: list of integers, L
           µ    - links to the left as a monadic chain with argument L
N               - negate elements of L
 M              - indexes of maximal elements (i.e. indexes of minimal elements of L)
   M            - indexes of maximal elements of L
  p             - Cartesian product of the min and max indexes
     /€         - reduce each list (all of which are pairs) with the dyad:
    r           -     range(a,b)  (note if a>b this is [a,a-1,...,b])
        ÐṀ      - filter keeping those with maximal
       L        -     length
          ị     - index into L (vectorises)   (get the values)
            P€  - product of a list for €ach
              Ṁ - maximum

5

펄 6 , 108 바이트

{max ([*] $_ for .[.grep(+.max(+*)) with (for .min,.max,.max,.min {.first($^a,:k).. .first($^b,:k,:end)})])}

3

R, 146 바이트

z=apply(expand.grid(which(max(x<-scan())==x),which(min(x)==x)),1,function(y)c(prod(x[y[1]:y[2]]),abs(diff(y))));max(z[1,which(z[2,]==max(z[2,]))])

길이 요구 사항 때문에 까다로운 도전. 또한 내장 된 유용한 내장 which.max함수는 첫 번째 최대 색인 만 반환 하기 때문에 성가시다 which(max(x)==x). 대신 3 번 사용하도록 강요 했다. 오웰 ...

읽을 수있는 :

x <- scan()

maxs <- which(max(x)==x)
mins <- which(min(x)==x)
q <- expand.grid(maxs,mins)
z <- apply(q,1,function(y){
  c(prod(x[y[1]:y[2]]), abs(diff(y)))
  })

max(z[1, which(z[2, ]==max(z[2, ]))])

2

PHP, 189 (173) 166 바이트

<?foreach($a=$_GET[a]as$p=>$b)foreach($a as$q=>$c)$b>min($a)|$c<max($a)?:$r[$d=abs($p-$q)+1]=array_product(array_slice($a,min($p,$q),$d));ksort($r);echo max(end($r));

비슷하게 게으르지 만 33 바이트 더 짧습니다 (스 니펫을 프로그램으로 변환하기 위해 10 바이트를 추가해야 함).

  1. 루프 $p/$b$q/$c배열을 통해; 경우 $b==min$c==max,
    상기 서브 시퀀스의 제품을 추가$r[sub-sequence length]
  2. $r키를 기준으로 정렬하십시오 .
  3. 마지막 요소의 최대 값을 인쇄하십시오.

배열을 GET 매개 변수로 사용하여 브라우저에서 호출하십시오 a.
예:script.php?a[]=5&a[]=7&a[]=3&a[]=2&a[]=1&a[]=2&a[]=2&a[]=7&a[]=5


2

수학, 122 바이트

(g=#;Sort[{#.{-1,1},Times@@Take[g,#]}&/@Sort/@Join@@Outer[List,Sequence@@(Union@@Position[g,#@g]&/@{Max,Min})]][[-1,-1]])&

이것이 얼마나 오래인지 놀랐습니다. 먼저 최소값과 최대 값이 나타나는 데카르트 곱을 생성 한 다음 ( Jonathan Allan의 Jelly 답변에 따라 ) 해당 런의 길이와 해당 제품의 길이를 계산하고 정렬 된 결과의 마지막 요소를 취하여 적절한 길이를 선택합니다.


1

자바 스크립트, 187 바이트

f=
(l,M=Math,a=M.min(...l),z=M.max(...l),r=(m,n)=>[eval(l.slice(b=l.indexOf(m),c=l.lastIndexOf(n)+1).join`*`),M.abs(b-c)])=>(u=r(a,z),v=r(z,a),u[1]>v[1]?u[0]:v[1]>u[1]?v[0]:M.max(v[0],u[0]))


console.log([
  [5, 7, 3, 2, 1, 2, 2, 7, 5],
  [1, 2, 2, 2, 4, 3, 3, 1],
  [1, 2, 3, 4, 3, 3, 1],
  [2, 2, 2],
  [7, 2, 3, 6, 8, 6, 2, 5, 4, 3],
  [3, 3, 8, 9, 1, 7, 7, 2, 2, 4],
  [3, 2, 6, 5, 4, 1, 8, 8, 7, 9],
  [7, 4, 2, 8, 8, 3, 9, 9, 5, 6]
].map(a=>`[${a}] => ${f(a)}`).join`
`)

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