Min ve max arasında en uzun sürenin en büyük ürününü bulun


22

Giriş:

Uzunluğu 1'den büyük olan, sıfırdan büyük olmayan boş olmayan bir tam sayı dizisi.

Çıktı:

Kendileri de dahil olmak üzere sıranın minimum ve maksimum elemanları arasındaki en uzun alt dizilimin tüm elemanlarının en büyük ürünü.

Not:

Çünkü minimum ve maksimum elemanlar tekrarlanabilir, o zaman bir ucunda minimum ve diğer ucunda dizinin maksimum elemanlarında olası en uzun sonucu bulmak için gerekli kesin bir cevap verilir. Birden fazla uzun alt ek varsa, o zaman en büyük ürünü içeren alt diziyi seçin.

Örnekler:

1. örnek:

Giriş: [5, 7, 3, 2, 1, 2, 2, 7, 5]

Çıktı: 42

Açıklama: min == 1, max == 7. Uçlarda min ve maks olmak üzere 2 olası ek vardır: [1, 2, 2, 7]ve [7, 3, 2, 1]. Uzunlukları eşittir, bu nedenle ürünleri karşılaştırmak: 7*3*2*1 == 42ve 1*2*2*7 == 28. Çünkü 42 >= 28, cevap: 42.

2. örnek:

Giriş: [1, 2, 2, 2, 4, 3, 3, 1]

Çıktı: 32

Açıklama: min == 1, max == 4. 2 sıra: [1, 2, 2, 2, 4]ve [4, 3, 3, 1]. Uzunluğu, [1, 2, 2, 2, 4]uzunluktan büyük [4, 3, 3, 1]. Ürün: 1*2*2*2*4 == 32=> cevaptır 32.

3d örnek:

Giriş: [1, 2, 3, 4, 3, 3, 1]

Çıktı: 36

Kısa açıklama: min == 1, max == 4. 2 sıra: [1, 2, 3, 4]ve [4, 3, 3, 1]. 1*2*3*4 == 24, 4*3*3*1 == 36, 36 >= 24=> Cevaptır 36.

4. örnek:

Giriş: [2, 2, 2]

Çıktı: 8

Açıklama: min == 2, max == 2. 2 farklı konu: [2, 2]ve [2, 2, 2]. Uzunluğu, [2, 2, 2]uzunluktan büyük [2, 2]. Ürün: 2*2*2 == 8=> cevaptır 8.

Daha fazla (rastgele) örnek:

>>>[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

Çözümünüzü kontrol edin:

Görevin gereğini yerine getiren Python 3 lambda (788 bytes) :

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)

Kazanan:

En kısa çözüm kazanacak. Tüm programlama dilleri kabul edildi.

Not: Çözümlerinizle ilgili açıklamalardan memnuniyet duyacağım

Yanıtlar:


5

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

ẆÇ€ṀṪ     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

Jöle , 15 bayt

NMpMr/€LÐṀịµP€Ṁ

TryItOnline!

Nasıl?

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

Perl 6 , 108 bayt

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

3

R, 146 bayt

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

Uzunluk gereksinimi nedeniyle zorlu bir mücadele. Ayrıca sinir bozucu çünkü yararlı olacak yerleşik which.maxsadece karşılaştığı ilk maksimum indeksi, which(max(x)==x)yerine beni kullanmaya zorlar ... 3 kez. Oh iyi...

Okunabilir:

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 bayt

<?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));

benzer şekilde tembel ancak 33 bayt daha kısa (snippet'i bir programa dönüştürmek için 10 bayt eklemek zorunda kaldı):

  1. Döngü $p/$bve $q/$cdizi aracılığıyla; eğer $b==minve $c==max,
    alt dizinin ürününü$r[sub-sequence length]
  2. $rTuşlara göre sırala .
  3. Son öğenin maksimum değerini yazdırın.

GET parametresi olarak dizi ile tarayıcıyı arayın a.
Örnek:script.php?a[]=5&a[]=7&a[]=3&a[]=2&a[]=1&a[]=2&a[]=2&a[]=7&a[]=5


2

Mathematica, 122 bayt

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

Bunun ne kadar sürdüğü şaşırttı. İlk önce minima ve maksima görünümlerinin Kartezyen ürününü üretir ( Jonathan Allan'ın Jelly cevabına göre ), daha sonra bu koşuların ve ürünlerinin uzunluklarını hesaplar ve sıralanan sonuçların son elemanını alarak uygun olanı seçer.


1

JavaScript, 187 bayt

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.