Penyortiran Lossy (Terapkan Dropsort)


61

Dropsort , dirancang oleh David Morgan-Mar, adalah contoh dari "algoritma pengurutan" waktu-linear yang menghasilkan daftar yang, pada kenyataannya, diurutkan, tetapi hanya berisi beberapa elemen asli. Elemen apa pun yang tidak paling tidak sebesar maksimum elemen sebelumnya hanya dihapus dari daftar dan dibuang.

Dalam tugas ini, Anda akan diberikan daftar bilangan bulat sebagai input (STDIN atau argumen fungsi, Anda harus mendukung setidaknya kisaran bilangan bulat bertanda 8-bit.) Tugas Anda adalah untuk menjatuhkan mereka dan kemudian menampilkan elemen yang tersisa di memesan.

Anda dapat menganggap bahwa daftar ini tidak kosong.

Ini kode golf, jadi program tersingkat menang.

Uji Kasus

Input             Output
1 2 5 4 3 7       1 2 5 7
10 -1 12          10 12
-7 -8 -5 0 -1 1   -7 -5 0 1
9 8 7 6 5         9
10 13 17 21       10 13 17 21
10 10 10 9 10     10 10 10 10

Papan peringkat

var QUESTION_ID=61808,OVERRIDE_USER=39022;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
Apakah cek itu highest < current? Atau highest <= current?
Morgan Thrapp

7
Jaga elemen saat ini jika highest (so far)<=current.
SuperJedi224

Bisakah kita berasumsi bahwa akan ada setidaknya satu elemen dalam daftar?
lirtosiast

@ ThomasKwa: Ya.
SuperJedi224

19
Dropsorts meningkatkan efisiensi dapat menghemat banyak uang bagi perusahaan jika digunakan dalam sistem penggajian.
PyRulez

Jawaban:


42

APL, 9 byte

⊢(/⍨)⊢=⌈\

Ini adalah kereta fungsi monadik dengan diagram:

┌─┼───┐  
⊢ ⍨ ┌─┼─┐
┌─┘ ⊢ = \
/     ┌─┘
      ⌈  

Versi non-kereta adalah

{⍵/⍨⍵=⌈\⍵}

Ini pada dasarnya memeriksa apakah setiap elemen sama dengan berjalan maksimum.

Perhatikan bahwa solusi J Martin Büttner sama panjangnya dengan ini dan diposting pertama kali.


41
Poin bonus karena terlihat lucu.
Sammitch

22
Code terlihat seperti seorang pria yang tidak puas menembaki flap kucing
slebetman

2
Saya tidak tahu banyak tentang penghitungan byte dan pengkodean apa yang dimaksudkan untuk digunakan, tetapi menurut mothereff.in/byte-counter dan meta.codegolf.stackexchange.com/questions/4944/… ini 17 byte, dan bytesizematters. com ini 13.
DLeh

3
@DLeh Itu di UTF-8. APL memiliki encoding lawas sendiri yaitu 1 byte per karakter APL, dari sebelum unicode ada.
isaacg

3
Bytesizematters @DLeh menggunakan algoritma yang dibuat untuk menghitung byte, yang tidak (dan tidak bisa ) sesuai dengan pengkodean yang sebenarnya.
Dennis

21

J, 10 9 byte

#~(=>./\)

Versi kerja dari ide CJam saya (dalam lebih sedikit byte). Misalnya:

   f =: #~(=>./\)
   f 10 10 10 9 10
10 10 10 10
   f 1 2 5 4 3 7
1 2 5 7

Penjelasan

Pertama, kami mendapatkan maksimum setiap awalan, dengan:

    >./\

(Di sini, >.adalah operator maksimum, /melipat operator itu ke daftar, dan \mendapatkan semua awalan input.)

Lalu kami membandingkan daftar awal dengan yang maksimum untuk persamaan:

  (=>./\)

Dan akhirnya, kami memilih semua elemen tempat daftar hasil boolean ini memberi 1:

#~(=>./\)

16

Haskell, 28

foldr(\x l->x:filter(x<)l)[] 

Fungsi anonim. Sebut saja seperti

foldr(\x l->x:filter(x<)l)[] [-7, -8, -5, 0, -1, 1] 
[-7,-5,0,1]

Setara dengan rekursi

f[]=[]
f(x:l)=x:filter(x<)(f l)

