Bir “Sıralama” algoritması


33

Bazen bir listeyi sıralamak için, artan sırayla sıralanana kadar listeden öğeleri kaldırdığınız Stalin sıralaması adı verilen bir "sıralama algoritması" vardır. Örneğin liste

[1, 2, 4, 5, 3, 6, 6]

Stalin sıralama kullanarak "sıralanır" olduğunda

[1, 2, 4, 5, 6, 6]

Üçü bozuk olduğu için kaldırıldı.

Şimdi açıkçası, bir listeyi sıralamak için elemanları kaldırmanın birçok yolu var. Örneğin, ikiden daha az element içeren herhangi bir liste, sadece yeterli sayıda öğeyi kör şekilde kaldırarak, her zaman bir listeyi sıralayabiliriz. Durum bu olduğu için yalnızca en uzun süreyi önemsiyoruz Stalin türünden mümkün sonucu .

Göreviniz, pozitif tamsayıların bir listesini almak ve öğelerin orijinal listesinden çıkarılmasıyla ulaşılabilecek en uzun sıralanmış (artan) listenin uzunluğunu çıkarmak olacaktır. Bu, en uzun sıralanmış (muhtemelen bitişik olmayan) alt listenin uzunluğunu bulur.

Sıralanan listeler aynı öğeye art arda birden fazla sahip olabilir. Programın kendisi boş olmadığı sürece boş listeyi desteklemeniz gerekmez.

puanlama

Cevabınız, mümkün olan en uzun Stalin türünün uzunluğu ile puanlanacaktır. Programlar, karakterlerden ziyade bir bayt dizisi olarak yorumlanacak ve sıraları, baytları sayı olarak yorumlayarak ortaya çıkan doğal olan olacaktır. Düşük puanlar daha iyidir.

Bu değil

İşte size cevaplarınızı puanlamanıza yardımcı olacak zarif bir araç .

Test durumları

[1, 2, 4, 5, 3, 6, 6] -> 6
[19, 2] -> 1
[3, 3, 4, 3] -> 3
[10] -> 1
[1, 2, 4, 9] -> 4
[1, 90, 2, 3, 4, 5] -> 5
[1, 90, 91, 2, 3, 4, 5] -> 5

3
Kısacası: en uzun (kesin olmayan) artan dizinin uzunluğunu verir .
user202729

1
"Programın kendisi boş olmadığı sürece boş listeyi desteklemene gerek yok" kuralını seviyorum.
Paŭlo Ebermann

Bu meydan okuma bana çok sayıda droport meydan okumasını hatırlatıyor: codegolf.stackexchange.com/questions/61808/…
Stefnotch

1
Ptpb.pw/SVSt.html adresinde bir denetleyici oluşturdum . Hala çok işlevsel değil, ama işe yarıyor. (TODO: * çubuk grafik * en az azalan dizilere bölümleme * diğer kod sayfaları için destek)
user202729

@ user202729 Harika! Ben yazıya ekledim. Gerekirse yeni sürümleri düzenlemek için çekinmeyin.
Buğday Sihirbazı

Yanıtlar:


8

Python 2 , uzunluk 14 12 10 9

M=max;X=exit;i=input();L=[0]*M(i)
for	a	in	i:L[a-1]=M(L[:a])+1
X(M(L))

Çıkış, çıkış kodu üzerinden yapılır.

Çevrimiçi deneyin!

Nasıl çalışır

Her zaman, L dizisi şimdiye kadar karşılaşılan en uzun sıralanmış alt dizileri izler; L[bir-1]bir

L

bir[L[0],...,L[bir-1]]birbirbirL[bir-1]

L


Lütfen neden işe yaradığını açıklayabilir misiniz? Bunu anlamak için zor zamanlar yaşıyorum :(
Dead Possum

Bir açıklama ekledim.
Dennis,


5

Jöle , uzunluk  4  2

ṢƑƇZLƲ}ŒP

Çevrimiçi deneyin!

Jelly'in kod sayfasındaki bayt

183 146 144 90 76 169 125 19 80

Nasıl çalışır

ṢƑƇZLƲ}ŒP  Main link. Argument: A (array)

       ŒP  Powerset; yield P, the array of all sub-arrays of A.
     Ʋ     Vier; combine the preceding four links into a monadic chain...
      }    and apply the chain to the right argument (P).
  Ƈ            Comb; only keep arrays for which the link to the left returns 1.
ṢƑ             Sort fixed; yield 1 if sorting doesn't alter the array.
   Z           Zip; read the filtered powerset by columns.
    L          Take the length.



3

Pyth, skor 3 2 ( 7 bayt)

leSI#y

Anders Kaseorg'a teşekkür ederiz.
Burada dene

açıklama

leSI#y
     yQ    Take the power set of the (implicit) input (preserving order).
  SI#      Get the ones that are sorted.
 e         Take the last (longest).
l          Get the length.

leSI#ypuanlar 2.
Anders Kaseorg 30:18

2

Stax , 4 maksimum uzunluk stalin sıralama

S{:^fF%|M

Koş ve hata ayıkla

Bu şekilde çalışır.

S       powerset of input
{:^f    filter by non-descending sequences
F%|M    take the maximum length remaining

2

R , Puan 15 11, 72 62 bayt

function(L,M=max,A=1:M(L)*0){for(Y in L)A[Y]=M(A[1:Y])+1;M(A)}

Çevrimiçi deneyin!

Limanın Dennis'in Python'u R.'ye cevap veriyor.


Son bağlantı gösterdiği gibi, bunların hiçbiri alt dize (bulunan) kullanılmaktadır çünkü sadece değişken adlarını değiştirme olmaz yardım, o skor 15. verir
Ørjan Johansen

@ ØrjanJohansen ah, tabii ki, çok aptalım. Sanırım başka bir yaklaşım gerekli.
Giuseppe,

2

Brachylog , uzunluk 2 (4 bayt)

⊇≤₁l

Çevrimiçi deneyin!

Bu kadar kısa sürülmemiş olarak çok özlü olmanızı sağlayan bir cevap.

( 08 03 80 6CBrachylog’un kod sayfasında)

        Output
   l    the length of
 ≤₁     a non-decreasing
⊇       sublist of
        the input.
        (maximizing the size of the sublist)

►LSnmOṖHusk için geldim ama puanı (en azından uzunluğu için) göndermeyi rahatsız etmek için çok kötü ...
Unrelated String
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.