Lazy Drop Sort Uygula


26

Bu zorluk zaten zaten droportu açıklar. Ancak, biraz tembelim ve gerçekten sadece dizimin öncekinden biraz daha fazla sıralanmasına ihtiyacım var, tüm yol boyunca sıralanması gerekmiyor .

Bırakma Sıralaması'nda, her elemanı ondan önceki herhangi bir öğeden daha az bırakırız. Lazy Drop Sort'da, her bir öğeyi kesinlikle öncekinden daha az düşürüyoruz .

İşte bir örnek. Aşağıdaki diziyi göz önünde bulundurun:

8 6 9 9 7 2 3 8 1 3

Her elemanı bir öncekinden daha az işaretleyelim.

8 6 9 9 7 2 3 8 1 3
  ^     ^ ^     ^

Ne 3işaretlendiğine ya da son işaretine dikkat edin 8. Hepsi solundaki tek elemandan daha büyük.

Algoritmayı tamamlayarak, işaretlenmiş elemanları kaldırarak alırız:

8 9 9 3 8 3

Bu temelde daha sıralı görünüyor. Tür. Tembelim.

Göreviniz, zaten düşülmüş olabileceğiniz gibi, bu algoritmayı uygulamaktır.

Giriş, 1 ile 9 arasında en az 1 pozitif tam sayı dizisidir, böylece bir basamak haneyi de alabilirsiniz.

Bu , en az bayt kazanıyor!

Ek test durumları:

1
1

1 2 3
1 2 3

5 3 1
5

1 2 3 2 1
1 2 3

1 1 1 9 9 9 1 1 1 9 9 9 1 1 1
1 1 1 9 9 9 1 1 9 9 9 1 1

9 9
9 9

5 2 4 2 3
5 4 3

Bir işlev olabilir mi yoksa eksiksiz bir program mı olmalı?
rafa11111

@ rafa11111 Her ikisi de iyi
Pavel

Bir fonksiyon olması durumunda, giriş dizisi ana programda kodlanabilir mi? Dizinin uzunluğu işleve girdi olarak iletilebilir mi?
rafa11111

@ rafa11111 Giriş, fonksiyonun kendisinde kodlanmış olamaz. Test programında işlevin bu girişi nasıl aldığı önemli değildir. Dizi uzunluğunu yalnızca C / C ++ veya dizinin uzunluğunu belirlemenin tek yolunun kullanıldığı başka bir dil kullanıyorsanız alabilirsiniz.
Pavel

Yanıtlar:



15

JavaScript (ES6), 28 25 bayt

@Shaggy sayesinde 3 bayt kaydedildi

a=>a.filter(n=>~-a<(a=n))

Çevrimiçi deneyin!


2
n=>p<=nharika görünüyordu olurdu ;-)
ETHproductions

4
@ETHproductions +4 bayt için, iyi (n=p)=>p<=(p=n)çalışıyor;)
Arnauld

Bu cevap aklımı başımdan alıyor, neden phenüz tanımlanmadığında ilk kez erişmeye çalışırken bu neden patlamıyor ?
Brian H.

1
@Shaggy Bu güvenli görünüyor. Bilgisayarın önünde döndüğümde güncellenecek. Teşekkürler!
Arnauld

2
@Pavel abaşlangıçta girdi dizisine ayarlanır ve a-1sonuç olarak NaN(tek bir tam sayı içermediği sürece, bu durumda bu tam sayıya zorlanır) sonuçlanır.
Arnauld


6

MATL , 9 8 bayt

Giuseppe sayesinde bir bayt kurtarıldı.

0yd0<h~)

Çevrimiçi deneyin!


Açıklama:

0                 % Push a zero
 y                % Implicitly grab the input and duplicate it.
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [8 6 9 9 7 2 3 8 1 3]
  d               % The difference between each number of the last element:
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [-2, 3, 0, -2, -5, 1, 5, -7, 2]
   0<             % Which are negative?
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [1 0 0 1 1 0 0 1 0]
     h            % Concatenate. Stack: [8 6 9 9 7 2 3 8 1 3], [0 1 0 0 1 1 0 0 1 0] 
      ~           % Negate. Stack: [8 6 9 9 7 2 3 8 1 3], [1 0 1 1 0 0 1 1 0 1]
       )          % Index. Stack: [8 9 9 3 8 3]

5

Perl 5.10.0 + -nl, 16 bayt

$f>$_||say;$f=$_

Çevrimiçi deneyin!


1
Perl 6'ya Çeviriperl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert

@Brad perl6 farklı bir dil (geriye bile uyumlu değil) Post it!
18'de atıldı