Diterjemahkan secara iteratif, kami beralih pada elemen-elemen, dan untuk setiap elemen yang kami lihat, kami menghapus yang lebih kecil dari sisa daftar yang kami iterasi. Terima kasih kepada Antisthenes untuk byte yang disimpan bersama (x<).


Mengapa tidak menjilat lambda? Harus menyimpan beberapa karakter ...
MathematicalOrchid

@MathematicalOrchid Jika Anda maksud foldr(\x->(x:).filter(>=x))[], itu ternyata sama panjangnya.
xnor

Ah. Saya baru saja melihat filter di akhir dan berpikir "hei, Anda bisa menjilatnya!" Tidak terpikir oleh saya bahwa x:memaksa Anda untuk menambahkan operator titik. Oh well ...
MathematicalOrchid

1
itu O(n^2)sekalipun. banyak perbandingan yang tidak dibutuhkan. ;-(
haskeller bangga

Mengapa tidak mengubah (> = x) ke (x <)? Ini akan menghemat 1 byte
Antisthenes

10

Python 2, 49

f=lambda a:a and f(a[:-1])+a[-1:]*(a[-1]==max(a))

1
Ini luar biasa.
Morgan Thrapp

1
@ThomasKwa Masalahnya adalah bagaimana Anda menghentikan panggilan rekursif. Anda perlu kasing kosong meskipun input tidak termasuk kasing.
Bakuriu

masalah dengan itu adalah bahwa itu tidak linier karenamax(a)
njzk2

1
@ njzk2 Tantangan tidak memerlukan implementasi untuk berjalan dalam waktu linier.
feersum

3
@ njzk2 Kode bagus selesai terakhir!
feersum

10

JavaScript (ES6), 29

Menyalahgunakan konversi tipe standar dalam javascript, array ke nomor:

  • array hanya 1 angka => angka itu
  • array lain => NaN

d=l=>l.filter(v=>l>v?0:[l=v])

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;[
  [[1,2,5,4,3,7], [1,2,5,7]]
, [[10,-1,12], [10,12]]
, [[-7,-8,-5,0,-1,1], [-7,-5,0,1]]
, [[9,8,7,6,5], [9]]
, [[10,13,17,21], [10,13,17,21]]
, [[10,10,10,9,10], [10,10,10,10]]
].forEach(t=>( i=t[0],r=d(i),x=t[1],              
  console.log('Test '+i+' -> '+r+(r+''==x+''?' OK':' Fail (expected '+x+')')))
)
<pre id=O></pre>


Wow. Saya pikir 38 byte kira-kira yang terbaik; ternyata saya sangat salah. +1
ETHproduk

Tes didorong meja. Bagus!
Slebetman


7

Pyth, 12 byte

eMfqeTeST._Q

Verifikasi semua kasus uji sekaligus.

Bagaimana itu bekerja

         ._Q  Compute all prefixes of the input.
  f           Filter; for each T in the prefixes:
    eT          Retrieve the last element of T.
      eST       Sort T and retrieve its last element.
   q            Check for equality.
              Keep T if q returned True.
eM            Select the last element of each kept T.

7

Brachylog , 5 byte

⊇ᶠ↔ᵒt

Cobalah online!

Jelly , 5 byte

ŒPUÞṪ

Cobalah online!

Penjelasan

⊇ᶠ↔ᵒt    ŒPUÞṪ
⊇ᶠ       ŒP       On all subsequences of {the input}
   ᵒ        Þ     sort by
  ↔        U      their reverse
    t        Ṫ    then take the last element (i.e. the maximum as given by the sort)

Ini adalah situasi yang langka: saya bisa menggunakan algoritma yang (sejauh yang saya tahu dengan skim cepat) tidak ada yang menggunakan sejauh ini, dan entah bagaimana berakhir dengan panjang yang sama dalam dua bahasa golf yang sangat berbeda dengan sintaks yang sangat berbeda dan set builtin, dengan korespondensi 1-ke-1 antara program (perintahnya bahkan dalam urutan yang sama!). Jadi sepertinya lebih masuk akal untuk menggabungkan mereka - dengan cara, ini adalah program yang sama, dan saya menulisnya dalam kedua bahasa untuk melihat mana yang lebih pendek - daripada mengirimkannya secara terpisah.

Ide dasar di sini adalah bahwa tetes daftar adalah urutannya dengan pembalikan maksimum secara leksikografis. Anehnya, baik Brachylog maupun Jelly tidak memiliki builtin untuk menemukan maksimum dengan fungsi tertentu (Jelly memiliki builtin untuk mengembalikan semua maxima dengan fungsi tertentu, tetapi itu akan mengembalikan daftar tunggal yang berisi hasil daripada hasil itu sendiri, dan juga bahkan tidak lebih pendek daripada melakukannya dengan cara ini). Jadi sebagai gantinya, kami menghasilkan semua kemungkinan berikutnya, urutkan secara terbalik, ambil yang terakhir.

Alasan mengapa "reverse maksimum lexicographically maksimum" bekerja adalah bahwa output yang dipilih harus diakhiri (sehingga kebalikannya harus dimulai) dengan angka tertinggi dalam daftar input (mudah untuk melihat bahwa output dropsort akan selalu berakhir dengan itu), dan dengan demikian dapat tidak mengandung apapun setelah itu (karena mengambil urutan menjaga ketertiban). Ulangi secara induktif dan kita berakhir dengan definisi dropsort.


6

Mathematica, 26 Bytes

DeleteDuplicates[#,#>#2&]&

2
Saya tidak tahu Mathematica, tetapi sesuatu yang memanggil DeleteDuplicatessepertinya tidak akan kembali {10, 10, 10, 10}untuk input{10, 10, 10, 9, 10}
Dennis

2
@ Dennis: Ya, saya mengujinya. Kuncinya adalah bahwa saya lulus "lebih besar dari" sebagai "kesetaraan" tes. Ya, ini adalah penyalahgunaan fungsi itu, tetapi berfungsi, dan golf kode bukan tentang praktik pemrograman terbaik.
celtschk

2
OK, terlepas dari apa namanya, DeleteDuplicatesdengan dua argumen tampaknya menjadi filter sederhana.
Dennis

5

R, 29 26 byte

function(x)x[x>=cummax(x)]

Ini menciptakan objek fungsi yang menerima vektor xdan kembali xsetelah menghapus semua elemen tidak setidaknya sebesar maksimum kumulatif x.

Disimpan 3 byte berkat flodel!


Bentuk fungsi akan lebih pendek.
goda

@flodel Anda benar sekali. Terima kasih!
Alex A.

4

K, 11 byte

{x@&~x<|\x}

Dalam aksi:

  f: {x@&~x<|\x}
  f'(1 2 5 4 3 7
     10 -1 12
     -7 -8 -5 0 -1 1
     9 8 7 6 5
     10 13 17 21
     10 10 10 9 10)

(1 2 5 7
 10 12
 -7 -5 0 1
 ,9
 10 13 17 21
 10 10 10 10)

{x@&~<':x}byte lebih pendek.
kirbyfan64sos

@ kirbyfan64sos: Menggunakan eachprior tidak menghasilkan hasil yang benar. Pertimbangkan kasus input 3 4 2 2 5.
JohnE

Ah, begitu. Perbaikan mungkin {x@&~<':x}/, tapi itu panjangnya sama.
kirbyfan64sos

3

Java, 82 byte

void f(int[]a){int m=a[0];for(int n:a){System.out.print(m>n?"":n+" ");m=n>m?n:m;}}

Inilah loop output sederhana. Itu hanya membuat maks mdan membandingkan setiap elemen.


1
Anda dapat mempersingkatnya dengan menggunakan lambda:a->{int m=a[0]...
Daniel M.

Ya, biasanya Anda bisa. Saya tidak lambda-ize golf java.
Geobits

3

Perl, 33 byte

32 byte kode + -p

$p=$_;s/\S+ ?/$&>=$p&&($p=$&)/ge

Jika spasi tambahan dapat diterima dalam output, bisa 31 byte dengan menghapus dan ?. Menerima string (atau jumlah baris baru yang dipisahkan) melalui STDIN:

perl -pe'$p=$_;s/\S+ ?/$&>=$p&&($p=$&)/ge' <<< '-7 -8 -5 0 -1 1'
-7 -5 0 1
perl -pe'$p=$_;s/\S+ ?/$&>=$p&&($p=$&)/ge' <<< '10 10 10 9 10'
10 10 10 10

3

Python 3, 67

Kekuatan yang cukup kasar. Mengubahnya menjadi fungsi, karena saya melewatkan jawaban yang valid.

def f(i):
 s=[i[0]]
 for n in i[1:]:
  if s[-1]<=n:s+=[n]
 return s

Versi tidak disatukan:

input_numbers = input().split()
sorted_numbers = []
previous_number = int(input_numbers[0])
for number in map(int, input_numbers):
    if previous_number <= number:
        sorted_numbers.append(number)
        previous_number = number
print(sorted_numbers)


3

Haskell, 38 37 byte

Disimpan 1 byte berkat JArkinstall .

f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s)
f s=s

1
Anda dapat mengganti satu set tanda kurung Anda dengan a $untuk dikurangi satu byte penuh! f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s);f s=s (Semi-colon digunakan karena komentar tidak mengizinkan baris baru)
Jake

3

C # - 6864 atau 132127 Karakter

int[]f(int[]b){return b.Where((v,i)=>i<1||b[i-1]<=v).ToArray();}

Wheredalam hal ini adalah iterasi melalui daftar, dan untuk setiap elemen vpada indeks idalam daftar, mengevaluasi ekspresi boolean. Jika ekspresi bernilai true, maka item ditambahkan ke hasilnya. Satu-satunya trik nyata untuk ekspresi boolean adalah bahwa sirkuit pendek C # atau evaluasi segera setelah kondisi bernilai true. Ini mencegah IndexOutOfRangeExceptionpengecualian, dan menyimpan elemen pertama dalam daftar.

Jika input dan output harus berupa string (saya tidak tahu pasti, jadi saya akan menyerahkannya kepada OP dan Anda semua untuk memutuskan.)

string t(string b){var c=b.Split(' ').Select(d=>int.Parse(d)).ToList();return String.Join(" ",c.Where((v,i)=>i<1||c[i-1]<=v));}

Dekompresi yang sedikit memberi:

string t(string b) 
{
    var c=b.Split(' ').Select(d=>int.Parse(d)).ToList();
    return String.Join(" ",c.Where((v, i)=>i<1||c[i-1]<=v));
}

Dalam hal ini baris kedua dari fungsi menggunakan logika yang sama persis seperti di atas. The Selectdiperebutkan unsur-unsur daftar dan mengkonversi mereka ke int. Panggilan ke ToList1 memaksa pilih untuk dievaluasi, dan mengubah varmenjadi List<int>pada waktu kompilasi, sehingga Whereberoperasi pada kumpulan bilangan bulat.

Cobalah di C # Pad

Terima kasih kepada VisualMelon untuk membantu memangkas masing-masing 4 byte dan 5 byte. :)

1 daftar tutu?


Jika saya salah hitung, atau jika penjelasan saya perlu dijelaskan, beri tahu saya. :)
theB

