非可逆ソート(実装ドロップソート)


61

David Morgan-Marが設計したDropsortは、実際にはソートされているが元の要素の一部のみを含むリストを生成する線形時間の「ソートアルゴリズム」の例です。少なくともその前にある要素の最大値よりも大きくない要素は、単にリストから削除されて破棄されます。

このタスクでは、入力として整数のリストが提供されます(STDINまたは関数の引数、少なくとも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
モーガントラップ

7
の場合、現在の要素を保持しhighest (so far)<=currentます。
SuperJedi224

リストに少なくとも1つの要素があると仮定できますか?
リルトシアスト

@ThomasKwa:はい。
SuperJedi224

19
給与システムで利用すると、Dropsortの効率が改善され、企業のコストを大幅に節約できます。
PyRulez

回答:


42

APL、9バイト

⊢(/⍨)⊢=⌈\

これは、ダイアグラムを含む単項関数列です。

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

電車以外のバージョンは

{⍵/⍨⍵=⌈\⍵}

これは基本的に、各要素が現在の最大値に等しいかどうかを確認します。

MartinBüttnerのJソリューションはこれと同じ長さで、最初に投稿されたことに注意してください。


41
かわいく見えるからボーナスポイント。
サミッチ

22
コードは
不機嫌

2
バイトカウントと使用するエンコーディングについてはあまり知りませんが、mothereff.in / byte- countermeta.codegolf.stackexchange.com/questions/4944/よると、これは17バイトで、byteizemattersです。 comポートは13です
DLeh

3
@DLehこれはUTF-8です。APLには、Unicodeが存在する前から、APL文字ごとに1バイトの独自のレガシーエンコーディングがあります。
isaacg

3
@DLeh bytesizemattersは、実際のエンコードに対応しない(および対応できない)バイトをカウントするために、作成されたアルゴリズムを使用します。
デニス

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

説明

まず、各プレフィックスの最大値を取得します:

    >./\

(これ>.が最大演算子であり、/その演算子をリストに折り畳み\、入力のすべてのプレフィックスを取得します。)

次に、初期リストとそれらの最大値が等しいかどうかを比較します。

  (=>./\)

そして最後に、このブール結果のリストが与えるすべての要素を選択します1

#~(=>./\)

16

ハスケル、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)

繰り返し翻訳すると、要素を繰り返し処理し、表示される各要素について、それよりも小さい要素をリストの残りの部分から削除します。で保存されたバイトをアンチステネスに感謝し(x<)ます。


ラムダをカレーしませんか?いくつかの文字を保存する必要があります...
MathematicalOrchid

@MathematicalOrchidを意味する場合foldr(\x->(x:).filter(>=x))[]、それは同じ長さであることがわかります。
xnor

あ。フィルターを最後に見ただけで、「ちょっと、カレーできますよ!」x:ドット演算子を追加する必要があるとは思いませんでした。まあ
MathematicalOrchid

1
それはO(n^2)しかしです。たくさんの不必要な比較。;-(
誇りhaskeller

(> = x)を(x <)に変更しないのはなぜですか?これは、1バイトの節約になります
アンティステネス

10

Python 2、49

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

1
これは素晴らしいです。
モーガントラップ

1
@ThomasKwa問題は、再帰呼び出しをどのように停止するかです。入力でそのケースが除外されている場合でも、空のケースが必要です。
バクリウ

それに伴う問題は、max(a)
–njzk2

1
@ njzk2このチャレンジでは、実装を線形時間で実行する必要はありません。
feersum

3
@ njzk2素敵なコードは最後に終わります!
feersum

10

JavaScript(ES6)、29

javascriptの標準型変換の乱用、配列から数値へ:

  • ちょうど1つの数字の配列=>その数字
  • その他の配列=> 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

テーブル駆動テスト。いいね!
スリーブマン



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)

これはまれな状況です:これまで誰も使用していないアルゴリズムを使用するようになりました(簡単なスキムでわかる限り)。プログラム間の1対1対応の組み込みセット(コマンドは同じ順序です!)。したがって、それらを結合する方が理にかなっているように見えます。ある意味では、これらは同じプログラムです。

