Terapkan Lazy Drop Sort


26

Tantangan ini sudah menjelaskan tentang portsort. Namun, saya agak malas dan saya benar-benar hanya perlu array saya untuk sedikit lebih banyak diurutkan daripada sebelumnya, tidak perlu diurutkan sepanjang jalan .

Di Drop Sort, kami menjatuhkan setiap elemen kurang dari elemen apa pun sebelumnya. Di Lazzy Drop Sort, kami menjatuhkan setiap elemen kurang dari yang sebelumnya .

Ini sebuah contoh. Pertimbangkan array berikut:

8 6 9 9 7 2 3 8 1 3

Mari kita tandai setiap elemen kurang dari yang sebelumnya.

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

Perhatikan bagaimana tidak 3ada yang ditandai, maupun yang terakhir 8. Mereka semua lebih besar dari elemen tunggal di sebelah kiri mereka.

Melengkapi algoritme, menghapus elemen yang ditandai, kita dapatkan:

8 9 9 3 8 3

Itu pada dasarnya terlihat lebih diurutkan. Agak. Aku malas.

Tugas Anda, seperti yang mungkin telah Anda simpulkan, adalah menerapkan algoritma ini.

Input adalah array setidaknya 1 bilangan bulat positif antara 1 dan 9, sehingga Anda dapat mengambil serangkaian angka juga.

Ini adalah , byte terkecil menang!

Kasus uji tambahan:

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

Apakah bisa fungsi atau harus program yang lengkap?
rafa11111

@ rafa11111 Baik-baik saja
Pavel

Dalam hal ini adalah fungsi, dapatkah array input dikodekan dalam program utama? Dan dapatkah panjang array dilewatkan sebagai input ke fungsi?
rafa11111

@ rafa11111 Input tidak dapat di-hardcode dalam fungsi itu sendiri Tidak masalah bagaimana fungsi mendapatkan input ini dalam program pengujian Anda. Anda dapat mengambil panjang array hanya jika Anda menggunakan C / C ++ atau bahasa lain yang merupakan satu-satunya cara untuk menentukan panjang array.
Pavel

Jawaban:


6

Sekam , 4 byte

m←ġ<

Cobalah online!

Penjelasan

m←ġ<
  ġ<    Group the numbers into decreasing sequences
m←      Keep the first element of each sequence

15

JavaScript (ES6), 28 25 byte

Disimpan 3 byte berkat @Shaggy

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

Cobalah online!


2
n=>p<=nakan tampak luar biasa ;-)
ETHproduksi

4
@ ETProduk Untuk +4 byte, (n=p)=>p<=(p=n)berfungsi dengan baik;)
Arnauld

jawaban ini mengejutkan saya, mengapa ini tidak meledak ketika mencoba mengakses puntuk pertama kalinya, ketika belum didefinisikan?
Brian H.

1
@ Shaggy Itu terlihat aman. Akan diperbarui ketika saya kembali di depan komputer. Terima kasih!
Arnauld

2
@Pavel aawalnya diatur ke array input dan a-1akan menghasilkan NaN(kecuali jika berisi bilangan bulat tunggal, dalam hal ini dipaksa ke bilangan bulat ini).
Arnauld


6

MATL , 9 8 byte

Disimpan satu byte berkat Giuseppe.

0yd0<h~)

Cobalah online!


Penjelasan:

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 byte

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

Cobalah online!


1
Terjemahan ke Perl 6perl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert b2gills

@Brad perl6 adalah bahasa yang berbeda (bahkan tidak kompatibel dengan backward) Posting!
wastl

Saya menulis satu yang lebih Perl 6 idiomatik, tapi itu lebih lama. Juga salah satu alasan saya memposting di sini adalah untuk memamerkan bahasa, dan menjelaskannya. Memposting terjemahan itu tidak menunjukkan apa-apa selain menunjukkan bahwa itu adalah versi Perl yang sedikit lebih verbose. Pada dasarnya itu tidak memenuhi alasan mengapa saya memposting di situs ini.
Brad Gilbert b2gills



4

Stax , 5 byte

âÿ╠╦░

Jalankan dan debug ini secara online

Membongkar, tidak menarik, dan mengomentari kodenya, kita dapat ini.

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

Jalankan yang ini

Urutan instruksi canggung tetapi ada alasan untuk itu. Pengemasan kode sumber stax tidak selalu menghasilkan output ukuran yang sama untuk input ukuran yang sama. Pada dasarnya, Anda memiliki kesempatan untuk menyimpan byte jika karakter sumber terakhir memiliki kode karakter yang lebih rendah. Nah, !memiliki salah satu kode terendah yang bisa Anda dapatkan untuk karakter yang dapat dicetak. (33 khusus) Banyak program 6ax ASCII stax tidak dapat mengemas lebih kecil. Tetapi jika mereka diakhiri dengan a !, maka mereka bisa. Jadi alasan untuk pemesanan instruksi khusus ini adalah untuk memastikan bahwa logika tidak berakhir pada akhir program.