1
Kerja bagus - Anda dapat menyimpan beberapa byte dengan menggunakan beberapa trik umum - Anda tidak perlu spasi setelah deklarasi array int[]f(int[]b)baik-baik saja, dan Anda dapat menggunakan i<1daripada i==0mempersingkat yang memeriksa sedikit. Untuk versi string, Anda juga dapat meletakkan tanda kurung di sekitar argumen-tunggal dalam lambda (misalnya (d)=>int.Parse(d)bisa d=>int.Parse(d). Saya juga hanya menghitung 67 byte, bukan 68, dalam orignal Anda;)
VisualMelon

@VisualMelon - Terima kasih! Saya pikir bahwa salah perhitungan akan membuat total menjadi lebih besar. ;)
theB

3

CJam, 15 byte

q~{_2$<{;}&}*]p

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

q~               Read an evaluate all input.
  {        }*    Reduce; push the first element; or each remaining element:
   _2$           Copy the topmost and second topmost element from the stack.
      <          Check if the topmost is smaller than the second topmost.
       {;}&      If it is, remove it from the stack.
             ]   Wrap the stack i an array.
              p  Print.


2

C: 73 byte

int i,j;i=j=INT_MIN;while(scanf("%d",&j)!=EOF)if(j>=i)printf("%d",j),i=j;

