Sắp xếp tổn thất (Thực hiện Dropsort)


61

Dropsort , được thiết kế bởi David Morgan-Mar, là một ví dụ về "thuật toán sắp xếp" thời gian tuyến tính tạo ra một danh sách, trên thực tế, được sắp xếp, nhưng chỉ chứa một số yếu tố ban đầu. Bất kỳ yếu tố nào không lớn nhất bằng mức tối đa của các yếu tố trước nó sẽ bị xóa khỏi danh sách và bị loại bỏ.

Trong tác vụ này, bạn sẽ được cung cấp một danh sách các số nguyên làm đầu vào (STDIN hoặc đối số hàm, bạn được yêu cầu hỗ trợ ít nhất là phạm vi của các số nguyên có chữ ký 8 bit.) Nhiệm vụ của bạn là loại bỏ chúng và sau đó xuất các phần tử còn lại trong đặt hàng.

Bạn có thể cho rằng danh sách này không trống.

Đây là mã golf, vì vậy chương trình ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

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

Bảng xếp hạng

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
Là kiểm tra highest < current? Hay là highest <= current?
Morgan Thrapp

7
Giữ nguyên phần hiện tại nếu highest (so far)<=current.
SuperJedi224

Chúng ta có thể cho rằng sẽ có ít nhất một yếu tố trong danh sách không?
lirtosiast

@ThomasKwa: Vâng.
SuperJedi224

19
Dropsorts cải thiện hiệu quả có thể tiết kiệm cho công ty rất nhiều tiền nếu được sử dụng trong hệ thống bảng lương.
PyRulez

Câu trả lời:


42

APL, 9 byte

⊢(/⍨)⊢=⌈\

Đây là một hàm chức năng đơn âm với sơ đồ:

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

Phiên bản không phải là tàu

{⍵/⍨⍵=⌈\⍵}

Điều này về cơ bản kiểm tra nếu mỗi phần tử bằng với tối đa chạy.

Lưu ý rằng giải pháp J của Martin Büttner có cùng độ dài với giải pháp này và đã được đăng đầu tiên.


41
Điểm thưởng vì trông dễ thương.
Sammitch

22
Code trông giống như một anh chàng bất mãn bắn vào một cái vỗ mèo
slebetman

2
Tôi không biết nhiều về đếm byte và mã hóa nào được sử dụng, nhưng theo mẹeff.in/byte-c gặpmeta.codegolf.stackexchange.com/questions/4944/, đây là 17 byte và byteizematters. com it 13.
DLeh

3
@DLeh Đó là trong UTF-8. APL có mã hóa kế thừa riêng của nó là 1 byte cho mỗi ký tự APL, từ trước khi unicode tồn tại.
isaacg

3
@DLeh byteizematters sử dụng thuật toán tạo thành để đếm các byte, không (và không thể ) tương ứng với một mã hóa thực tế.
Dennis

21

J, 10 9 byte

#~(=>./\)

Phiên bản làm việc của ý tưởng CJam của tôi (tính bằng ít byte hơn). Ví dụ:

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

Giải trình

Đầu tiên, chúng tôi nhận được tối đa của mỗi tiền tố, với:

    >./\

(Ở đây, >.là toán tử tối đa, /gấp toán tử đó vào một danh sách và \nhận tất cả các tiền tố của đầu vào.)

Sau đó, chúng tôi so sánh danh sách ban đầu với các cực đại cho đẳng thức:

  (=>./\)

Và cuối cùng, chúng tôi chọn tất cả các yếu tố trong đó danh sách kết quả boolean này đưa ra 1:

#~(=>./\)

16

Haskell, 28

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

Một chức năng ẩn danh. Gọi nó như thế

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

Tương đương với đệ quy

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

Được dịch lặp đi lặp lại, chúng tôi lặp đi lặp lại các yếu tố và với mỗi yếu tố chúng tôi thấy, chúng tôi loại bỏ những yếu tố nhỏ hơn nó khỏi phần còn lại của danh sách mà chúng tôi đang lặp đi lặp lại. Cảm ơn Antisthenes cho một byte được lưu với (x<).


