การเรียงลำดับแบบสูญเสีย (ใช้ Dropsort)


61

Dropsortซึ่งออกแบบโดย David Morgan-Mar เป็นตัวอย่างของ "อัลกอริทึมการเรียงลำดับ" แบบ linear-time ที่สร้างรายการที่จริงแล้วเรียงลำดับแล้ว แต่มีองค์ประกอบดั้งเดิมบางส่วนเท่านั้น องค์ประกอบใด ๆ ที่ไม่ได้มีขนาดใหญ่เท่ากับองค์ประกอบสูงสุดก่อนหน้านั้นจะถูกลบออกจากรายการและทิ้งไป

ในงานนี้คุณจะได้รับรายการจำนวนเต็มเป็นอินพุต (STDIN หรือฟังก์ชันอาร์กิวเมนต์คุณจะต้องสนับสนุนอย่างน้อยช่วงของเลขจำนวนเต็มที่มีการลงนามแบบ 8 บิต 8 บิต) งานของคุณคือการลดระดับพวกมันแล้วส่งออกองค์ประกอบที่เหลือใน ใบสั่ง.

คุณอาจคิดว่ารายการนั้นไม่ว่างเปล่า

นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดชนะ

กรณีทดสอบ

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

ลีดเดอร์บอร์ด

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
ตรวจสอบhighest < currentหรือไม่ หรือhighest <= current?
Morgan Thrapp

7
highest (so far)<=currentเก็บองค์ประกอบปัจจุบันถ้า
SuperJedi224

เราสามารถสมมติว่าจะมีองค์ประกอบอย่างน้อยหนึ่งรายการในรายการได้หรือไม่?
lirtosiast

@ThomasKwa: ใช่
SuperJedi224

19
ประสิทธิภาพที่ดีขึ้น Dropsorts สามารถประหยัดเงินเป็นจำนวนมากหากใช้ในระบบบัญชีเงินเดือน
PyRulez

คำตอบ:


42

APL, 9 ไบต์

⊢(/⍨)⊢=⌈\

นี่คือรถไฟฟังก์ชั่น monadic พร้อมแผนภาพ:

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

รุ่นที่ไม่ใช่รถไฟคือ

{⍵/⍨⍵=⌈\⍵}

โดยทั่วไปจะตรวจสอบว่าแต่ละองค์ประกอบเท่ากับจำนวนการรันสูงสุดหรือไม่

โปรดทราบว่าโซลูชัน J ของ Martin Büttnerมีความยาวเท่ากันและได้รับการโพสต์ก่อน


41
คะแนนโบนัสเพราะมันดูน่ารัก
Sammitch

22
โค้ดดูเหมือนเพื่อนที่ไม่พอใจที่พนังแมว
58

2
ฉันไม่รู้มากเกี่ยวกับการนับจำนวนไบต์และการเข้ารหัสแบบใดที่ต้องการใช้ แต่ตามmothereff.in/byte-counterและmeta.codegolf.stackexchange.com/questions/4944/…นี่คือ 17 ไบต์และbytesizematters comคือ 13.
DLeh

3
@DLeh นั่นคือใน UTF-8 APL มีการเข้ารหัสแบบดั้งเดิมที่เป็น 1 ไบต์ต่ออักขระ APL จากก่อนที่จะมี Unicode อยู่
isaacg

3
@DLeh bytesizematters ใช้อัลกอริทึมที่สร้างขึ้นเพื่อนับไบต์ซึ่งไม่ (และไม่สามารถ ) สอดคล้องกับการเข้ารหัสที่เกิดขึ้นจริง
Dennis

21

J, 10 9 ไบต์

#~(=>./\)

เวอร์ชัน CJam ของฉันในความคิด (น้อยกว่าไบต์) เช่น:

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

คำอธิบาย

ก่อนอื่นเราจะได้รับค่าสูงสุดของแต่ละคำนำหน้าด้วย:

    >./\

(ที่นี่>.คือผู้ประกอบการสูงสุด/พับตัวดำเนินการนั้นลงในรายการและ\รับส่วนนำหน้าทั้งหมดของอินพุต)