atau

C: 49 byte

(Jika header bea cukai dibuat untuk kompetisi codegolf diizinkan)

I z,y;z=y=INT_MIN;w(s(D,&y)!=E)i(y>z)p(D,y),z=y;}

Masih tidak bisa mengalahkan CJam, tetapi setidaknya ini memungkinkan untuk mengalahkan beberapa bahasa lainnya.


4
Maaf, tajuk khusus tidak diizinkan; itu akan dianggap sebagai bahasa yang berbeda.
lirtosiast

4
Masalah utama dengan tajuk khusus Anda adalah Anda menerbitkannya setelah kompetisi ini dimulai.
Dennis

Tentu saya mengerti, tetapi kemudian saya tidak dapat menggunakannya juga di kompetisi mendatang?
GameDeveloper

@DarioOO Anda bisa, tetapi Anda harus memasukkan pernyataan impor terhadap jumlah byte Anda.
SuperJedi224

Atau sebut saja itu bahasa baru.
CalculatorFeline

2

Burlesque, 13 byte

Solusi 11 byte yang lolos uji kasus:

-.2CO:so)[~

Coba online di sini .

Penjelasan:

-. -- prepend head of list to list
2CO -- n-grams (sliding window) of size 2
:so -- filter sorted lists
)[~ -- map last

Namun, versi ini hanya berfungsi dengan menggunakan fakta, bahwa tidak ada dua angka yang lebih kecil di antara dua angka. Kalau tidak, gunakan versi di bawah ini (yaitu 13B):

Versi yang lebih lama:

J-]{cm-1.>}LO