Tại sao không cà ri lambda? Nên lưu một vài ký tự ...
Toán học,

@MathologistsOrchid Nếu bạn muốn nói foldr(\x->(x:).filter(>=x))[], điều đó hóa ra có cùng độ dài.
xnor

Ah. Tôi chỉ thấy bộ lọc ở cuối và nghĩ "này, bạn có thể cà ri đó!" Điều đó không xảy ra với tôi rằng x:buộc bạn phải thêm toán tử dấu chấm. Ôi chà ...
Toán học

1
đó là O(n^2)mặc dù. rất nhiều so sánh không cần thiết. ;-(
haskeller tự hào

Tại sao không thay đổi (> = x) thành (x <)? Nó sẽ tiết kiệm 1 byte
Antisthenes

10

Con trăn 2, 49

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

1
Thật đáng kinh ngạc.
Morgan Thrapp

1
@ThomasKwa Vấn đề là làm thế nào để bạn dừng các cuộc gọi đệ quy. Bạn cần trường hợp trống ngay cả khi đầu vào loại trừ trường hợp đó.
Bakuriu

vấn đề với nó là nó không tuyến tính vìmax(a)
njzk2

1
@ njzk2 Thách thức không yêu cầu triển khai để chạy trong thời gian tuyến tính.
frageum

3
@ njzk2 Mã đẹp kết thúc cuối cùng!
frageum

10

JavaScript (ES6), 29

Lạm dụng chuyển đổi loại tiêu chuẩn trong javascript, mảng thành số:

  • mảng chỉ 1 số => số đó
  • bất kỳ mảng nào khác => 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>


Ồ Tôi nghĩ 38 byte là xấp xỉ tốt nhất có thể; Rõ ràng tôi đã rất sai. +1
Sản phẩm ETH

Bảng kiểm tra hướng. Đẹp!
slebetman



7

Brachylog , 5 byte

⊇ᶠ↔ᵒt

Hãy thử trực tuyến!

Thạch , 5 byte

ŒPUÞṪ

Hãy thử trực tuyến!

Giải trình

⊇ᶠ↔ᵒ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)

Đây là một tình huống hiếm gặp: tôi có thể sử dụng một thuật toán (theo như tôi có thể nói với việc đọc lướt nhanh) cho đến nay không ai sử dụng, và bằng cách nào đó nó có cùng độ dài trong hai ngôn ngữ chơi golf rất khác nhau với cú pháp rất khác nhau và các tập hợp dựng sẵn, với sự tương ứng 1-1 giữa các chương trình (các lệnh thậm chí theo cùng một thứ tự!). Vì vậy, dường như có ý nghĩa hơn khi kết hợp chúng - theo một cách nào đó, đây là cùng một chương trình và tôi đã viết nó bằng cả hai ngôn ngữ để xem cái nào ngắn hơn - hơn là gửi riêng chúng.

Ý tưởng cơ bản ở đây là các danh sách nhỏ của danh sách là sự kết hợp của nó với đảo ngược tối đa từ vựng. Điều kỳ lạ là cả Brachylog và Jelly đều không có nội dung tích hợp để tìm mức tối đa theo một chức năng cụ thể (Jelly có tích hợp để trả về tất cả các cực đại bằng một chức năng cụ thể, nhưng sẽ trả về một danh sách đơn có chứa kết quả thay vì chính kết quả đó và thậm chí còn không ngắn hơn làm theo cách này). Vì vậy, thay vào đó, chúng tôi tạo ra tất cả các chuỗi con có thể, sắp xếp theo chiều ngược lại, thực hiện lần cuối.

