迷惑なバグがある基本的な並べ替え


28

入力は5-255の正の整数のリスト/シーケンス/ベクトル/配列であり、必ずしも一意ではありません。どのような入力形式が最も適切であり、各整数(および整数の量)が5〜255の範囲から一様にランダムに選択されると想定できます。

目標は、同じ(または同等の)形式で同じリストを出力することですが、昇順(非降順)にソートされます。言語学習の一般的な初期の練習。含める提出物:

  1. 正しく機能し、目標を達成する回答。そして

  2. 迷惑なバグを含む2番目の回答。時間の1%から10%の間、出力は正しい形式で、正しい要素を含むリストである必要がありますが順序は正しくありません(正しくソートされていない任意の順序)。残りの時間、プログラムは正しく動作し、目標を達成する必要があります。

2つの答えには、レーベンシュタイン距離 1 が必要です。つまり、1バイトを削除するか、1バイトを追加するか、1バイトを変更することで、一方から他方を取得できます。

通常の抜け穴を禁止した状態で、2つの回答のうち短い方に基づいて、コードゴルフで通常どおりスコアリングします。

迷惑なバグが入力に依存しない場合、つまり同じ入力を再度使用してもバグが再現されない場合は、10%のボーナス(スコアの減少)(1%から10%の間を除く)。


9
PPCGへようこそ!ボーナスを削除することをお勧めしますが、これはあまり良い方法ではありません。
ミスターXcoder

2
それぞれの可能な入力長の確率は不明です。
-user202729

12
時間の1%から10%の間の仕様入力に対して満たされるべきですか、それとも可能な入力のセット全体に対して満たされるべきですか?いくつかの入力で[5,5,5]は、間違った順序を生成することは不可能です
ルイスメンドー

4
デフォルトのIOフォーマットには微妙な点があります。コードが関数を定義している場合、バグがある可能性がある関数を定義するのではなく、関数を一貫してバグがある定義する可能性があれば問題ありませんか?
-xnor

1
@VadimPonomarenkoこのサイトでは、機能だけでなく完全なプログラムを提供できます。xnorは、作成されたときの1%から10%の関数が、常にバグを持つバグのある関数であるかどうかを尋ねています。あなたの質問の手紙に答えはおそらくノーですが、それがイエスであればもっと楽しいでしょう。
-wizzwizz4

回答:


9

Python 3、36バイト

バグのないバージョン、37バイト

lambda l:sorted(l,reverse=l[-9:]==[])

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

迷惑なバージョン、36バイト

lambda l:sorted(l,reverse=l[9:]==[])

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

これは入力に依存するため、ボーナスの対象にはなりません。
失敗する確率は約2%です。入力長が10より小さい場合、失敗します。

LyricLyの回答と組み合わせると、これは34バイトになります。

lambda l:sorted(l)[::l[9:]>[]or 1]
lambda l:sorted(l)[::l[9:]>[]or-1]

バグのないバージョンではスペースは必要ないと思います。
-wizzwizz4

スペースのない@ wizzwizz4 or1は変数名として解釈され、構文エラーが発生します。
-ovs

9

05AB1E、5 * 0.9 = 4.5バイト

実用的なソリューション

