遅延ドロップソートを実装する


26

この課題は、すでにドロップソートについて説明しています。しかし、私はちょっと怠け者だと私は本当に私の唯一の配列は、もう少しソート以前よりもする必要があり、それはソートする必要はありませんすべての方法を

ドロップソートでは、その前の要素よりも小さいすべての要素をドロップします。レイジードロップソートでは、厳密に先行する要素よりも小さい要素をすべて削除します。

以下に例を示します。次の配列を検討してください。

8 6 9 9 7 2 3 8 1 3

前の要素よりも小さい要素をすべてマークしましょう。

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

どちら3もマークされていないことに注意してください8。それらはすべて、左側の単一の要素よりも大きくなっています。

アルゴリズムを完了し、マークされた要素を削除すると、次のようになります。

8 9 9 3 8 3

それは基本的にもっとソートされているよう見えます。ちょっと。私は怠け者。

あなたがすでに推論したかもしれないあなたの仕事は、このアルゴリズムを実装することです。

入力は1〜9の少なくとも1つの正の整数の配列であるため、数字のストリングも使用できます。

これは、最少バイトが勝ちます!

追加のテストケース:

1
1

1 2 3
1 2 3

5 3 1
5

1 2 3 2 1
1 2 3

1 1 1 9 9 9 1 1 1 9 9 9 1 1 1
1 1 1 9 9 9 1 1 9 9 9 1 1

9 9
9 9

5 2 4 2 3
5 4 3

関数にすることも、完全なプログラムにする必要がありますか?
rafa11111

@ rafa11111どちらでも構いません
パベル

関数の場合、入力配列をメインプログラムにハードコーディングできますか?そして、配列の長さを関数への入力として渡すことができますか?
rafa11111

@ rafa11111入力を関数自体にハードコーディングすることはできません。関数がテストプログラムでこの入力をどのように取得するかは問題ではありません。配列の長さを決定できる唯一の方法であるC / C ++または別の言語を使用している場合にのみ、配列の長さを取ることができます。
パベル

回答:



15

JavaScript(ES6)、28 25バイト

@Shaggyのおかげで3バイト節約

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

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


2
n=>p<=n
素晴らしく

4
4バイトの場合@ETHproductionsは、(n=p)=>p<=(p=n)正常に動作します。)
アルノー

この答えは私の心を吹き飛ばしています、なぜpまだ定義されていないときに初めてアクセスしようとしたときにこれが爆発しないのですか?
ブライアンH.

1
@Shaggyそれは安全そうです。コンピューターの前に戻ると更新されます。ありがとう!
アーナウルド

2
@Pavel aは、最初は入力配列に設定され、a-1結果とNaNなります(単一の整数が含まれていない限り、この場合、この整数に強制されます)。
アルノー


6

MATL9 8バイト

Giuseppeのおかげで1バイト節約できました。

0yd0<h~)

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


説明:

0                 % Push a zero
 y                % Implicitly grab the input and duplicate it.
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [8 6 9 9 7 2 3 8 1 3]
  d               % The difference between each number of the last element:
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [-2, 3, 0, -2, -5, 1, 5, -7, 2]
   0<             % Which are negative?
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [1 0 0 1 1 0 0 1 0]
     h            % Concatenate. Stack: [8 6 9 9 7 2 3 8 1 3], [0 1 0 0 1 1 0 0 1 0] 
      ~           % Negate. Stack: [8 6 9 9 7 2 3 8 1 3], [1 0 1 1 0 0 1 1 0 1]
       )          % Index. Stack: [8 9 9 3 8 3]

5

Perl 5 .10.0 + -nl、16バイト

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

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


1
Perl 6への翻訳perl6 -ne '$/>$_||.say;$/=$_'
Brad Gilbert b2gills

@Brad perl6は異なる言語です(後方互換性さえありません)。
wastl

私はより慣用的なPerl 6であるものを書きましたが、それはより長くなりました。また、私がここに投稿する理由の1つは、言語を自慢して説明することです。その翻訳を投稿しても、それがPerlのもう少し冗長なバージョンであることを示すだけです。基本的に、私がこのサイトに投稿した理由はどれも満たしていない。
ブラッドギルバートb2gills



4

スタックス、5 バイト

âÿ╠╦░

これをオンラインで実行してデバッグする

コードを展開、アンゴルフ、コメント化すると、これが得られます。

Z   Push a zero under the input
f   Use the rest of the program as a filter on the input.  Output passing elements.
>   Current element is greater than previous?
_~  Push current element to the input stack; when the main stack is empty, pops fall back to this
!   Logical not; applies to the result of the greater-than