Lý do tại sao "đảo ngược tối đa từ vựng" hoạt động là vì đầu ra được chọn phải kết thúc (do đó đảo ngược phải bắt đầu) với số cao nhất trong danh sách đầu vào (dễ dàng thấy rằng đầu ra của giọt nước sẽ luôn kết thúc với điều đó), và do đó có thể Không chứa bất cứ thứ gì sau đó (bởi vì việc lấy các phần tiếp theo sẽ giữ trật tự). Lặp lại theo quy nạp và chúng tôi kết thúc với định nghĩa của giọt nước.


6

Toán học, 26 byte

DeleteDuplicates[#,#>#2&]&

2
Tôi không biết Mathicala, nhưng thứ gì đó gọi DeleteDuplicateskhông giống như nó sẽ trở lại {10, 10, 10, 10}cho đầu vào{10, 10, 10, 9, 10}
Dennis

2
@Dennis: Nó, tôi đã thử nó. Bí quyết là tôi vượt qua bài kiểm tra "lớn hơn" như "tương đương". Vâng, đó là việc sử dụng sai chức năng đó, nhưng nó hoạt động và mã golf không chính xác về các thực hành lập trình tốt nhất.
celtschk

2
OK, mặc dù những gì tên cho thấy, DeleteDuplicatesvới hai đối số dường như là một bộ lọc đơn giản.
Dennis

5

R, 29 26 byte

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

Điều này tạo ra một đối tượng hàm chấp nhận một vectơ xvà trả về xsau khi loại bỏ tất cả các phần tử không lớn nhất bằng mức tối đa tích lũy của x.

Đã lưu 3 byte nhờ flodel!


Các hình thức chức năng sẽ ngắn hơn.
flodel

@flodel Bạn hoàn toàn đúng. Cảm ơn!
Alex A.

4

K, 11 byte

{x@&~x<|\x}

Trong hành động:

  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}là một byte ngắn hơn.
kirbyfan64sos

@ kirbyfan64sos: Sử dụng Eachp Warrior không tạo ra kết quả chính xác. Hãy xem xét trường hợp đầu vào 3 4 2 2 5.
JohnE

Ah tôi thấy. Một sửa chữa sẽ được {x@&~<':x}/, nhưng đó là cùng một chiều dài.
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;}}

Đây là một vòng lặp đầu ra đơn giản. Nó chỉ giữ tối đa mvà so sánh từng yếu tố.


1
Bạn có thể rút ngắn nó bằng cách sử dụng lambda:a->{int m=a[0]...
Daniel M.

Vâng, bạn thường có thể. Mặc dù vậy, tôi không chơi golf java lambda-ize.
Geobits

3

Perl, 33 byte

Mã 32 byte + -p

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

Nếu không gian bổ sung được chấp nhận ở đầu ra, có thể là 31 byte bằng cách loại bỏ ?. Chấp nhận một chuỗi (hoặc số chuỗi phân tách dòng mới) thông qua 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

Trăn 3, 67

Lực lượng khá vũ phu. Thay đổi nó thành một chức năng, bởi vì tôi đã bỏ lỡ rằng đó là một câu trả lời hợp lệ.

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

Phiên bản bị đánh cắp:

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

Đã lưu 1 byte nhờ JArkinstall .

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

1
Bạn có thể thay thế một trong các bộ dấu ngoặc đơn của mình bằng một $để cắt giảm toàn bộ một byte! f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s);f s=s (Dấu chấm phẩy được sử dụng vì các bình luận không cho phép dòng mới)
JArkinstall

3

C # - 6864 hoặc 132127 nhân vật

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

Wheretrong trường hợp này là lặp qua danh sách và với mỗi phần tử vtại chỉ mục itrong danh sách, hãy đánh giá biểu thức boolean. Nếu biểu thức ước lượng là true, thì mục được thêm vào kết quả. Thủ thuật thực sự duy nhất đối với biểu thức boolean là C # ngắn mạch hoặc đánh giá ngay khi một điều kiện đánh giá là đúng. Điều này ngăn chặn IndexOutOfRangeExceptionngoại lệ và giữ phần tử đầu tiên trong danh sách.