ここでの基本的な考え方は、リストのドロップソートが辞書式に最大の逆数を持つサブシーケンスであるということです。奇妙なことに、BrachylogもJellyも、特定の関数によって最大値を見つける組み込み関数を備えていません(Jellyには、特定の関数によってすべての最大値を返す組み込み関数がありますが、結果自体ではなく、結果を含むシングルトンリストを返します。また、この方法で行うよりも短くはありません)。その代わりに、可能なすべてのサブシーケンスを生成し、逆順にソートし、最後のものを取得します。

「辞書編集的に最大の反転」が機能する理由は、選択された出力が入力リストの最大数で終了する必要があるため(その逆が開始する必要があるため)、ドロップソート出力が常にそれで終了することは簡単です) 'その後は何も含みません(サブシーケンスを取得すると順序が保持されるため)。帰納的に繰り返すと、ドロップソートの定義になります。


6

Mathematica、26バイト

DeleteDuplicates[#,#>#2&]&

2
私はMathematicaを知りませんが、呼び出した何かがDeleteDuplicates、それが戻ってくるように見えない{10, 10, 10, 10}入力のために{10, 10, 10, 9, 10}
デニス・

2
@Dennis:確かに、テストしました。秘Theは、「同等」テストとして「より大きい」に合格することです。はい、それはその機能の誤用ですが、それは機能し、コードゴルフはとにかく最高のプログラミングプラクティスに関するものではありません。
celtschk

2
OK、名前が示唆していることにもかかわらず、DeleteDuplicates2つの引数は単純なフィルターのようです。
デニス

5

R、29 26バイト

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

これにより、ベクトルを受け入れ、少なくとも累積最大値以下のすべての要素を削除した後にx戻る関数オブジェクトが作成されます。xx

flodelのおかげで3バイト節約されました!


関数形式は短くなります。
flodel

@flodelまったくその通りです。ありがとう!
アレックス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}1バイト短いです。
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]...
ダニエル・M.

ええ、通常はできます。ただし、Javaゴルフをラムダ化することはありません。
ジオビット

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バイト

JArkinstallのおかげで1バイト節約されました

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

1
括弧のセットの$1つを1バイト全体に削減するために置き換えることができます! 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にある各要素について、ブール式を評価します。式の評価がtrueの場合、アイテムは結果に追加されます。ブール式の唯一の本当のトリックは、条件がtrueと評価されるとすぐに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));
}

この場合、関数の2行目は上記とまったく同じロジックを使用しています。Selectグラブリストの要素とに変換しますintToList1を呼び出すと、選択が強制的に評価され、コンパイル時にがにvar変換されるList<int>ためWhere、整数のコレクションに対して操作が行われます。

C#パッドでお試しください

それぞれ4バイトと5バイトのトリミングを支援してくれたVisualMelonに感謝します。:)

1チュチュリスト?


数え忘れた場合、または説明に説明が必要な場合はお知らせください。:)
theB

1
良い仕事-いくつかの一般的なトリックを使用して数バイトを節約できます-配列宣言int[]f(int[]b)がうまくいった後にスペースを必要とせず、そのチェックを少し短くするi<1よりも使用できますi==0。文字列バージョンについて、あなたはまた、ラムダで単一引数の周りにカッコをドロップすることができる(例えば(d)=>int.Parse(d)可能d=>int.Parse(d)。私はまた、唯一のあなたのorignalで、67のバイトではなく、68を数える;)
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バイト

(コードゴルフ大会用に作成された税関ヘッダーが許可されている場合)

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

それでもCJamに勝るものはありませんが、少なくとも他の言語に勝るものはありません。


4
申し訳ありませんが、カスタムヘッダーは使用できません。別の言語としてカウントされます。
リスト管理者

4
カスタムヘッダーの主な問題は、この競争が始まった後に公開したことです。
デニス

確かにわかりますが、将来の競技でも使用できませんか?
GameDeveloper

@DarioOOできますが、バイトカウントに向けてimportステートメントを含める必要があります。
SuperJedi224

または、単に新しい言語と呼びます。
電卓

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

ただし、このバージョンは、2つの数値の間に2つの小さな数値が存在しないという事実を使用することによってのみ機能します。それ以外の場合は、以下のバージョン(13B)を使用します。

古いバージョン:

J-]{cm-1.>}LO

こちらからオンラインでお試しください。 説明:

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

同様に同じ数をドロップする場合.>は、を使用する代わりにそのまま使用できますcm。また、リストに正数のみが含まれる場合は、のいずれか0または-1代わりに使用できますJ-]