{TLΩi

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

説明

{      # sort input
 TL    # push the range [1 ... 10]
   Ω   # pick a random number in the range
    i  # if true (equal to 1), do nothing

バグを含む解決策

時間の10%で間違ったソリューションを提供します(入力に依存しません)。

{TLΩiR

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

説明

選択された数値がtrueの場合にリストを逆にすることを除いて、作業ソリューションと同じです。


真剣に何だね。出力は正しいカーディナリティーでさえありません。
ジョシュア

@ジョシュアはどういう意味ですか?
エリックアウトゴルファー

オンラインで試してみると、リストのリストが出力されています。
ジョシュア

4
@Joshua TiOリンクには、入力で複数回呼び出された関数の結果を視覚化するのに役立つヘッダー100Fとフッター},が含まれています。これは、動作中のソリューションは常に正しい結果を返しますが、バグのあるソリューションは出力に欠陥があることを示しています。
ミスターXcoder

誰か、アルゴリズムを説明してください。すぐに、トップランクの提出物(またはトップランクの提出物の1つ)を受け入れます。理解できない解決策を受け入れることはできません。
ヴァディムポノマレンコ

7

ゼリー、7 *(100%-10%)= 6.3バイト

Ṣ¹⁵X:¤¡

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

バギー版:

ṢẊ⁵X:¤¡

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

両方のリンクには、コードを100回実行し、そのたびに引数として指定したリストを使用して、結果を返すテストハーネスがあります。

各入力長の確率は次のとおりです。

0.1 - 0.1/(length!)

したがって、長さ1の場合は0%の確率、長さ2の場合は5%、長さ3の場合は8.83 4%、長さ4の場合は9.583̅%など、10%の確率を持つ長さ∞までです。


する必要があります0.1 - 0.1/(length!)
-user202729

@ user202729確かに
エリックアウトゴルファー

Ṣ⁵X’¤¡そしてṢ⁵X¤¡作品はあまりにもすべきである:バギーのバージョンは、<ソートされていない時間の10%を、リストを返し、入力が一様にランダムに選択されていることを考えると、それは2バイトで保存、動作するはずです。
-user202729

このソリューションが気に入らない場合は、明らかにを削除し¹て1バイトを節約できます(バイトのルールカウント数=短い方)。また、の2番目の後に無関係な結合オーバーライン6があり6.6̅%ます。
user202729

@ user202729残念なことに、それはもはや入力に依存しなくなり、¹10%の頻度でソートされないため、「単に削除」することはできません。
エリックアウトゴルファー

6

Python 3、スコア58 57-10%= 51.3

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

バグのないバージョン、57バイト

lambda m:sorted(m)[::random()>.1or 1]
from random import*

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

バグバージョン、57バイト

lambda m:sorted(m)[::random()>.1or-1]
from random import*

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

ボーナスを使用するソリューションを試すことにしました。他のPythonの答えに勝るものはありませんが、考えてみるのは楽しかったです。



4

Groovy、31バイト

バグのあるソリューション:

{a->a.sort()[a[9]?0..-1:-1..0]}

実用的なソリューション:

{a->a.sort()[a[0]?0..-1:-1..0]}

Groovyの添字演算子(getAtメソッド)は、インデックスがサイズより大きい場合、リストに対してnullを返します。したがって、9番目の要素がある場合、並べ替えられたリストと同じままになりますが、そうでない場合(1.99203187%の確率)、元に戻ります。ただし、リストのサイズは常に5以上であるため、常に最初の要素が存在します。したがって、0 in a[0]は1、2、3、または4と交換できます。


1
このサイトへようこそ、最初の投稿です!
コメアリンガーアーイング

3

Wolfram言語(Mathematica)、29バイト

これはボーナスで26.1バイトですが、ボーナスを獲得できるかどうかはわかりません。すでにソートされた入力では、両方のバージョンが常にソートされた出力を生成します。

バグのないバージョン(29バイト)

If[RandomReal[]<0.,#,Sort@#]&

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

迷惑なバージョン(30バイト)

If[RandomReal[]<0.1,#,Sort@#]&

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


3

PHP、70バイト

バグのないバージョン、70バイト

<?unset($argv[0]);((rand(1,9)?"":r).sort)($argv);echo join(" ",$argv);

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

バグバージョン、70バイト

<?unset($argv[0]);((rand(0,9)?"":r).sort)($argv);echo join(" ",$argv);

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

バグのあるバージョンは、10%の時間の逆順でソートされます(乱数ジェネレーターに基づく)。


-r(-2バイト)のタグは不要です。アンダースコアで結合します。それは同等である必要があります(-2バイト)。(-1バイト)のasort代わりに使用しますsort
タイタス

...または代わりに、接頭辞(やない)の単語全体を使用しますunset($argv[0]);(rand(1,9)?sort:rsort)($argv);echo join(_,$argv);(また、65バイト)
タイタス

3

Python 2、26バイト

バギー:

lambda l:l[9:]and l.sort()

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

出力入力リストを修正します。リストの長さが少なくとも10の場合にのみリストをソートします。バギーではないバージョンは、常に9a 0に置き換えられます。

ワーキング:

lambda l:l[0:]and l.sort()

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

4バイトのコストでリストを返すように関数を変更できます(合計30バイト):

lambda l:l[9:]and l.sort()or l

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


いくつかの規則の範囲を持つ25バイト:

[list,sorted][id(0)%17>0]

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

id(0)ランダムソースとして使用して、並べ替えまたはIDである関数リテラルを出力します。変更>>=修正する、または0します~0


3

、6バイト

バギー版:

?OIV¦9

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

正しいバージョン:

?OIVK9

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

説明

これらのプログラムは完全に決定的です。実際、Huskは現在、乱数をまったくサポートしていません。

?  V    If any element
    ¦9  is divisible by 9 (in buggy version),
    K9  is truthy when replaced by 9 (in correct version),
 O      sort the list,
  I     otherwise return it unchanged.

バギープログラムの出力は、1%〜2%の確率でソートされていないと主張します。表すN = 251の要素の可能な値の数。長さLのランダムリストに9の倍数が含まれない確率は((NK)/ N)^ Lです。ここで、Kは9で割り切れる値の数です(この例ではK = 28)。合計確率はこの平均で5≤L≤255 1.98パーセント程度です。これらのリストの一部は、すでにソートされているため、誤検知です。ソートされる長さLのランダムリストの確率は、最大で((N + N *(N-1)/ 2)/ N ^ 2)^⌊L/2⌋です:リストを長さのチャンクに分割する場合2、それぞれ⌊L/2⌋チャンクはソートする必要があります。ソートされるリストの合計確率は、5≤L≤255の上記の平均によって制限されます。これは約0.30%です。したがって、関数がソートされていないリストを返す確率は1.67%〜1.98%です。


9で割り切れると、約11%の確率で失敗します。並べ替えを行わなくても、リストが並べ替えられていないことは保証されません。
タイタス

1
@Titus分析でこれに対処します。並べ替えに失敗するのは、9で割り切れる要素がリストに含まれていない場合のみです。この確率は約1.98%です。また、リストが既に並べ替えられている場合、何もしないと並べ替えられたリストが表示されることは事実です。ただし、リストが既にソートされている確率は最大0.30%であり、ソートされていないリストを出力する確率全体が1%を超えるのに十分なほど低くなっています。
-Zgarb

true ...ソートされる入力はバグを変更しません。
タイタス

↓9代わりにを使用して、正しいバージョンに合わせてV¦9短縮できます9か?これは、常に短い入力に失敗すると、常に長いものにcorrecly仕事になるだろうが、入力の長さがランダムな分布に従うので、それはまだ有効な回答でなければなりません
レオ

3

Bash、26バイト

正しいバージョン

s=n
sort -${s:RANDOM%20<0}

オンラインでお試しください!または、確率を確認します。

バグバージョン

s=n
sort -${s:RANDOM%20<1}

オンラインでお試しください!または、確率を確認します。

入力を改行区切りの数値として受け取ります。組み込み変数を使用します。組み込み変数はRANDOM常に0〜32767の範囲の(擬似)乱数を返します%20約5%の失敗率で結果を使用します(@Titusの問題を明確にしてくれてありがとう%10)。

このランダム性は、故障率が入力に依存しないことを意味しますが、故障出力は辞書式にソートされるため、入力配列には少なくとも1桁以上の数字が含まれている必要があります。

代替バージョン、27バイト

((RANDOM+20))||cat&&sort -n

盗聴のバージョンが置き換えられ+%オンラインそれを試してみたり、それが盗聴してみてください


ペニーは、ピッキング:%10復帰のより高いチャンス有する07比べ8または9ので、失敗の可能性が10%以上である。)
タイタス

@タイタスありがとう、私はその事実を忘れていました。%20あなたの答えのように使用するために更新されました。
ジャスティンマリナー

3

Pyth、スコア8 * 0.9 = 7.2

最初のスニペット(正しいもの):

h.uSNT.S

ここで試してみてください!

2番目のスニペット(バグのあるスニペット):

O.uSNT.S

ここで試してみてください!

isaacgのおかげで2バイト(および1.8スコア)節約できました


10個ではなく9個の新しいコピーで十分だと思います。.S入力を変更せずに返す可能性があるということは、それらの(まれな)場合、間違った答えを得る可能性が10%から0%に低下することを意味します。もちろん、10枚でも問題ありません。
ミシャラヴロフ

@MishaLavrov私は説明を間違えましたが、今は対処しました。私は言った.S、入力自体返される可能性があります(問題にはならないだろう)が、私は意味.Sもソートされたリストを返すことがあります
ミスターXcoder

そう、それも私が意味したことです。
ミシャラヴロフ

同じ考えですが、短い:O.uSNT.S
isaacg

2

JavaScript(ES6)、24バイト

バグのないバージョン(少なくとも0-2147483647の範囲の整数の場合、指定された範囲内のすべてのもの):

a=>a.sort((a,b)=>a-b>>0)

バギー版:

a=>a.sort((a,b)=>a-b>>1)

a)エンジンのソートアルゴリズムとb)1の異なる間違った順序の2つの値を含む入力リストに依存します(その確率が低すぎると判明した場合は、1増加する可能性がありますが、8それだけで範囲内のものをソートしません5-255。)



2

Pushy、9バイト-10%= 8.1

バグのあるソリューション:

g0TUn?};_

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