4

J, 12 Bytes

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

Penjelasan:

#~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

Contoh:

    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

Cobalah online!


Solusi bagus! Saya menambahkan tautan TIO untuk kode Anda.
Galen Ivanov

4

Jelly , 6 byte

>Ɲ0;¬×

I / O menggunakan string.

Cobalah online!


Saya ingin tahu, mengapa beroperasi pada string dan bukan array? Saya diberi tahu Jelly buruk dalam hal string.
Pavel

2
Ini. ×seharusnya tidak bekerja untuk pengulangan karakter, tetapi itu berhasil.
Dennis

4

Java 8, 66 55 48 byte

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

-11 byte setelah tip dari @ OlivierGrégoire .
-7 byte lagi berkat @ OlivierGrégoire .

Penjelasan:

Cobalah online.

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

Mengapa semua orang mulai menggunakan ~0ketika itu pada dasarnya -1. Secara pribadi saya akan memilih solusi yang lebih intuitif jika byte-count memiliki panjang yang sama (kecuali untuk while(...)vs for(;...;), dalam hal ini saya lebih suka for. Terima kasih untuk -7 byte, meskipun. :)
Kevin Cruijssen

Itu karena saya buruk dengan 2-pelengkap ... Saya sangat buruk saya ingin maksud Integer.MIN_VALUE(yang kemudian 1<<31, saya kira ...) ;-)
Olivier Grégoire

4

Oktaf , 21 byte

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

Cobalah online!

Penjelasan:

Ambil vektor xsebagai input, dan buat vektor [0, diff(x)<0], di mana diff(x)vektor dengan perbedaan antara semua elemen yang berdekatan. Pertahankan hanya yang negatif dengan membandingkannya dengan nol, memberi kami daftar semua elemen yang ingin Anda jatuhkan.

Kami kemudian memilih elemen dari vektor input yang ingin kami pertahankan.


4

V , 25 byte

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

Cobalah online!

Hexdump:

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

Bahasa terburuk untuk pekerjaan itu. Tapi saya melakukannya dengan berani .


6
Catatan: ojalá adalah bahasa Spanyol untuk semoga .
Dennis

2
@dennis Itu keren. Untuk apa bahasa k$yl+@"òç-/dSpanyol?
DJMcMayhem

7
k$yl+@"òç-/dmungkin diterjemahkan secara bebas sebagai Aduh, siapa yang membiarkan pintu lemari itu terbuka?
Luis Mendo

3

Triangularity , 71 byte

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

Cobalah online!

Bagaimana itu bekerja?

) IEL) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} - Program lengkap.
) IE - Dapatkan 0 input I dan mengevaluasinya.
   L) r - Dan dorong rentang [0 ... panjang I).
      F {- Filter bilangan bulat dalam rentang ini yang memuaskan:
       D) 2+) IE) w + h) 2_stDO = - Kondisi ini. Menjalankan setiap elemen E secara terpisah
                                    susun dan buang yang tidak memenuhi kriteria.
       D) 2+ - Gandakan dan tambahkan 2 ke salinan kedua.
           ) IE - Ambil saya lagi.
              ) - Dorong 0 ke tumpukan.
               w - Bungkus 0 dalam daftar. [0]
                + - Tambahkan ke I.
                 h - Kepala. Potong elemen setelah indeks E + 2.
                  ) 2_ - Literal -2.
                     st - Tail.
                       DO = - Periksa apakah hasilnya tidak berubah.
                           M) IEm} - Bagian terakhir: pengindeksan ke input.
                           M} - Untuk setiap indeks yang memenuhi persyaratan:
                            ) IEm - Ambil elemen I pada posisi itu.

2
Karena penasaran (karena Anda adalah pencipta Triangularity): mengapa tidak melakukan sesuatu yang mirip dengan Hexagony / Cubically, di mana sepotong kode secara otomatis diisi dengan titik-titik no-op? Jadi program ini )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}yang mana yang akan berkembang menjadi jawaban Anda saat ini?
Kevin Cruijssen

@KevinCruijssen Karena saya sebenarnya berencana membuat Triangularity menjadi 2D esolang, tapi saya menyerah pada ide itu jadi saya hanya menempel pada template saya sebelumnya. Saya pikir saya akan segera membuat beberapa perubahan besar, ketika saya merilis Triangularity v2. (Juga agak menyenangkan untuk bermain golf di dalamnya dalam bentuk saat ini, karena 1-byte save inline mungkin malah menghemat 20: D ... Ini juga berlaku surut ketika memperbaiki barang-barang: C)
Mr. Xcoder