Daha aptalca bir Perl 6 olan birini yazdım, ama daha uzundu. Ayrıca buraya gönderdiğim sebeplerden biri de dili göstermek ve açıklamak. Bu çeviriyi yayınlamak başka bir şey yapmaz ama Perl’in biraz daha ayrıntılı bir versiyonunu gösterir. Temel olarak, bu sitede yayınlamamın nedenlerinden hiçbirini yerine getirmiyor.
Brad Gilbert,



4

Stax , 5 bayt

âÿ╠╦░

Çevrimiçi olarak çalıştırın ve hata ayıklayın

Açma, çözme ve kodu yorumlayarak bunu anlıyoruz.

Z   Push a zero under the input
f   Use the rest of the program as a filter on the input.  Output passing elements.
>   Current element is greater than previous?
_~  Push current element to the input stack; when the main stack is empty, pops fall back to this
!   Logical not; applies to the result of the greater-than

Bunu çalıştır

Talimatların sıralaması zor ama bunun için bir sebep var. Stax kaynak kod paketi her zaman aynı boyut girişi için aynı boyut çıktısını vermez. Temel olarak, kaynağın son karakterinin daha düşük karakter koduna sahip olması durumunda byte kaydetme şansınız vardır. Eh, !sen yazdırılabilir karakter için alabilirsiniz düşük kodları birine sahiptir. (Özel olarak) Birçok 6 byte ASCII stax programı daha küçük paketler oluşturamaz. Ama eğer bir ile !bitiyorlarsa yapabilirler. Bu nedenle, talimatların bu şekilde sıralanmasının nedeni, mantığın programın sonunda bitmemesini sağlamaktır.


4

J, 12 Bayt

#~1,2&(<:/\)

Açıklama:

#~1,2&(<:/\)    | Whole function, executed as a hook
       <:/      | Distribute <: (greater or equal) over an array
    2&(   \)    | Apply to each sub array of length 2
  1,            | Append a 1 to the front
#~              | Choose elements from the original array

Örnekler:

    2&(<:/\) 8 6 9 9 7 2 3 8 1 3
0 1 1 0 0 1 1 0 1
    1,2&(<:/\) 8 6 9 9 7 2 3 8 1 3
1 0 1 1 0 0 1 1 0 1
    (1 0 1 1 0 0 1 1 0 1) # 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3
    f =: #~1,2&(<:/\)
    f 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Çevrimiçi deneyin!


Güzel çözüm! Kodunuz için bir TIO linki ekledim.
Galen Ivanov

4

Jöle , 6 bayt

>Ɲ0;¬×

G / Ç dizeleri üzerinde.

Çevrimiçi deneyin!


Merak ediyorum, neden dizgelerde çalışıp dizileri kullanmıyoruz? Jelly’e dizelerde kötü olduğu söylendi.
Pavel

2
Bu. ×karakter tekrarı için çalışmamalı, ama işe yarıyor.
Dennis,

4

Java 8, 66 55 48 bayt

l->{for(int i=0;;)if(i>(i=l.next()))l.remove();}

@ OlivierGrégoire'dan bir bahşiş sonra 11 bayt . @ OlivierGrégoire
sayesinde -7 bayt daha .

Açıklama:

Çevrimiçi deneyin.

l->{                     // Method with Integer-ListIterator parameter and no return-type
  for(int i=0;;)         //  Loop over all items
    if(i>(i=l.next()))   //   If the current item is larger than the next
      l.remove();}       //    Remove this next item

Neden herkes ~0temelde olduğu zaman kullanmaya başlar -1. Şahsen, eğer bayt sayısı aynı uzunluktaysa, daha sezgisel çözümü seçerdim ( while(...)vs hariç for(;...;), bu durumda tercih ederim for. Yine de -7 bayt için teşekkürler. :)
Kevin Cruijssen, 18-18

Çünkü 2-tamamlayıcı ile kötüyüm ... O kadar kötüyüm demek istediğim Integer.MIN_VALUE(ki 1<<31sanırım ...) ;-)
Olivier Grégoire

4

Octave , 21 bayt

@(x)x(~[0,diff(x)<0])

Çevrimiçi deneyin!

Açıklama:

xGirdi olarak bir vektör al ve bir vektör oluştur[0, diff(x)<0]diff(x) komşu tüm elemanlar arasındaki farkın bulunduğu bir vektör olan bir vektör oluşturun. Yalnızca sıfır ile karşılaştırarak negatif olanları saklayın, bize bırakmak istediğimiz tüm öğelerin bir listesini verin.

Daha sonra tutmak istediğimiz girdi vektöründen elemanları seçeriz.


4

V , 25 bayt

òjälá k$yl+@"òç-/d
ç /dw

Çevrimiçi deneyin!

HexDump:

00000000: f26a e46c e120 6b24 796c 2b40 2218 f2e7  .j.l. k$yl+@"...
00000010: 2d2f 640a e720 2f64 77                   -/d.. /dw

İş için en kötü dil. Ama bunu bir cüret için yaptım .