Nếu đầu vào và đầu ra phải là các chuỗi (tôi không thể chắc chắn, vì vậy tôi sẽ để nó cho OP và phần còn lại của bạn quyết định.)

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));}

Giải nén mà một chút cho:

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));
}

Trong trường hợp này, dòng thứ hai của hàm đang sử dụng logic chính xác như trên. Các Selectlấy các yếu tố của danh sách và chuyển đổi chúng thành int. Cuộc gọi đến ToList1 buộc chọn để được ước tính và biến cuộc gọi varthành List<int>thời gian biên dịch, để cuộc gọi Wheređang hoạt động trên một tập hợp các số nguyên.

Dùng thử trên C # Pad

Cảm ơn VisualMelon đã giúp cắt 4 byte và 5 byte tương ứng. :)

Danh sách 1 tutu?


Nếu tôi hiểu sai, hoặc nếu lời giải thích của tôi cần một số giải thích, xin vui lòng cho tôi biết. :)
theB

1
Công việc tuyệt vời - bạn có thể lưu một vài byte bằng cách sử dụng một số thủ thuật phổ biến - bạn không cần khoảng trắng sau khi khai báo mảng int[]f(int[]b)là tốt và bạn có thể sử dụng i<1thay vì i==0rút ngắn kiểm tra một chút. Đối với phiên bản chuỗi, bạn cũng có thể thả các dấu ngoặc xung quanh một đơn lập luận trong một lambda (ví dụ (d)=>int.Parse(d)có thể d=>int.Parse(d)tôi cũng chỉ đếm 67 byte, không 68, trong orignal của bạn;).
VisualMelon

@VisualMelon - Cảm ơn! Tôi hình dung rằng bất kỳ hành vi sai trái nào cũng sẽ khiến tổng số lớn hơn. ;)
theB

3

CJam, 15 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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;

hoặc là

C: 49 byte

(Nếu tiêu đề hải quan được thực hiện cho các cuộc thi codegolf được cho phép)

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

Vẫn không thể đánh bại CJam, nhưng ít nhất điều này cho phép đánh bại một số ngôn ngữ khác.


4
Xin lỗi, tiêu đề tùy chỉnh không được phép; nó sẽ được tính là một ngôn ngữ khác
lirtosiast

4
Vấn đề chính với các tiêu đề tùy chỉnh của bạn là bạn đã xuất bản chúng sau khi cuộc thi này bắt đầu.
Dennis

Chắc chắn tôi hiểu, nhưng sau đó tôi không thể sử dụng nó trong các cuộc thi trong tương lai?
Nhà phát triển Game

@DarioOO Bạn có thể, nhưng bạn được yêu cầu đưa câu lệnh nhập vào số byte của bạn.
SuperJedi224

Hoặc chỉ gọi nó là một ngôn ngữ mới.
Máy

2

Burlesque, 13 byte

Giải pháp 11 byte vượt qua các trường hợp thử nghiệm:

-.2CO:so)[~

Hãy thử trực tuyến tại đây .

Giải trình:

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

Tuy nhiên, phiên bản này chỉ hoạt động bằng cách sử dụng thực tế, rằng không có hai số nhỏ hơn ở giữa hai số. Nếu không, hãy sử dụng phiên bản bên dưới (là 13B):

Các phiên bản cũ hơn:

J-]{cm-1.>}LO

Hãy thử trực tuyến tại đây. Giải trình:

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

Nếu bạn cũng giảm số lượng bằng nhau, bạn có thể đi với chỉ .>thay vì sử dụng cm. Ngoài ra, nếu danh sách chỉ chứa số dương, bạn có thể sử dụng 0hoặc -1thay vì J-].


Vâng, nhưng sau đó tôi không thể siêu liên kết nó :).
mroman

đã sửa. Tôi sẽ chỉ thêm một dòng "thử trực tuyến tại đây".
mroman