จากนั้นเราเปรียบเทียบรายการเริ่มต้นกับ maxima เหล่านั้นเพื่อความเท่าเทียมกัน:

  (=>./\)

และสุดท้ายเราเลือกองค์ประกอบทั้งหมดที่รายการผลลัพธ์บูลีนนี้ให้1:

#~(=>./\)

16

Haskell, 28

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

ฟังก์ชั่นที่ไม่ระบุชื่อ เรียกว่าชอบ

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

เทียบเท่ากับการเรียกซ้ำ

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

แปลซ้ำแล้วซ้ำอีกเราวนองค์ประกอบและสำหรับแต่ละรายการที่เราเห็นเราจะลบสิ่งที่เล็กกว่านั้นออกจากส่วนที่เหลือของรายการที่เราทำซ้ำ ขอขอบคุณที่ Antisthenes (x<)สำหรับไบต์บันทึกด้วย


ทำไมไม่ลองแลมบ์ดา? ควรบันทึกอักขระสองสามตัว ...
MathematicalOrchid

@MathematicalOrchid ถ้าคุณหมายถึงfoldr(\x->(x:).filter(>=x))[]มันจะมีความยาวเท่ากัน
xnor

อา ฉันเพิ่งเห็นตัวกรองในตอนท้ายและคิดว่า "เฮ้คุณสามารถทำแกงนั้น! ไม่ได้เกิดขึ้นกับฉันว่าการx:บังคับให้คุณเพิ่มตัวดำเนินการจุด อ๋อ ...
ทางคณิตศาสตร์หรือออร์