6
Not: Ojalá umarım için İspanyolcadır .
Dennis,

2
@dennis Bu harika. k$yl+@"òç-/dİspanyolca ne için?
DJMcMayhem

7
k$yl+@"òç-/dliberal olarak Ouch
Luis Mendo

3

Üçgensellik , 71 bayt

.....).....
....IEL....
...)rFD)...
..2+)IE)w..
.+h)2_stDO.
={M)IEm}...

Çevrimiçi deneyin!

Nasıl çalışır?

) IEL) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} - Tam program.
) IE - 0 girişini alın ve değerlendirin.
   L) r - Ve [0 ... uzunluğunu I) aralığına bastırın.
      F {- Bu aralıktaki tamsayıları tatmin eden filtre:
       D) 2+) IE) w + h) 2_stDO = - Bu durum. Her E elemanını ayrı olarak çalıştırır.
                                    Kriterlere uymayanları istifleyin ve atın.
       D) 2+ - Çoğaltın ve ikinci kopyaya 2 ekleyin.
           ) IE - Tekrar al.
              ) - Yığına bir 0 basın.
               w - 0'ı bir listeye sarın. [0]
                + - Ben'e bağımlı.
                 h - Baş. E + 2 indeksinden sonra elemanları kesin.
                  ) 2_ - Değişken -2.
                     st - Kuyruk.
                       DO = - Sonucun sıralama üzerinde değişmez olup olmadığını kontrol edin.
                           M) IEm} - Son bölüm: girişin indekslenmesi.
                           M} - Koşulları sağlayan her bir dizin için:
                            ) IEm - Bu pozisyondaki I elementini al.

2
Meraktan uzak (Üçgenliğin yaratıcısı olduğunuzdan beri): neden bir kodun otomatik olarak no-op noktalarıyla doldurulduğu Hexagony / Cubically gibi bir şey yapmıyorsunuz? Öyleyse bu program )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}şu anki cevabınızı genişletecek?
Kevin Cruijssen,

@KevinCruijssen Aslında Üçgenliği 2B bir esolang yapmayı planlamıştım, ama fikrimden vazgeçtim, bu yüzden önceki şablonuma sadık kaldım. Sanırım Üçgenlik v2'yi yayınladığımda büyük değişiklikler yapacağım. (Ayrıca mevcut haliyle golf oynamak çok eğlenceli, çünkü basit bir 1-byte satır içi tasarruf size 20: D kazandırabilir ... Ancak, işleri düzeltirken geriye dönük olarak da uygulanır: C)
Bay Xcoder

Bir 2D esolang olarak salıvermeyi planlıyor olsanız bile, yorumum hala (biraz) duruyor. )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}kodunuz olurdu, mevcut şablonunuza genişleyecekti ve sonra bu genişletilmiş şablonda 2B komutlarını uygulayacaktı. DÜZENLEME: .....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}...ve .....).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...ve )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}her üç aynı programı olacaktır.
Kevin Cruijssen,


3

Wolfram Dili (Mathematica) , 33 bayt