2

Chồn 0,9 , 18 byte

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

Hãy thử nó ở đây.

Giải trình

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 ký tự

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

Chạy mẫu:

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]ngắn hơn.compact
Không phải là Charles

Úi. Tất nhiên. Cảm ơn bạn. (Lưu ý với bản thân tôi: không đủ để chỉ nâng cấp [link codegolf.stackexchange.com/questions/363/ cho việc chơi golf trong Ruby [/ link], tôi cũng nên ghi nhớ chúng.)
manatwork

2

NARS2000 APL, 13 byte

NARS2000 là trình thông dịch APL miễn phí cho Windows; nó bao gồm các tính năng multiset được truy cập với toán tử.

(+⍦∩⌈\)

Đây là một ngã ba đơn âm lấy giao điểm nhiều mặt ( ⍦∩) của đầu vào ( +) * và danh sách các mức tối đa đang chạy ( ⌈\).

không phải là một ký tự APL tiêu chuẩn trong các mã hóa kế thừa APL một byte, chúng ta phải sử dụng UTF-8, làm cho các ⍦∩⌈ký tự ba byte mỗi ký tự. Tôi đã chọn +thay vì để lưu hai byte.

NARS2000 hỗ trợ các dĩa, có thể được xây dựng thành các đoàn tàu không có dấu ngoặc đơn, nhưng không giống như Dyalog, nó không cho phép gán cho một chức năng mà không gói chức năng trong ngoặc đơn.

* +là liên hợp phức tạp về mặt kỹ thuật, nhưng đầu vào là có thật.


Vậy, tại sao codegolf.stackexchange.com/questions/61808/ cũng không áp dụng ở đây?
mèo

NARS2000 không thể sử dụng mã hóa APL cũ - và ngay cả trước quy tắc mã hóa phải là mã hóa thực sự được sử dụng bởi các thông dịch viên, đây không thể là 7 byte vì psi không phải là một phần của bất kỳ mã hóa APL cũ nào.
lirtosiast

2

> <> với cờ -v, 36 31 + 2 = 33 byte

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

Nhập danh sách trên ngăn xếp với -v để phần tử đầu tiên của danh sách nằm ở đầu ngăn xếp. Nó sẽ in danh sách nhỏ giọt với một khoảng trắng ở cuối.

Chạy thử nghiệm :

$ 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

Chỉnh sửa: đã lưu 5 byte nhờ Fongoid


Bạn có thể lưu 5 byte bằng cách tái cấu trúc dòng 1 như :&\o" "&n:~& <và dòng 2 dưới dạng~ >l?!;:&:&(?!^
Fongoid

@Fongoid cảm ơn, cập nhật!
Aaron

2

Python, 102 99 94 + 5 6 dòng mới không phải tệp cuối cùng = 107 105 100 byte

(Tôi đã sử dụng các tab để thụt lề)

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

Không phải là tốt nhất ngoài đó, nhưng đây là lần đầu tiên tôi chơi golf mã. Không thể tìm ra cách sắp xếp danh sách nội tuyến mà không gặp phải các lỗi liên quan đến loại bỏ, vì vậy tôi đã chuyển các phần tử theo thứ tự sang danh sách tạm thời.

EDIT: list.append () ngắn hơn so với thực hiện theo cách xấu xí

r + = [i] ngắn hơn list.append (); cảm ơn njzk2 !


r + = [i] được rút ngắn hơn r.append
njzk2

Tôi đã thử làm điều đó trước đây, nhưng đã gặp lỗi vì tôi không nhận ra bạn phải làm điều đó với dấu ngoặc. Cảm ơn!
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
Thêm một "phương thức mở rộng" cho việc List[Int]không đáp ứng các yêu cầu, bạn sẽ nhận được đầu vào thông qua STDIN hoặc làm đối số. Thêm vào đó, nó làm hỏng câu trả lời của bạn ... Tại sao không chỉ đơn giản là có def dropSort(s:Seq[Int]):Seq[Int]?
Jacob

Tôi nghĩ nó sẽ lạ mắt, nhưng bạn nói đúng, quá nhiều byte ...
Martin Seeler

1
Cải thiện rất tốt bằng cách sử dụng gấp! Bạn vẫn có thể tắt một số khoảng trắng và bạn cũng có thể sử dụng y> = thay vì _ <= y để đưa ra cảnh báo biên dịch mà không cần nhập chính xác, nhưng cũng cho thấy Scala tuyệt vời như thế nào (oh, và loại bỏ một ký tự khác).
Jacob

Thx cho tipp!
Martin Seeler

2

Scala, 54 byte

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

Ung dung:

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

2

Lisp nhỏ, 107 byte

( Ngôn ngữ này chỉ được công bố sau khi câu hỏi này, vì vậy câu trả lời này chạy ra khỏi cuộc thi. Không phải là nó có bất kỳ cơ hội để giành chiến thắng. Các ngôn ngữ sau đó phát triển hơn nữa để có buildins hơn những cái tôi sử dụng ở đây, nhưng tôi ở lại với phiên bản tôi ban đầu triển khai vào năm 2015. Câu trả lời này vẫn hoạt động với trình thông dịch chính thức mới hơn , mặc dù nó đưa ra một số cảnh báo vì tôi xác định tham số ache phủ bản dựng mới a(để thêm). Cảm ơn DLosc cho liên kết 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)))()))))