1
มันO(n^2)แม้ว่า การเปรียบเทียบที่ไม่จำเป็นจำนวนมาก ;-(
ภูมิใจ haskeller

ทำไมไม่เปลี่ยน (> = x) เป็น (x <) มันจะประหยัด 1 byte
Antisthenes

10

Python 2, 49

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

1
มันอัศจรรย์มาก.
Morgan Thrapp

1
@ThomasKwa ปัญหาคือคุณหยุดสายเรียกซ้ำได้อย่างไร คุณจำเป็นต้องมีกรณีที่ว่างเปล่าแม้ว่าการป้อนข้อมูลไม่รวมกรณีที่
Bakuriu

ปัญหาที่เกิดขึ้นคือมันไม่เป็นเส้นตรงเนื่องจากmax(a)
njzk2

1
@ njzk2 ความท้าทายไม่จำเป็นต้องมีการใช้งานในเวลาเชิงเส้น
feersum

3
@ njzk2 รหัสที่ดีเสร็จสิ้นล่าสุด!
feersum

10

JavaScript (ES6), 29

การใช้การแปลงประเภทมาตรฐานในจาวาสคริปต์อย่างไม่ถูกต้องอาร์เรย์เป็นจำนวน:

  • อาร์เรย์ของจำนวนเพียง 1 => จำนวนนั้น
  • any array อื่น ๆ => 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>


ว้าว. ฉันคิดว่า 38 ไบต์นั้นใกล้เคียงที่สุด เห็นได้ชัดว่าฉันผิดมาก +1
ETHproductions

การทดสอบตามตาราง ดี!
slebetman



7

Brachylogขนาด 5 ไบต์

⊇ᶠ↔ᵒt

ลองออนไลน์!

เยลลี่ 5 ไบต์

ŒPUÞṪ

ลองออนไลน์!

คำอธิบาย

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

นี่เป็นสถานการณ์ที่ไม่ค่อยเกิดขึ้น: ฉันจะใช้อัลกอริทึมที่ (เท่าที่ฉันสามารถบอกได้อย่างรวดเร็วด้วยสกิม) ไม่มีใครใช้จนถึงตอนนี้และมันก็จบลงที่ความยาวเท่ากันในสองภาษาที่แตกต่างกันมาก ชุด builtin พร้อมการติดต่อแบบ 1 ต่อ 1 ระหว่างโปรแกรม (คำสั่งยังอยู่ในลำดับเดียวกัน!) ดังนั้นจึงเป็นเรื่องที่สมเหตุสมผลที่จะรวมมันเข้าด้วยกัน - ในลักษณะนี้เป็นโปรแกรมเดียวกันและฉันเขียนมันลงในทั้งสองภาษาเพื่อดูว่าสั้นกว่า - แยกออกจากกัน

แนวคิดพื้นฐานที่นี่คือการลดลงของรายการคือการเรียงลำดับที่มีการย้อนกลับสูงสุดของพจนานุกรม อย่างแปลกประหลาดทั้ง Brachylog และ Jelly ไม่มีบิวอินเพื่อหาค่าสูงสุดโดยฟังก์ชั่นเฉพาะ (Jelly มีบิวอินเพื่อส่งคืนค่าสูงสุดทั้งหมดโดยฟังก์ชั่นเฉพาะ แต่นั่นจะส่งกลับรายการเดี่ยวที่มีผลลัพธ์มากกว่าผลลัพธ์เองและ ยังไม่สั้นกว่าทำอย่างนี้) ดังนั้นเราจึงสร้างลำดับที่เป็นไปได้ทั้งหมดเรียงลำดับโดยย้อนกลับใช้เวลาสุดท้าย

สาเหตุที่ทำให้งาน "ย้อนกลับสูงสุด lexicographically" คือผลลัพธ์ที่เลือกจะต้องสิ้นสุด (ดังนั้นมันจะต้องเริ่มกลับ) ด้วยจำนวนสูงสุดในรายการอินพุต (มันง่ายที่จะเห็นว่าเอาต์พุต dropsort จะจบลงด้วยเสมอ) และสามารถ ไม่มีอะไรหลังจากนั้น (เพราะการเรียงลำดับรักษาลำดับ) ทำซ้ำเหนี่ยวนำและเราจบลงด้วยความหมายของ dropsort


6

Mathematica, 26 ไบต์

DeleteDuplicates[#,#>#2&]&

2
ฉันไม่รู้จัก Mathematica แต่สิ่งที่การโทรDeleteDuplicatesไม่เหมือนจะส่งคืน{10, 10, 10, 10}เพื่อป้อนข้อมูล{10, 10, 10, 9, 10}
Dennis

2
@Dennis: ใช่ฉันทดสอบ เคล็ดลับคือว่าฉันผ่าน "มากกว่า" เป็น "การทดสอบ" เทียบเท่า ใช่มันเป็นการใช้ฟังก์ชั่นในทางที่ผิด แต่ใช้งานได้และการเข้ารหัสกอล์ฟไม่ได้เกี่ยวกับแนวทางปฏิบัติด้านการเขียนโปรแกรมที่ดีที่สุด
celtschk

2
ตกลงทั้งๆที่ชื่อแนะนำDeleteDuplicatesด้วยสองข้อโต้แย้งที่ดูเหมือนว่าจะเป็นตัวกรองที่เรียบง่าย
เดนนิส

5

R, 29 26 ไบต์

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

นี้จะสร้างวัตถุฟังก์ชั่นที่ยอมรับเวกเตอร์xและส่งกลับหลังจากลบองค์ประกอบทั้งหมดไม่ได้อยู่ที่อย่างน้อยมีขนาดใหญ่เป็นของสะสมสูงสุดxx

บันทึก 3 ไบต์ด้วย flodel!


รูปแบบฟังก์ชั่นจะสั้นลง
flodel

@flodel คุณพูดถูก ขอบคุณ!
Alex A.

4

K, 11 ไบต์

{x@&~x<|\x}

ในการดำเนินการ:

  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}เป็นไบต์ที่สั้นกว่า
kirbyfan64sos

@ kirbyfan64sos: การใช้ eachprior ไม่ได้ผลลัพธ์ที่ถูกต้อง 3 4 2 2 5พิจารณากรณีการป้อนข้อมูล
JohnE

อ่าฉันเข้าใจแล้ว การแก้ไขจะเป็น{x@&~<':x}/แต่นั่นก็คือความยาวเท่ากัน
kirbyfan64sos

3

Java, 82 ไบต์

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

นี่คือลูปเอาท์พุตอย่างง่าย มันแค่เก็บค่าสูงสุดmและเปรียบเทียบแต่ละองค์ประกอบ


1
คุณสามารถลดได้โดยใช้แลมบ์ดา:a->{int m=a[0]...
แดเนียลเอ็ม

ใช่คุณมักจะสามารถ ฉันไม่ชอบ lambda-ize java golfs
Geobits

3

Perl, 33 ไบต์

รหัส 32 ไบต์ + -p

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

หากพื้นที่เพิ่มเติมเป็นที่ยอมรับในการส่งออกสามารถ 31 ไบต์โดยการลบและ ?ยอมรับสตริง (หรือจำนวนของการขึ้นบรรทัดใหม่) ผ่าน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

แรงเดรัจฉานสวย เปลี่ยนเป็นฟังก์ชั่นเพราะฉันพลาดว่ามันเป็นคำตอบที่ถูกต้อง

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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 ไบต์

ที่บันทึกไว้ 1 ไบต์ขอบคุณที่JArkinstall

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

1
คุณสามารถแทนที่วงเล็บชุดใดชุดหนึ่งของคุณด้วย a $เพื่อลดขนาดด้วยไบต์เดียว! f(x:y:s)|x>y=f$x:s|1>0=x:f(y:s);f s=s (เซมิโคลอนใช้เพราะความคิดเห็นไม่อนุญาตการขึ้นบรรทัดใหม่)
JArkinstall

3

C # - 6864 หรือ 132127 ตัวละคร

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

Whereในกรณีนี้คือวนซ้ำผ่านรายการและสำหรับแต่ละองค์ประกอบvที่ดัชนีiในรายการให้ประเมินนิพจน์บูลีน หากนิพจน์ประเมินค่าเป็นจริงรายการจะถูกเพิ่มในผลลัพธ์ เคล็ดลับที่แท้จริงเพียงอย่างเดียวสำหรับนิพจน์บูลีนคือวงจรสั้น C # หรือการประเมินผลทันทีที่เงื่อนไขประเมินเป็นจริง สิ่งนี้จะป้องกันIndexOutOfRangeExceptionข้อยกเว้นและเก็บองค์ประกอบแรกในรายการ

หากอินพุตและเอาต์พุตต้องเป็นสตริง (ฉันไม่สามารถบอกได้อย่างแน่นอนดังนั้นฉันจะปล่อยให้ OP และส่วนที่เหลือของคุณตัดสินใจ)

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

การบีบอัดที่บิตให้:

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

ในกรณีนี้บรรทัดที่สองของฟังก์ชั่นใช้ตรรกะเดียวกันกับข้างต้น คว้าองค์ประกอบของรายการและแปลงให้Select intการเรียกใช้ToList1บังคับให้เลือกที่จะถูกประเมินค่าและเปลี่ยนvarเป็นList<int>เวลาคอมไพล์เพื่อให้การWhereดำเนินการกับคอลเลกชันของจำนวนเต็ม

ลองใช้กับ C # Pad

ขอบคุณVisualMelon ที่ช่วยตัดแต่ง 4 ไบต์และ 5 ไบต์ตามลำดับ :)

1 รายการตู


หากฉันผิดพลาดหรือหากคำอธิบายของฉันต้องการคำอธิบายโปรดแจ้งให้เราทราบ :)
TheB

1
ทำได้ดีมาก - คุณสามารถบันทึกได้สองสามไบต์โดยใช้ลูกเล่นทั่วไป - คุณไม่ต้องการช่องว่างหลังจากการประกาศอาร์เรย์int[]f(int[]b)เป็นเรื่องปกติและคุณสามารถใช้i<1แทนi==0การย่อให้ตรวจสอบเล็กน้อย สำหรับรุ่นสตริงคุณยังสามารถวางวงเล็บไว้รอบ ๆ อาร์กิวเมนต์เดียวในแลมบ์ดา (เช่น(d)=>int.Parse(d)สามารถd=>int.Parse(d)ฉันยังนับ 67 ไบต์เท่านั้นไม่ใช่ 68 ใน orignal ของคุณ)
VisualMelon

@VisualMelon - ขอบคุณ! ฉันคิดว่าการผิดพลาดใด ๆ จะทำให้การรวมทั้งหมดใหญ่ขึ้น ;)
TheB