Yah, bahkan jika Anda berencana untuk merilisnya sebagai esolang 2D, komentar saya tetap (agak). )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}akan menjadi kode Anda, itu akan diperluas ke template Anda saat ini, dan kemudian lakukan perintah 2D pada template yang diperluas. EDIT: .....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}...dan .....).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...dan )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}akan ketiganya menjadi program yang sama persis.
Kevin Cruijssen


3

Bahasa Wolfram (Mathematica) , 33 byte

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

Cobalah online!

Bagaimana itu bekerja

Kode # - {0}~Join~Most@#mengubah sebuah array {a,b,c,d,e,f}menjadi {a,b-a,c-b,d-c,e-d,f-e}. Menerapkan Argini menetapkan angka negatif ke Pidan nomor non negatif ke0 .

Pick[#, ..., 0]&picks keluar entri dari #mana ...memiliki 0: dalam kasus kami, persis unsur-unsur yang menghasilkan sejumlah nonnegatif ketika Anda kurangi elemen sebelumnya. Dengan kata lain, ini adalah entri yang ingin kita simpan ketika lazydropsorting.


3

Bertanya-tanya , 27 byte

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

Contoh penggunaan:

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

Penjelasan

Versi tidak disatukan:

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

Prepend 0, dapatkan daftar pasangan berurutan, simpan item daftar tempat angka pertama <= angka kedua, dapatkan angka kedua dari setiap pasangan.


3

Bahasa Wolfram (Mathematica) , 20 byte

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

Cobalah online!

Penjelasan

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

Split[#,##>0&]

Kelompokkan elemen berurutan yang benar-benar menurun: {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

Ambil elemen pertama dari masing-masing: {8, 9, 9, 3, 8, 3}


##>0mewah dan segalanya, tetapi tidak benar-benar menyimpan apa pun di #>#2sini;) (yang akan membuat program Anda bekerja dengan bilangan bulat sewenang-wenang, bukan berarti itu diperlukan).
Martin Ender


3

SWI-Prolog, 44 byte

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

Penggunaan: Panggil " Daftar -X" di mana Daftar adalah daftar yang tertutup tanda kurung, misalnya koma [1,4,5,1,11,6,7].


1
Selamat datang di situs ini! :)
DJMcMayhem

2

APL + WIN, 14 byte

Meminta input layar dari vektor bilangan bulat.

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

2

05AB1E , 6 byte

ĆÁü›_Ï

Cobalah online!

Penjelasan

Ć        # 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 byte

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

Cobalah online!

Saring item yang merupakan item pertama (indeks == 0, atau bahkan indeks yang lebih pendek <1) ATAU Nilai saat ini lebih besar atau sama dengan item sebelumnya (a [i-1]).



2

K4 , 10 byte

Larutan:

x_/|&<':x:

Contoh:

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

Penjelasan:

Temukan indeks di mana elemen kurang dari sebelumnya, hapus indeks ini dari input

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

2

Attache , 24 byte

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

Cobalah online!

Penjelasan

Mask memilih semua elemen dari argumen kedua yang sesuai dengan elemen kebenaran dalam argumen pertamanya. 1'(Delta!_>=0)menghitung indeks yang sesuai dengan elemen-elemen yang seharusnya berada dalam susunan akhir.

Upaya lain

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

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


2

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

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

Cobalah online!

pada dasarnya pernyataan adalah di mana x adalah int pertama dalam array, atau lebih besar dari atau sama dengan angka sebelumnya, simpanlah. Jatuhkan itu.


1
Anda dapat mengembalikan IEnumerable. Tidak ToArray()dibutuhkan
Pavel

@Pavel Saya perlu menambahkan referensi tambahan System.Collections, dan itu akan meniadakan semua byte yang disimpan untuk menghapus ToArray().
Dennis. Verweij

Tidak, karena Anda tidak akan merujuk IEnumerablepada jawaban, gunakan saja sebagai tipe pengembalian.
Pavel

@Pavel oke terima kasih, kadang-kadang saya agak tidak yakin kapan harus menghitung byte atau tidak ... maaf
Dennis.Verweij

1

Swift 4 , 56 55 byte

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

Cobalah online!

Penjelasan

{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

Jelly , 9 byte

0;>ƝżµḢÐṂ

Cobalah online!

Ini terasa sangat besar, tidak akan terkejut jika ada cara yang lebih baik.

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 byte

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

Ini diformat dan "dibaca" .

((()))
{
    {}

    ([{}]({}))

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

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

    {}

    ([][()])

}{}{}<>

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

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.