Điều này xác định một hàm ds(và hàm trợ giúp đệ quy của nó r) sắp xếp đối số của nó, phải là một danh sách các số nguyên.

r không phải là một hàm đệ quy đuôi, vì vậy đối với các danh sách rất dài, điều này có thể chạy vào một tràn ngăn xếp.

Ung dung:

(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))
         )
        ()
       )
   ) )
 )

Dưới đây là một số ví dụ về cách sử dụng điều này (với các trường hợp kiểm tra từ câu hỏi):

(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))

(Vâng, -7không phải là một số nguyên, vì vậy chúng ta phải xác định một hàm để biểu diễn chúng.) Kết quả:

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

"-7 không phải là số nguyên" Tôi vẫn cười, +1
con mèo

Bạn đã thực sự sử dụng hết từng ký tự cho nội trang chưa? (Ngoại trừ r, tôi đoán ..)
Máy

@CatsAreFluffy xin lỗi, tôi có vấn đề hiểu nhận xét của bạn. Tiny Lisp có 7 chức năng tích hợp và ba macro tích hợp, tất cả chúng đều có tên nhân vật duy nhất (tôi đoán để làm cho ngôn ngữ dễ sử dụng hơn để chơi gôn), với dấu ngoặc đơn và dấu cách là cú pháp đặc biệt. Lưu ý rằng Tiny Lisp không phải là phát minh của tôi.
Paŭlo Ebermann

À, tôi nghĩ tôi hiểu rồi ... bạn đang đề xuất sử dụng tên một ký tự thay vì ds? Tôi đoán điều này có thể được thực hiện, sẽ tiết kiệm một byte khác. Tôi đoán tôi đã chọn dsnhư một từ viết tắt cho loại sắp xếp.
Paŭlo Ebermann

Này, tôi chỉ nhận thấy điều này. Công việc tốt! Theo sự đồng thuận của meta, các hàm lambda không tên là một hình thức gửi hợp lệ, vì vậy bạn có thể lưu 6 byte bằng cách loại bỏ (d dsvà kết hợp khớp )ở cuối. Các sân golf khác có thể nếu bạn muốn sử dụng trình thông dịch hiện tại của tôi , nhưng nếu bạn muốn bám sát thông số kỹ thuật trong câu hỏi ban đầu, điều đó cũng tốt. :)
DLosc

2

Thạch, 5 byte

=»\Tị

Lưu ý rằng thách thức trước khi tạo ra Jelly.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

=»\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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.