3

CJam, 15 ไบต์

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

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

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 ไบต์

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

หรือ

C: 49 ไบต์

(ถ้าส่วนหัวของศุลกากรสำหรับการแข่งขัน codegolf ได้รับอนุญาต)

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

ยังไม่สามารถเอาชนะ CJam ได้ แต่อย่างน้อยก็อนุญาตให้เอาชนะภาษาอื่นได้ไม่กี่ภาษา


4
ขออภัยส่วนหัวที่กำหนดเองไม่ได้รับอนุญาต มันจะนับเป็นภาษาอื่น
lirtosiast

4
ปัญหาหลักของส่วนหัวที่กำหนดเองของคุณคือคุณเผยแพร่หลังจากการแข่งขันเริ่มต้นขึ้น
เดนนิส

แน่ใจว่าฉันเข้าใจ แต่แล้วฉันไม่สามารถใช้มันไม่ได้ในการแข่งขันในอนาคต?
GameDeveloper

@DarioOO คุณทำได้ แต่คุณจะต้องรวมคำสั่งการนำเข้าต่อจำนวนไบต์ของคุณ
SuperJedi224

หรือเพียงแค่เรียกมันว่าภาษาใหม่
CalculatorFeline

2

ล้อเลียน 13 ไบต์

โซลูชัน 11 ไบต์ที่ผ่านการทดสอบกรณี:

-.2CO:so)[~

ลองออนไลน์ได้ที่นี่

คำอธิบาย:

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

อย่างไรก็ตามรุ่นนี้ใช้งานได้โดยใช้ความจริงที่ว่าไม่มีตัวเลขขนาดเล็กสองตัวอยู่ระหว่างตัวเลขสองตัว มิฉะนั้นให้ใช้รุ่นด้านล่าง (ซึ่งคือ 13B):

รุ่นเก่ากว่า:

J-]{cm-1.>}LO

ลองออนไลน์ที่นี่ คำอธิบาย:

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

หากคุณวางตัวเลขที่เท่ากันคุณก็สามารถใช้.>แทนcmได้ นอกจากนี้ถ้ารายการมีเพียงตัวเลขบวกคุณสามารถใช้อย่างใดอย่างหนึ่ง0หรือแทน-1J-]


ใช่ แต่ฉันไม่สามารถเชื่อมโยงหลายมิติได้ :)
mroman

แก้ไขแล้ว. ฉันจะเพิ่มบรรทัด "ลองออนไลน์ที่นี่"
mroman


2

Ruby, 41 37 ตัวอักษร

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

วิ่งตัวอย่าง:

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]สั้นกว่า.compact
ไม่ใช่ว่า Charles

อุ่ย แน่นอน. ขอขอบคุณ. (หมายเหตุถึงตัวฉันเอง: ยังไม่พอที่จะถอนรากถอนโคน [link codegolf.stackexchange.com/questions/363/ …สำหรับการเล่นกอล์ฟใน Ruby [/ link] ฉันควรจดจำพวกเขาด้วย)
จัดการ

2

NARS2000 APL ขนาด 13 ไบต์

NARS2000 เป็นล่าม APL ฟรีสำหรับ Windows; มันมีคุณสมบัติหลายชุดที่เข้าถึงได้กับผู้ประกอบการ

(+⍦∩⌈\)

นี่คือส้อมแบบ monadic ที่ใช้จุดตัดหลายเซ็ต ( ⍦∩) ของอินพุต ( +) * และรายการของการวิ่งสูงสุด ( ⌈\)

เนื่องจากไม่ใช่อักขระ APL มาตรฐานในการเข้ารหัส APL หนึ่งไบต์เราต้องใช้ UTF-8 ทำให้⍦∩⌈อักขระแต่ละตัวมีสามไบต์ ฉันเลือก+แทนที่จะบันทึกสองไบต์

NARS2000 รองรับส้อมซึ่งสามารถสร้างขึ้นในรถไฟได้โดยไม่ต้องใช้วงเล็บ แต่ต่างจาก Dyalog ซึ่งไม่อนุญาตให้มีการมอบหมายงานโดยไม่ต้องห่อหุ้มฟังก์ชันไว้ในวงเล็บ

* +มีความซับซ้อนทางเทคนิคคอนจูเกต แต่อินพุตเป็นจริง


ดังนั้นทำไมcodegolf.stackexchange.com/questions/61808/ไม่ใช้ที่นี่ด้วย
แมว

NARS2000 ไม่สามารถใช้การเข้ารหัส APL แบบดั้งเดิม - และแม้กระทั่งก่อนที่กฎที่การเข้ารหัสจะต้องเป็นตัวแปลที่ใช้จริงโดยล่ามนี้ไม่สามารถมีขนาด 7 ไบต์ได้เนื่องจาก psi ไม่ได้เป็นส่วนหนึ่งของการเข้ารหัส APL แบบดั้งเดิม
lirtosiast

2

> <>ด้วยแฟล็ก -v, 36 31 + 2 = 33 ไบต์

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

อินพุตรายการบนสแต็กด้วย -v เพื่อให้อิลิเมนต์แรกของรายการอยู่ที่ด้านบนของสแต็ก มันจะพิมพ์รายชื่อหยดที่มีพื้นที่ต่อท้าย

ทดสอบการทำงาน:

$ 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

แก้ไข: บันทึก 5 ไบต์ด้วย Fongoid


คุณสามารถบันทึก 5 ไบต์ได้โดยการเปลี่ยนบรรทัด 1 เป็น:&\o" "&n:~& <และบรรทัด 2 เป็น~ >l?!;:&:&(?!^
Fongoid

@Fongoid ขอบคุณอัปเดต!
แอรอน

2

Python, 102 99 94 + 5 6 บรรทัดใหม่ที่ไม่ใช่ไฟล์สุดท้าย = 107 105 100 ไบต์

(ฉันใช้แท็บสำหรับเยื้อง)

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

ไม่ใช่สิ่งที่ดีที่สุด แต่นี่เป็นนัดแรกที่ฉันตีกอล์ฟ ไม่สามารถหาวิธีเรียงลำดับรายการแบบอินไลน์โดยไม่พบข้อบกพร่องเกี่ยวกับการลบดังนั้นฉันจึงย้ายองค์ประกอบที่สั่งซื้อไปยังรายการชั่วคราว

แก้ไข: list.append () สั้นกว่าทำแบบน่าเกลียด

r + = [i] สั้นกว่า list.append (); ขอบคุณnjzk2 !


r + = [i] สั้นกว่า r.append
njzk2

ฉันพยายามทำสิ่งนั้นก่อนหน้านี้ แต่มีข้อผิดพลาดเพราะฉันไม่ทราบว่าคุณต้องทำด้วยวงเล็บ ขอบคุณ!
James Murphy

2

สกาล่า: 232 126 120 ไบต์

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
การเพิ่ม "วิธีการขยาย" สำหรับList[Int]ไม่เป็นไปตามข้อกำหนดคุณควรรับอินพุตผ่าน STDIN หรือเป็นอาร์กิวเมนต์ นอกจากนี้ยังขยายคำตอบของคุณ ... ทำไมไม่เพียงแค่มีdef dropSort(s:Seq[Int]):Seq[Int]?
จาค็อบ

ฉันคิดว่ามันจะเป็นแฟนซี แต่คุณขวาทางไบต์มากเกินไป ...
มาร์ติน Seeler

1
การปรับปรุงที่ดีมากโดยใช้การพับ! คุณยังสามารถโกนช่องว่างบางส่วนและคุณยังสามารถใช้ y> = แทน _ <= y ซึ่งให้คำเตือนการคอมไพล์โดยไม่มีการนำเข้าที่เหมาะสม แต่ยังแสดงให้เห็นว่า Scala ยอดเยี่ยมมากเพียงใด
ยาโคบ

ขอบคุณสำหรับเคล็ดลับ!
Martin Seeler

2

สกาลา 54 ไบต์

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

Ungolfed:

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

2

จิ๋ว Lisp, 107 ไบต์

( ภาษานี้ได้รับการตีพิมพ์หลังจากที่คำถามนี้ดังนั้นคำตอบนี้วิ่งออกจากการแข่งขัน. ไม่ว่ามันมีโอกาสที่จะชนะ. ภาษาต่อมาได้พัฒนาต่อไปที่จะมี buildins มากกว่าคนที่ผมใช้ที่นี่ แต่ฉันอยู่กับ รุ่นแรกที่ฉันนำมาใช้ในปี 2015 คำตอบนี้ยังคงทำงานร่วมกับล่ามอย่างเป็นทางการที่ใหม่กว่าแม้ว่ามันจะให้คำเตือนบางอย่างเพราะฉันกำหนดพารามิเตอร์ที่เงา buildin ใหม่(สำหรับการเพิ่ม) ขอบคุณ DLosc สำหรับลิงค์ TIO )aa

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

สิ่งนี้จะกำหนดฟังก์ชั่นds(และฟังก์ชั่นตัวช่วย recursive r) ซึ่งเรียงลำดับอาร์กิวเมนต์ของมันซึ่งจะต้องเป็นรายการของจำนวนเต็ม

r ไม่ใช่ฟังก์ชั่นแบบเรียกซ้ำดังนั้นสำหรับรายการที่มีความยาวมาก ๆ สิ่งนี้อาจเรียกใช้เป็นโอเวอร์โฟลว์สแต็ก

Ungolfed:

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

(ใช่-7ไม่ใช่ตัวอักษรจำนวนเต็มดังนั้นเราต้องกำหนดฟังก์ชั่นเพื่อเป็นตัวแทนพวกมัน) เอาท์พุท:

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

"-7 ไม่ใช่ตัวอักษรจำนวนเต็ม" ฉันยังคงหัวเราะ +1
แมว

คุณใช้อักขระทุกตัวในการสร้างจริงหรือไม่ (ยกเว้นrฉันเดา .. )
CalculatorFeline

@CatsAreFluffy ขออภัยฉันมีปัญหาในการทำความเข้าใจความคิดเห็นของคุณ Tiny Lisp มีฟังก์ชั่นในตัว 7 ตัวและมาโครสามตัวในตัวทั้งหมดนั้นมีชื่อตัวละครเดี่ยว (ฉันเดาว่าจะทำให้ภาษาง่ายต่อการเล่นกอล์ฟ) ด้วยวงเล็บและพื้นที่เป็นไวยากรณ์พิเศษ โปรดทราบว่า Tiny Lisp ไม่ใช่สิ่งประดิษฐ์ของฉัน
Paŭlo Ebermann

อ่าฉันคิดว่าฉันเข้าใจแล้วตอนนี้ ... คุณกำลังเสนอให้ใช้ชื่อตัวละครเดี่ยวแทนds? ฉันคิดว่าสิ่งนี้สามารถทำได้จะบันทึกอีกไบต์ ฉันเดาว่าฉันเลือกdsเป็นตัวย่อสำหรับการจัดเรียงแบบหล่น
Paŭlo Ebermann

เฮ้ฉันเพิ่งสังเกตเห็นสิ่งนี้ งานที่ดี! ตามมติของเมตาฟังก์ชั่นแลมบ์ดาที่ไม่มีชื่อนั้นเป็นรูปแบบการส่งที่ถูกต้องดังนั้นคุณสามารถบันทึกได้ 6 ไบต์ด้วยการกำจัด(d dsและจับคู่)ที่ส่วนท้าย สนามกอล์ฟอื่น ๆ เป็นไปได้ถ้าคุณต้องการใช้ล่ามปัจจุบันของฉันแต่ถ้าคุณต้องการใช้สเป็คในคำถามเดิมก็ไม่เป็นไร :)
DLosc

2

เยลลี่ 5 ไบต์

=»\Tị

โปรดทราบว่าความท้าทายนั้นมาก่อนการสร้างเยลลี่

ลองออนไลน์!

มันทำงานอย่างไร

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.