Coba online di sini. Penjelasan:

J -- duplicate
-] -- head
{
  cm -- compare (returning -1,0 or 1)
  -1.> -- greater than -1
}LO -- Loop

Jika Anda juga akan menurunkan angka yang sama, Anda bisa menggunakan .>alih-alih menggunakan cm. Juga, jika daftar hanya berisi angka positif yang dapat Anda gunakan 0atau -1bukan J-].


Ya, tapi kemudian saya tidak bisa hyperlink :).
mroman

tetap. Saya hanya akan menambahkan baris "coba online di sini".
mroman

2

Minkolang 0,9 , 18 byte

ndN(nd1R`2&dN$I$).

Coba di sini.

Penjelasan

ndN                Take first integer from input
(         $I$).    Repeat until the input is empty and then stop.
 nd1R`             Is the next integer less than the previous one?
      2&dN         If not (i.e., it's greater than or equal to), print it.

2

Ruby, 41 37 karakter

->a{m=a[0];a.map{|n|m>n ?p: m=n}-[p]}

Contoh dijalankan:

2.1.5 :001 > [
2.1.5 :002 >     [1, 2, 5, 4, 3, 7],
2.1.5 :003 >     [10, -1, 12],
2.1.5 :004 >     [-7, -8, -5, 0, -1, 1],
2.1.5 :005 >     [9, 8, 7, 6, 5],
2.1.5 :006 >     [10, 13, 17, 21],
2.1.5 :007 >     [10, 10, 10, 9, 10],
2.1.5 :008 > ].each{ |test| p ->a{m=a[0];a.map{|n|m>n ?p: m=n}-[p]}[test] }
[1, 2, 5, 7]
[10, 12]
[-7, -5, 0, 1]
[9]
[10, 13, 17, 21]
[10, 10, 10, 10]

1
-[p]lebih pendek dari.compact
Bukan Charles

Ups. Tentu saja. Terima kasih. (Catatan untuk diri saya sendiri: tidak cukup hanya dengan upvote [tautan codegolf.stackexchange.com/questions/363/... untuk bermain golf di Ruby [/ tautan], saya juga harus mengingatnya.)
manatwork

2

NARS2000 APL, 13 byte

NARS2000 adalah juru bahasa APL gratis untuk Windows; itu termasuk fitur multiset yang diakses oleh operator.

(+⍦∩⌈\)

Ini adalah garpu monadik yang mengambil persimpangan multiset ( ⍦∩) dari input ( +) * dan daftar maksimum berjalan ( ⌈\).

Karena bukan karakter APL standar dalam pengkodean APL APLIKASI satu byte, kita harus menggunakan UTF-8, ⍦∩⌈masing-masing membuat karakter tiga byte. Saya memilih +bukannya menyimpan dua byte.

NARS2000 mendukung garpu, yang dapat dibangun menjadi kereta tanpa tanda kurung, tetapi tidak seperti Dyalog, ia tidak mengizinkan penugasan ke suatu fungsi tanpa membungkus fungsi dalam tanda kurung.

* +adalah konjugat yang kompleks secara teknis, tetapi inputnya nyata.


Jadi, mengapa codegolf.stackexchange.com/questions/61808/… tidak berlaku di sini juga?
kucing

NARS2000 tidak dapat menggunakan pengkodean APL lawas - dan bahkan sebelum aturan bahwa pengkodean harus benar-benar digunakan oleh penerjemah, ini tidak bisa 7 byte karena psi bukan bagian dari pengkodean APL warisan apa pun.
lirtosiast

2

> <> dengan flag -v, 36 31 + 2 = 33 byte

:&\o " "&n:~& <
~ >l?!;:&:&(?!^

Masukkan daftar pada tumpukan dengan -v sehingga elemen pertama dari daftar berada di bagian atas tumpukan. Ini akan mencetak daftar yang diurungkan dengan ruang tambahan.

Uji coba:

$ for input in "1 2 5 4 3 7" "10 -1 12" "-7 -8 -5 0 -1 1" "9 8 7 6 5" "10 13 17 21" "10 10 10 9 10"; do echo $input '-> ' $(python fish.py dropsort.fsh -v $(echo $input | tac -s ' ')); done

1 2 5 4 3 7 ->  1 2 5 7

10 -1 12 ->  10 12

-7 -8 -5 0 -1 1 ->  -7 -5 0 1

9 8 7 6 5 ->  9

10 13 17 21 ->  10 13 17 21

10 10 10 9 10 ->  10 10 10 10

Sunting: disimpan 5 byte berkat Fongoid


Anda dapat menyimpan 5 byte dengan refactoring baris 1 sebagai :&\o" "&n:~& <dan baris 2 sebagai~ >l?!;:&:&(?!^
Fongoid

@ Longoid terima kasih, diperbarui!
Aaron

2

Python, 102 99 94 + 5 6 baris baru non-file-final = 107 105 100 byte

(Saya menggunakan tab untuk indentasi)

def d(l):
    j=b=0;m=l[j];r=[]
    for i in l:
        (m,b)=[(m,0),(i,1)][i>=m]
        if b>0:r+=[i]
        j+=1
    l[:]=r

Bukan yang terbaik di luar sana, tapi ini adalah kesempatan pertama saya bermain golf kode. Tidak dapat menemukan cara untuk mengurutkan daftar secara inline tanpa mengalami bug yang berhubungan dengan penghapusan, jadi saya memindahkan elemen yang dipesan ke daftar sementara.

EDIT: list.append () lebih pendek daripada melakukannya dengan cara yang jelek

r + = [i] lebih pendek dari list.append (); terima kasih njzk2 !


r + = [i] disingkat dari r.append
njzk2

Saya mencoba melakukan itu sebelumnya, tetapi mendapat kesalahan karena saya tidak menyadari Anda harus melakukannya dengan tanda kurung. Terima kasih!
James Murphy

2

Scala: 232 126 120 byte

def f(x:Int*)=(Seq[Int]()/:x)((r,y)=>r.headOption.filter(y>=).map(_=>y+:r).getOrElse(if(r.isEmpty) y+:r else r)).reverse

2
Menambahkan "metode ekstensi" untuk List[Int]tidak memenuhi persyaratan, Anda harus mendapatkan input melalui STDIN atau sebagai argumen. Plus, itu membengkak jawaban Anda ... Mengapa tidak begitu saja def dropSort(s:Seq[Int]):Seq[Int]?
Jacob

Saya pikir itu akan mewah, tetapi Anda benar, byte terlalu banyak ...
Martin Seeler

1
Peningkatan yang sangat bagus menggunakan lipatan! Anda masih dapat mengurangi beberapa spasi dan Anda juga dapat menggunakan y> = daripada _ <= y yang menghasilkan peringatan kompilasi tanpa impor yang tepat, tetapi juga menunjukkan betapa mengagumkan Scala (oh, dan menghilangkan karakter lain).
Yakub

Terima kasih atas tipnya!
Martin Seeler

2

Scala, 54 byte

def f(x:Int*)=(x:\Seq[Int]())((y,r)=>y+:r.filter(y<=))

Tidak Disatukan:

def dropSort(xs: Seq[Int]): Seq[Int] =
  xs.foldRight(Seq.empty[Int]) { (x, result) =>
    x +: result.filter(r => r >= x)
  }

2

Tiny Lisp, 107 byte

( Bahasa ini hanya diterbitkan setelah pertanyaan ini, jadi jawaban ini berjalan keluar dari kompetisi. Bukan berarti itu punya kesempatan untuk menang. The bahasa kemudian berkembang lebih lanjut untuk memiliki lebih buildins dari yang saya digunakan di sini, tapi aku tinggal dengan versi awalnya saya terapkan pada tahun 2015. Jawaban ini masih bekerja dengan penerjemah resmi yang lebih baru , meskipun memberikan beberapa peringatan karena saya mendefinisikan parameter ayang membayangi buildin baru a(untuk menambahkan). Terima kasih kepada DLosc untuk tautan TIO. )

(d r(q((m a)(i a(i(l(h a)m)(r m(t a))(c(h a)(r(h a)(t a))))()))))(d ds(q((b)(i b(c(h b)(r(h b)(t b)))()))))

Ini mendefinisikan fungsi ds(dan fungsi pembantu rekursifnya r) yang mengurutkan argumennya, yang harus berupa daftar bilangan bulat.

r bukan fungsi ekor-rekursif, jadi untuk daftar yang sangat panjang ini mungkin mengalami stack overflow.

Tidak Disatukan:

(d r
   (q((m a)
      (i a
         (i (l (h a) m)
            (r m (t a))
            (c (h a)
               (r (h a) (t a))
             )
          )
         ()
       )
   ) )
 )
(d ds
  (q(
      (b)
      (i b
        (c (h b)
           (r (h b) (t b))
         )
        ()
       )
   ) )
 )

Berikut adalah beberapa contoh cara menggunakan ini (dengan kasus uji dari pertanyaan):

(d list (q (args args)))
(d -
   (q( (n)
       (s 0 n)
    ) )
 ) 

(ds (list 1 2 5 4 3 7))
(ds (list 10 (- 1) 12))
(ds (list (- 7) (- 8) (- 5) 0 (- 1) 1))
(ds (list 9 8 7 6 5))
(ds (list 10 13 17 21))
(ds (list 10 10 10 9 10))

(Ya, -7bukan bilangan bulat integer, jadi kita harus mendefinisikan fungsi untuk mewakili mereka.) Output:

list
-
(1 2 5 7)
(10 12)
(-7 -5 0 1)
(9)
(10 13 17 21)
(10 10 10 10)

"-7 bukan bilangan bulat literal" Aku masih tertawa, +1
cat

Apakah Anda benar-benar menggunakan setiap karakter untuk builtin? (Kecuali r, saya kira ..)
CalculatorFeline

@CatsAreFluffy maaf, saya punya masalah dalam memahami komentar Anda. Tiny Lisp memiliki 7 fungsi bawaan dan tiga makro bawaan, semuanya memiliki nama karakter tunggal (saya kira membuat bahasa lebih mudah digunakan untuk bermain golf), dengan tanda kurung dan ruang menjadi sintaksis khusus. Perhatikan bahwa Tiny Lisp bukan penemuan saya.
Paŭlo Ebermann

Ah, saya pikir saya mengerti sekarang ... Anda mengusulkan untuk menggunakan nama karakter tunggal, bukan ds? Saya kira ini bisa dilakukan, akan menghemat byte lain. Saya kira saya memilih dssebagai singkatan untuk drop sort.
Paŭlo Ebermann

Hei, aku baru memperhatikan ini. Pekerjaan yang baik! Menurut konsensus meta, fungsi lambda yang tidak disebutkan namanya adalah bentuk pengajuan yang valid, sehingga Anda dapat menyimpan 6 byte dengan menyingkirkan (d dsdan mencocokkan )pada akhirnya. Golf lain dimungkinkan jika Anda ingin menggunakan juru bahasa saya saat ini , tetapi jika Anda ingin tetap menggunakan spesifikasi dalam pertanyaan awal, itu juga tidak masalah. :)
DLosc

2

Jelly, 5 byte

=»\Tị

Perhatikan bahwa tantangan mendahului pembuatan Jelly.

Cobalah online!

Bagaimana itu bekerja

=»\Tị  Main link. Argument: A (list)

 »\    Yield the cumulative maxima of A.
=      Perform element-by-element comparison.
       Yields 1 iff A[n] = max(A[1], ..., A[n]).
   T   Get all indices of truthy elements.
    ị  Retrieve the items of A at those indices.

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.