Yerel Maxima'yı Ayıkla


19

Bir pozitif tamsayı dizisi verildiğinde, bitişik olanlardan büyük veya ona eşit olan tüm öğelerin bir dizisini çıktılar. Çoğu elemanın iki bitişik elemanı olacaktır; ilk ve son eleman sadece bir bitişik eleman bulunduğundan özel durumlardır.

Dizinin en az iki öğe içerdiğini varsayabilirsiniz.

Test senaryoları:

Input               | Output
[4,2,6,12,4,5,4,3]  | [4,12,5]
[1,2]               | [2]
[1,2,3,2,1]         | [3]
[3,2,1,2,3]         | [3,3]
[4,4]               | [4,4]
[2,4,4,4,1]         | [4,4,4]
[2,3,3,4]           | [3,4]
[4,3,3,4]           | [4,4]

Bu , en kısa kod kazanır!


1
@PeterTaylor Ne anlama geldiğini düşünüyorum "Çıktıya dahil edilecek ilk veya son eleman için, ..."
xnor

@PeterTaylor xnor doğru.
Pavel


Ayrıca ilgili: Yerel Extremes bulma
Wrzlprmft

[4,3,3,4]Bir test çantası olarak önerebilir miyim . Benim çözümüm bunu çok üzücü bir şekilde ele almadı.
JAD

Yanıtlar:


5

Jöle ,  13 12  11 bayt

0;;0»3\f"⁸Ẏ

Pozitif tamsayıların listesini alan ve yalnızca tüm komşularından daha büyük veya ona eşit olanları içeren filtrelenmiş listeyi döndüren monadik bir bağlantı.

Çevrimiçi deneyin!


Önceki 12 byter :

0;INżI>0ḄNMị

Önceki 13 byter :

0;;0ṡ3M€ċ€2Tị

Nasıl?

0;;0»3\f"⁸Ẏ - Link: list of positive integers, A
0;          - a zero concatenated with A
  ;0        - concatenate a zero
     3\     - 3-wise reduce with:
    »       -   maximum (yields a list of the maximums in each overlapping window of 3)
         ⁸  - chain's left argument, A
        "   - zip with:
       f    -   filter keep (i.e. keep the maximal if it is [in] the [length 1 list 
            -                     of the] respective original element)
          Ẏ - flatten by one level

3-bilge azaltmanın bir yolu olabileceğini düşünüyorum ama ben çalışmadım.
Jonathan Allan

Haklıydım - maksimum ikili ile 3-bilge bir azalma, »- nasıl olsa 10? ..?
Jonathan Allan



6

Haskell, 50 49 42 bayt

f l=[j|i:j:k:_<-scanr(:)[0]$0:l,k<=j,i<=j]

Çevrimiçi deneyin!

scanr(:)[0]kuyruklarının bir listesini yapar (0:l)nihai, her 0için örneğin l = [4,3,3,4]: [[0,4,3,3,4,0],[4,3,3,4,0],[3,3,4,0],[3,4,0],[4,0],[0]]desen eşleşti agains olan i:j:k:_adlandırılır en az 3 elemanlı tüm listeler ayıklamak için i, jve k. Tutun jonun> = eğer ive j.

Düzenle: Ørjan Johansen 7 byte kurtardı. Teşekkürler!


2
i:j:k:_<-scanr(:)[0]$0:ldaha kısadır. ("Standart" tails=scanr(:)[]numarayı hafifçe ayarlama .)
Ørjan Johansen

@ ØrjanJohansen: oh, bu numarayı kendimden önce kullandım, ama bir şekilde burada özledim. Çok teşekkürler!
nimi

4

Dyalog APL, 31 30 28 22 21 bayt

{⍵/⍨(⌈/=2⌷⊢)¨3,/∊0⍵0}

Çevrimiçi deneyin!

Açıklama (bazı şeyleri açıklama konusunda iyi değilim):

0⍵0       - [0,input,0]   (it looks like a face!)
∊         - flatten
3,/       - split into overlapping sections of length 3.
(⌈/=2⌷⊢)¨ - Whether the middle element is the maximum (applied to every section)
⍵/⍨       - index


3

JavaScript (ES6), 40 bayt

a=>a.filter((e,i)=>!(e<a[i-1]|e<a[i+1]))

3

Python 3 , 84 75 * 71 bayt