これを実行する

命令の順序は厄介ですが、それには理由があります。Staxソースコードのパッキングは、同じサイズの入力に対して常に同じサイズの出力を生成するとは限りません。基本的に、sourceの最後の文字の文字コードが低い場合、バイトを保存する機会があります。まあ、!印刷可能な文字のためにあなたが得ることができる最も低いコードの1つを持っています。(具体的には33)多くの6バイトASCII staxプログラムは、これより小さくパックできません。しかし、それらがで終わる場合、!できます。したがって、命令のこの特定の順序付けの理由は、論理がプログラムの最後にならないようにするためです。


4

J、12バイト

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

説明:

#~1,2&(<:/\)    | Whole function, executed as a hook
       <:/      | Distribute <: (greater or equal) over an array
    2&(   \)    | Apply to each sub array of length 2
  1,            | Append a 1 to the front
#~              | Choose elements from the original array

例:

    2&(<:/\) 8 6 9 9 7 2 3 8 1 3
0 1 1 0 0 1 1 0 1
    1,2&(<:/\) 8 6 9 9 7 2 3 8 1 3
1 0 1 1 0 0 1 1 0 1
    (1 0 1 1 0 0 1 1 0 1) # 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3
    f =: #~1,2&(<:/\)
    f 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

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


いい解決策!コードにTIOリンクを追加しました。
ガレンイワノフ


4

Java 8、66 55 48バイト

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

@OlivierGrégoireからのヒントの後の-11バイト。@OlivierGrégoireの
おかげで、-7バイト増えました

説明:

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

l->{                     // Method with Integer-ListIterator parameter and no return-type
  for(int i=0;;)         //  Loop over all items
    if(i>(i=l.next()))   //   If the current item is larger than the next
      l.remove();}       //    Remove this next item

~0基本的に誰もが使用を開始するのはなぜですか-1。個人的には、バイトカウントが同じ長さの場合、より直感的なソリューションを選択します(while(...)vs を除く。このfor(;...;)場合、for。をお
勧めし

それは、私が2の補数が苦手だからです...私はとても悪かったので、それを意味したかったのですInteger.MIN_VALUE1<<31そうですね...);
オリビエグレゴワール

4

オクターブ、21バイト

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

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

説明:

x入力としてベクトルを取り、vector を作成します[0, diff(x)<0]。ここで、diff(x)はすべての隣接する要素間の差を持つベクトルです。ゼロと比較して、負の要素のみを保持し、削除するすべての要素のリストを提供します。

次に、保持したい入力ベクトルから要素を選択します。


4

V、25バイト

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

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

Hexdump:

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

仕事のための最悪の言語。しかし、私はあえてそれをやった。


6
サイドノート:ojaláは、できればスペイン語です。
デニス

2
@dennisいいね。k$yl+@"òç-/dスペイン語は何のためですか?
DJMcMayhem

7
k$yl+@"òç-/dOuch
ルイスメンドー

3

三角度、71バイト

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

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

使い方?

)IEL)rFD)2+)IE)w + h)2_stDO = {M)IEm} –完全なプログラム。
)IE – 0番目の入力Iを取得して評価します。
   L)r –範囲[0 ... I)の長さを押します。
      F {–次の条件を満たすこの範囲の整数をフィルタリングします。
       D)2+)IE)w + h)2_stDO = –この条件。各要素Eを個別に実行します
                                    基準を満たさないものをスタックして破棄します。
       D)2+ –複製し、2番目のコピーに2を追加します。
           )IE – Iを再度取得します。
              )– 0をスタックにプッシュします。
               w –リスト内の0をラップします。[0]
                + – Iの前に追加します。
                 h –頭。インデックスE + 2の後の要素をトリミングします。
                  )2_ –リテラル-2。
                     st –テール。
                       DO = –結果がソートに対して不変かどうかを確認します。
                           M)IEm} –最後の部分:入力へのインデックス付け。
                           M} –条件を満たす各インデックスに対して:
                            )IEm –その位置にあるIの要素を取得します。

2
好奇心から(あなたはTriangularityの作成者であるため):Hexagony / Cubicallyに似たようなことをしてはいけません。それで、このプログラムは)IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}あなたの現在の答えに拡張されるでしょうか?
ケビンクルーッセン

@KevinCruijssen Triangularityを2Dエソランにするつもりだったので、アイデアをあきらめたので、前のテンプレートに固執しました。Triangularity v2をリリースしたら、すぐに大きな変更を加えると思います。(インラインの保存、簡単な1バイトではなく、あなたのセーブ20可能性があるため、また、それは、現在の形でそれでちょっとゴルフに楽しいです:Dは...それはまた、遡及的にものを固定する際に適用けれども:C)
ミスターXcoder