ワーキングソリューション:

g1TUn?};_

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

バグのあるコードは次のことを行います。

g0TUn?};_

g          \ Sort the stack correctly
 0TU       \ Generate random(0, 10)
    n? ;   \ If this is zero:
      }    \    Cyclically shift the stack right once
        _  \ Print the result

固定コードは単純に変更0します1。のrandom(1, 10)よう0に、ifステートメントは実行されません。


2

MATL7 * 0.9 = 6.3 6 * 0.9 = 5.4バイト

バギー版:

Gr.9<?S

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

説明:

G        % Grab input
 r       % Push a random number between 0 and 1
  .9     % Push 0.9
    <    % Check if the random number is smaller than 0.9
     ?   % If true
      S  % Sort input
         % Implicit output

バグのないバージョン:

Gr9<?S

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

説明:

G       % Grab input
 r      % Push a random number between 0 and 1
  9     % Push 9
   <    % Check if the random number is smaller than 9 (always true)
    ?   % If true
     S  % Sort the input
        % Implicit output     



1

R、30 * .9 = 27バイト

(バギー)

function(l)sort(l,runif(1)<.1)

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

(バグではありません)

function(l)sort(l,runif(1)<.0)

バグのあるバージョンdecreasing=Tは、時間の10%でソートされ、uniform(0,1)ディストリビューションからサンプリングされます。バグのないバージョンは常にdecreasing=F