Pick[#,Arg[#-{0}~Join~Most@#],0]&

Çevrimiçi deneyin!

Nasıl çalışır

Kod # - {0}~Join~Most@#bir diziyi {a,b,c,d,e,f}içine çevirir {a,b-a,c-b,d-c,e-d,f-e}. Buna uygulamak Arg, negatif sayıları Pive olumsuz sayıları belirler 0.

Pick[#, ..., 0]&girişlerinde dışarı seçer #nerede ...bir vardır 0: bizim durumumuzda, önceki eleman çıkarma negatif olmayan bir sayı elde aynen unsurlar. Başka bir deyişle, bunlar tamamen lazydropsorting yaparken saklamak istediğimiz girişlerdir.


3

Wonder , 27 bayt

-> ':1.!> 'sS#<=.cns2.++[0]

Kullanım örneği:

(-> ':1.!> 'sS#<=.cns2.++[0])[8 6 9 9 7 2 3 8 1 3]

açıklama

Ungolfed versiyonu:

(map get 1).(fltr sS <=).(cns 2).(++ [0])

Öncelikle 0, ardışık çiftlerin listesini alın , ilk sayıların <= ikinci sayı olduğu, her çiftin ikinci sayısını aldığı listedeki öğeleri tutun.


3

Wolfram Dili (Mathematica) , 20 bayt

#&@@@Split[#,##>0&]&
(* or *)
Max/@Split[#,##>0&]&

Çevrimiçi deneyin!

açıklama

Input = {8, 6, 9, 9, 7, 2, 3, 8, 1, 3}

Split[#,##>0&]

Kesinlikle gerileyen grup üst üste: {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

Her birinin ilk elemanını alın: {8, 9, 9, 3, 8, 3}


##>0fantezi ve her şey, ama #>#2burada hiçbir şey gerçekten kaydetmiyor ;) (ki bu, programınızın isteğe bağlı tamsayılarla çalışmasını sağlayacaktır, gerçi gerekli değildir).
Martin Ender


3

SWI-Prolog, 44 bayt

[A,B|C]-[A|E]:-B<A,[B|C]-[B|E];[B|C]-E. L-L.

Kullanımı: Çağrı " Liste -X" Liste bir braket kapalı, virgülle ayrılmış listesi örneğin [1,4,5,1,11,6,7] 'dır.


1
Siteye Hoşgeldiniz! :)
DJMcMayhem

2

APL + WIN, 14 bayt

Bir tamsayı vektörünün ekran girişi istemi.

(1,1>2-/v)/v←⎕

2

05AB1E , 6 bayt

ĆÁü›_Ï

Çevrimiçi deneyin!

açıklama

Ć        # append the head of the list
 Á       # rotate right
  ü›     # apply pair-wise greater-than
    _    # logical negate each
     Ï   # keep elements of input that are true in this list

2

Kotlin , 39 bayt

a->a.filterIndexed{i,v->i<1||v>=a[i-1]}

Çevrimiçi deneyin!

Birinci öğe olan öğeleri filtreleyin (dizin == 0, hatta daha kısa dizin <1) VEYA geçerli Değer önceki öğeye eşit veya büyük (a [i-1]).



2

K4 , 10 bayt

Çözüm:

x_/|&<':x:

Örnek:

q)k)x_/|&<':x:8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Açıklama:

Öğenin öncekinden daha az olduğu endeksleri bulun, bu indeksleri girişten kaldırın.

x_/|&<':x: / the solution
        x: / store input as x
     <':   / less-than each-previous
    &      / indices where true
   |       / reverse
 _/        / drop-over
x          / the input

2

Ataşesi , 24 bayt

{Mask[1'(Delta!_>=0),_]}

Çevrimiçi deneyin!

açıklama

Masktüm argümandaki tüm öğeleri, asıl argümanındaki gerçek olmayan öğelere karşılık gelen seçer. 1'(Delta!_>=0)Son dizide olması gereken öğelere karşılık gelen endeksleri hesaplar.

Diğer girişimler

28 bayt (noktasuz): ~Mask#(1&`'##Delta#`>=#C[0])

32 bayt: {Mask[1'(&`<= =>Slices[_,2]),_]}


2

C # (.NET Core) , 33 + 18 = 51 bayt

x=>x.Where((a,n)=>n<1||x[n-1]<=a)

Çevrimiçi deneyin!

temel olarak ifade, x dizideki ilk int'dir veya önceki sayıya eşit veya daha büyükse, onu saklayın. Başka bırak onu.


1
Bir dönebilirsiniz IEnumerable. Hiçbir ToArray()gerekli.
Pavel

@Pavel Ekstra bir referans eklemem gerekecek System.Collectionsve bu, kaldırılmak için kaydedilen tüm baytları olumsuzlar ToArray().
Dennis.Verweij

Hayır, IEnumerablecevabında referans almadığınız için , sadece geri dönüş tipi olarak kullanın.
Pavel

@Pavel tamam teşekkürler, bazen bayt ya da değil ... Özür saymak biraz emin değilim
Dennis.Verweij

1

Swift 4 , 56 55 bayt

{var l=0;print($0.filter{($0>=l,l=$0).0})}as([Int])->()

Çevrimiçi deneyin!

açıklama

{var l=0;           // Declare variable l
print($0.filter{(   // Print every element e in the input
  $0>=l,            //   where e >= l
  l=$0).0})         //   And set l to e
}as([Int])->()      // Set the input type to integer array

1

Jöle , 9 bayt

0;>ƝżµḢÐṂ

Çevrimiçi deneyin!

Bu oldukça hantal hissediyor, eğer daha iyi bir yol varsa o kadar da şaşırtıcı olmaz.

0;>ƝżµḢÐṂ
   Ɲ       For each adjacent pair in the input...
  >        ...is the first element greater than the second? (yields a list of 0/1)
0;         prepend a zero to this list (always keep the first element)
    ż      zip with the input
     µ     new monadic link
       ÐṂ  keep elements of the list with minimal value of... (Ðḟ would have worked here and been slightly more clear but I'll leave it as it is)
      Ḣ    ...their first element

1

Brain-Flak , 136 , 120 bayt

((())){{}([{}]({}))([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}(({})<>)(())(<>)}{}([][()])}{}{}<>{{}({}<>)<>}<>

Burada biçimlendirilmiş ve "okunabilir" .

((()))
{
    {}

    ([{}]({}))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

    {
        {}(({})<>)(())(<>)
    }

    {}

    ([][()])

}{}{}<>

{
    {}
    ({}<>)<>
}<>

Çevrimiçi deneyin!

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.