まあ、たとえあなたが2Dのエソランとしてそれをリリースすることを計画しているとしても、私のコメントはまだ(ある程度)立っています。)IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}コードになり、現在のテンプレートに展開され、その展開されたテンプレートで2Dコマンドが実行されます。編集:.....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}...そして.....).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...)IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}3つすべてがまったく同じプログラムになります。
ケビンクルーッセン

3

Python、40バイト

f=lambda h,*t:t and h+f(*t)[h>t[0]:]or h

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

文字のタプルとして入力します。


Python 3、41バイト

p=''
for x in input():x<p or print(x);p=x

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

文字列入力。


Python 2、41バイト

for x in input():
 if x>=id:print x
 id=x

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

文字列がより大きいがid、数字が小さいという理由だけで、文字列入力。


3

Wolfram言語(Mathematica)、33バイト

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

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

使い方

コード# - {0}~Join~Most@#は配列をに{a,b,c,d,e,f}変え{a,b-a,c-b,d-c,e-d,f-e}ます。これに適用するArgと、負の数がにPi、非負の数がに設定され0ます。

Pick[#, ..., 0]&エントリうちピック#場所...がある0:私たちのケースでは、あなたが前の要素を減算非負の数を得、正確要素。言い換えると、これらは、遅延ドロップソート時に保持したいエントリそのものです。


3

ワンダー、27バイト

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

使用例:

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

説明

ゴルフされていないバージョン:

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

Prepend 0、連続するペアのリストを取得し、最初の番号<= 2番目の番号のリスト項目を保持し、各ペアの2番目の番号を取得します。


3

Wolfram言語(Mathematica)、20バイト

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

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

説明

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

Split[#,##>0&]

厳密に減少している連続した要素をグループ化します。 {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

それぞれの最初の要素を取得します。 {8, 9, 9, 3, 8, 3}


##>0派手ですべてですが、#>#2ここでは実際には何も保存されません;)(これは、プログラムを任意の整数で動作させますが、それは必須ではありません)。
マーティンエンダー


3

SWI-Prolog、44バイト

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

使用法:「List -X」を呼び出します。ここで、Listは、[1,4,5,1,11,6,7]のように、括弧で囲まれたコンマ区切りリストです。


1
サイトへようこそ!:)
DJMcMayhem

2

APL + WIN、14バイト

整数のベクトルの画面入力のプロンプト。

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




2

K4、10バイト

溶液:

x_/|&<':x:

例:

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

説明:

要素が前よりも小さいインデックスを検索し、これらのインデックスを入力から削除します

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

2

アタッシュ、24バイト

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

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

説明

Mask最初の引数の真理値要素に対応するすべての要素を2番目の引数から選択します。1'(Delta!_>=0)最終配列にあると想定される要素に対応するインデックスを計算します。

その他の試み

28バイト(ポイントフリー): ~Mask#(1&`'##Delta#`>=#C[0])

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


2

C#(.NET Core)、33 + 18 = 51バイト

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

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

基本的に、ステートメントはxが配列内の最初のintであるか、前の数値以上である場合、それを保持します。それ以外の場合はドロップします。


1
を返すことができIEnumerableます。ToArray()必要ありません。
パベル

@Pavel余分な参照を追加する必要がありますがSystem.Collections、それを削除するために保存されたすべてのバイトが無効になりますToArray()
Dennis.Verweij

いいえ、IEnumerable答えを参照するのではなく、それを戻り値の型として使用するだけです。
パベル

@パベル大丈夫ありがとう、時々バイトをカウントするかどうかわからないことがあります...ごめんなさい
-Dennis.Verweij


1

ゼリー、9バイト

0;>ƝżµḢÐṂ

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

これはかなりかさばりますが、もっと良い方法があれば驚くことではありません。

0;>ƝżµḢÐṂ
   Ɲ       For each adjacent pair in the input...
  >        ...is the first element greater than the second? (yields a list of 0/1)
0;         prepend a zero to this list (always keep the first element)
    ż      zip with the input
     µ     new monadic link
       ÐṂ  keep elements of the list with minimal value of... (Ðḟ would have worked here and been slightly more clear but I'll leave it as it is)
      Ḣ    ...their first element

1

脳フラック136、120のバイト

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

ここではフォーマットされており、「読み取り可能」です。

((()))
{
    {}

    ([{}]({}))

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

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

    {}

    ([][()])

}{}{}<>

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.