1

ローダ、42バイト-10%= 37.8

バグフリー:

{sort key={|i|currentTime|[_%20//19*0+i]}}

バギー:

{sort key={|i|currentTime|[_%20//19*i+i]}}

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

これは、currentTime関数を使用して乱数を作成します。それらの分布はマシン間で少し異なるようです。比率20//19は、バイトペナルティなしで異なる結果を得るために調整できます(それがより小さい場合を除く99//98)。


1

オクターブ、36 * 0.9 = 32.4バイト

バギー版:

@(x)sort(x)(shift(1:end,+(rand<.1)))

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

バグのないバージョン:

@(x)sort(x)(shift(1:end,+(rand<.0)))

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

これにより、ベクトルが並べ替えられ、乱数が0.1未満の場合、すべての数値が1つ右にシフトされます。


はい、もちろん正しいです:)ありがとう:)
スティーヴィー・グリフィン

1

Javaの8、45 34.2(50 38から10パーセント)バイト

通常版:

a->{if(Math.random()>0.)a.sort(null);}

説明:

ここで試してみてください。

a->{                    // Method with ArrayList<Integer> parameter and no return-type
  if(Math.random()>0.)  //  If the random 0-1 double is larger than 0:
    a.sort(null);       //   Sort the input-List
}                       // End of method

バグバージョン(51 39バイト):

a->{if(Math.random()>0.1)a.sort(null);}

1:のLD 1

説明:

ここで試してみてください。

a->{                     // Method with ArrayList<Integer> parameter and no return-type
  if(Math.random()>0.1)  //  If the random 0-1 double is larger than 0.1:
    a.sort(null);        //   Sort the input-List
}                        // End of method

0

JavaScript、25 * 0.9 = 22.5

new Date%25?x:x.sort()

入力x

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