ええ、しかしそれから私はそれをハイパーリンクできません:)。
mroman

一定。「ここでオンラインで試す」という行を追加します。
mroman


2

ルビー、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
チャールズではない

おっと。もちろん。ありがとうございました。(自分への注意:[link codegolf.stackexchange.com/questions/363 / ...に投票するだけでは不十分です。Ruby [/ link]でゴルフをするために、私もそれらを暗記する必要があります。)
manatwork

2

NARS2000 APL、13バイト

NARS2000は、Windows用の無料のAPLインタープリターです。オペレーターアクセスするマルチセット機能が含まれてます

(+⍦∩⌈\)

これは⍦∩、入力(+)*と実行中の最大値のリスト()の多重集合交差()をとるモナドフォークです⌈\

以来1バイトAPLレガシーエンコーディングで標準APL文字ではありません、我々は作り、UTF-8を使用しなければならない⍦∩⌈文字を3バイトずつ。+代わりに2バイトを保存することを選択しました。

NARS2000は、カッコなしでトレインに組み込むことができるフォークをサポートしますが、Dyalogとは異なり、カッコで関数をラップせずに関数に割り当てることはできません。

* +は技術的には複素共役ですが、入力は実数です。


では、なぜcodegolf.stackexchange.com/questions/61808 / ...がここにも適用されないのですか?

NARS2000はレガシーAPLエンコーディングを使用できません-エンコーディングがインタープリターによって実際に使用されるものでなければならないというルールの前でさえ、psiはレガシーAPLエンコーディングの一部ではないため、これは7バイトになりません。
リトシアスト

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

編集:Fongoidのおかげで5バイト節約


1 :&\o" "&n:~& <行目と2 行目をリファクタリングすることで5バイトを節約できます~ >l?!;:&:&(?!^
-Fongoid

@Fongoidありがとう、更新されました!
アーロン

2

パイソン、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

私は前にそれをやってみましたが、ブラケットでそれをしなければならないことに気づかなかったので、エラーになりました。ありがとう!
ジェームズマーフィー

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の素晴らしさを実証することもできます(ああ、別の文字を削ります)。
ジェイコブ

ヒントのためのTHX!
マーティンシーラー

2

Scala、54バイト

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

ゴルフをしていない:

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

2

Tiny Lisp、107バイト

この言語にのみ公開されました。この質問の後なので、この答えは、競争がなくなった。それは勝つためにあらゆる機会がなかっあること。言語は、後で私がここで使用されるものよりも多くのbuildinsを持つことがさらに進化し、私はして滞在しています私はもともと2015年に実装されたバージョン。この答えはまだ新しい公式の通訳で動作します私は、パラメータを定義するので、それはいくつかの警告を与えるものの、新しいbuildin影(追加するために)。TIOリンクのDLoscに感謝を。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(およびその再帰ヘルパー関数r)を定義します。引数は整数のリストでなければなりません。

r は末尾再帰関数ではないため、非常に長いリストの場合、スタックオーバーフローが発生する可能性があります。

ゴルフをしていない:

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

あなたは本当にビルトインのためにすべての単一のキャラクターを使い果たしましたか?(除くr、私は推測します。)
CalculatorFeline

@CatsAreFluffy申し訳ありませんが、コメントの理解に問題があります。Tiny Lispには、7つの組み込み関数と3つの組み込みマクロがあり、それらはすべて単一の文字名(ゴルフでゴルフを使いやすくするためのものだと思います)を持ち、括弧とスペースは特別な構文です。Tiny Lispは私の発明ではないことに注意してください。
パエロエベルマン

ああ、私は今それを手に入れたと思います...あなたは代わりに1文字の名前を使用することを提案していますdsか?私はこれを行うことができ、別のバイトを節約できると思います。dsドロップソートの略語として選択したと思います。
パエロエベルマン

ねえ、私はちょうどこれに気づいた。良くやった!メタコンセンサスによると、名前のないラムダ関数は有効な送信形式であるため、最後に(d ds一致)を削除して6バイトを節約できます。私の現在の通訳を使用したい場合、他のゴルフも可能ですが、元の質問の仕様に固執したい場合は、それも問題ありません。:)
DLosc

2

ゼリー、5バイト

=»\Tị

チャレンジはJellyの作成よりも前に行われます。

オンラインでお試しください!

使い方

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