lambda l,k=[0]:[j for x,j in enumerate(l)if(k+l+k)[x+2]<=j>=(k+l+k)[x]]

Çevrimiçi deneyin!


* @ LeakyNun, akıllı bir operatör hilesi kullanarak 9 bayt kaydetti.


lambda l,k=[0]:[l[i]for i in range(len(l))if(k+l+k)[i+2]<=l[i]>=(k+l+k)[i]]
Leaky Nun


2

05AB1E , 15  14  13 bayt

ü‹0¸«sĆÁü›+_Ï

Çevrimiçi deneyin!

açıklama

ü‹             # pairwise comparison for less than
  0¸«          # append 0
     s         # swap input to top of stack
      Ć        # enclose, append the head of the list
       Á       # rotate right
        ü›     # pairwise comparison for greater than
          +    # add the two boolean lists
           _   # logical negate
            Ï  # keep only elements of input that are true in the resulting list

Önceki 15 bayt çözümü

¬s¤)˜Œ3ùεZQ1è}Ï

Çevrimiçi deneyin!

açıklama

¬                # get head of input
 s¤              # get tail of input
   )˜            # wrap stack in flattened list
                 # produces the input list with the first and last element duplicated
     Œ3ù         # push sublists of length 3
        ε        # apply transformation on each triple
         ZQ      # ... check each element for equality to the max
          1è     # ... get the middle element
            }    # end transform
             Ï   # keep only elements of input that are true in the resulting list

2

R, 44 bayt

pryr::f(x[(x>=c(0,x)&x>=x[-1])[1:sum(x|1)]])

fonksiyonu değerlendiren:

function (x) 
x[(x >= c(0, x) & x >= x[-1])[1:sum(x | 1)]]

Karşılaştırır xiçin c(0,x)böylece ile, xbir basamak sağa kaydırılır. Ayrıca karşılaştırır xiçin x[-1]böylece bir pozisyon sola kaydırılır. Her ikisi de TRUEorada bir maksimum varsa. &Bu booleanların AND'ini almak için. R'lerin vektörlerinin aynı uzunlukta olmadıklarında sarılan yapısından dolayı, sonucu xalarak elde edilen sonucu kısaltmamız gerekir sum(x|1). Daha sonra, yalnızca gerçek indeksleri alarak boole vektörünü takarız xve geri veririz .

Bu mantıksal işlemler eşit olmayan uzunluk vektörleri ile yapıldığından, R şikayet edecektir. Çok. Ancak uyarılar arasında doğru çıktı olacaktır:

> pryr::f(x[(x>=c(0,x)&x>=x[-1])[1:sum(x|1)]])(c(4,2,6,12,4,5,4,3))
[1]  4 12  5
Warning messages:
1: In x >= c(0, x) :
  longer object length is not a multiple of shorter object length
2: In x >= x[-1] :
  longer object length is not a multiple of shorter object length
3: In x >= c(0, x) & x >= x[-1] :
  longer object length is not a multiple of shorter object length



1

R , 68 bayt

function(a)a[a==sapply(1:length(a),function(i)max(c(0,a,0)[i+0:2]))]

Çevrimiçi deneyin!


pryr::f(expression)işlev bildirmekten daha kısa bir yoludur function(a)expression.
JAD

Ayrıca, sum(a|1)için bir kısayoldur length(a).
JAD

Daha kısa bir yaklaşım için çözümüme bakın.
JAD



1

q, 39 bayt

{x where x = -1 _ next 3 mmax x,last x}

Bu dili daha önce hiç duymamıştım. Deneyebileceğim veya indirebileceğim herhangi bir yeri biliyor musun?
Pavel

Tabii, kx.com , dokümanlar: code.kx.com
skeevey

1

Stax , 10 bayt

úâH◄(☼bM•Å

Çalıştır ve hata ayıkla

Standart çıktıda yeni satır ayrılmış değerler olarak çıktı üretir.

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

f       filter each value in input using the rest of the program; implicitly printing kept values
  x0|S  input pre- and post-pended with zero
  3B    split into batches of 3
  i@    get the i-th batch, where i is the iteration index
  |M=   is the current value equal to the max from the batch?

Bunu çalıştır

Güncellendi: 9 baytlık bir çözüm buldum. Açıklamayı daha sonra güncelleyecek:

Stax , 9 bayt

▀▓ûa¥╓╧↨⌐

Çalıştır ve hata ayıkla


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.