バギーコードの記述[​​終了]


17

今こそ、悪いコードを書く能力を誇示するときです。私は、手に負えないCコンテストに最も類似した新しい種類のプログラミングパズルを試しています。主な違いは、これはそれほど悪意のあるものではないということです:それはいくつかの良いきれいな楽しみです。パズルの目標は、できるだけ多くのバグをプログラムに詰めることです。このコンテストの勝者は、キャラクターごとのバグが最も多いプログラムを書いた人です。

明確化を求める膨大なコメントのスレッドを避けるために、今、バグを限定するものと考えるものを定義する必要があります。

まず、バグはエラーではありません。インタープリターがエラーとして検出できる問題(たとえば、不一致の区切り文字、不適切な形式の構文、nullオブジェクトのプロパティへのアクセスなど)、またはプログラムの実行または続行を妨げる場合は、そうではありません。バグ。それ以外の場合、4文字を入力すると、インタープリターは8つの構文エラーをリストし、バグ文字比率2を要求できます。

第二に、バグは明らかに間違っていてはならず、バグはイースターエッグではありません。これは確かに主観的な基準ですが、この種のコンテストには不可欠だと思います。これは、明確な方法でコードを具体的にマングルする条件付きコードを使用できないことを意味します。(読んでください:誰も違いを知らないので、チューリングピット言語を使用してください)。

第三に、バグはもっともらしいものでなければなりません。これは上記のように主観的ですが、バグは、あまり注意を払っていないか、おそらく無知な人、または間違えた人によって書かれたように見えなければなりません。これには、たとえば、オフバイワンのエラーや、有効で正しく見えるが望ましくない動作を引き起こす構文(括弧の代わりに角括弧を使用するなど)が含まれます。

バグは、プログラムに何らかの望ましくない動作を引き起こす可能性があります。これには、例外的な場合の望ましくない出力、一見無関係に見える何かに基づいて異なる動作が含まれますが、これに限定されません奇数または偶数の秒数)、メモリリーク、データの損失など。

問題の例:

すべてのASCII文字を数値の昇順で表示するプログラムを作成します。

回答例:

Brainf ***、5文字、1バグ、0.2バグ文字比

+[+.]

バグ:1のASCII文字を表示しません.+[.+]。に変更することで修正できます。

さて、あなたは今ではほとんど手に入れているはずだと思う、ここにあなたのパズルがあります:

シーザー暗号をデコードし、単語をアルファベット順に並べ替える

シーザー暗号は、一連の文字を取得し、アルファベットのn文字分だけシフトして作成されます。アルファベットの最初または最後までずっと進む場合、AはZの後にあり、ZはAの前にあります。次に例を示します。

Mannequin
Nboofrvjo //Shifted over 1 or -25
Wkxxoaesx //Shifted over 10 -16
Ftggxjnbg //Shifted over -7 or 19

2つの入力が与えられます(入力は取得できますが、合理的には最も便利です)。最初の入力は単語で、2番目の入力はそれがシフトされる値です。タスクは、デコードされた単語を出力し、アルファベット順にソートされた後にデコードされた単語を出力することです。

例(悪い男の子に不快感を与えない、単なる例です):

最初の入力:gtdx wjbfwiji。ljy Gfi hfssty

2番目の入力:5

最初の出力:男の子に報酬が与えられます。悪いことはできません

2番目の出力:悪い男の子は報酬を得ることができません。

幸運を!


あなたの例の2番目の入力は-5ではありませんか?
あなた

@ S.Mark:タスクは暗号をデコードするため、入力は5です。
ナブ

ああ、分かった。@ナブ、ありがとう!
-YOU

大文字と小文字の両方をサポートする必要がありますか?
ジョーイアダムス

1
@Peter:この質問に関連するメタに関する新しいディスカッションを(特に)開始しました。おそらくあなたはコメントしたいと思います。
dmckee

回答:


14

ルビー、136文字、7バグ、比率= 0.051

o=gets[/\d+/].to_i
$,='\s'
a=gets.split(/ /).map{|w|w.gsub(/[^.,:;?!]/){(97+($&.ord-97-o)%26).chr}}
print a.join,a.sort_by{|a|a[0]}.join
  1. [/\d+/]:負の数の記号は削除されています(入力検証のように見えます)

  2. '\s':バックラッシュエスケープは二重引用符で囲まれた文字列内でのみ解釈されるため、スペースは生成されず、リテラルが生成されます \s

  3. split(/ /):プレーンとは異なりsplit、これは改行で分割されません(したがって、最後の単語が改行を保持します)

  4. /[^.,:;?!]/:この正規表現は、句読点を除外しますが、大文字、数字、アンダースコア、および最も重要なのは改行を除外しません

  5. 97:句読点または小文字以外は文字化けします

  6. sort_by{|a|a[0]}:どうやらプログラマはを知らずsort、代わりにこのばかげた方法を使用しました。

  7. print:とは異なりputs、各引数の間に改行を出力しません(したがって、文字列は接着されます)


9

私は自分の答えを受け入れるつもりはありませんが、究極のバギー選別解読器を紹介すると思いました。それの素晴らしいところは、ほとんどのバグを計画していなかったことです。

Brainf ***:483文字、11バグ

,------------------------------------------------[>,---------]<[<]>[>[
->]<[<]>-]>[+++++++++.>]<[---------------------------<]>>[[>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>]>[[>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<-]>]>[[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<-]>]>[[>>>>>>>>>>>+<<<<<<<<<<<-]>]++++++++++.>[[>>>>>>
>>>>>>>>>>+<<<<<<<<<<<<<<<<-]>]>[>+++++++++++++++++++++++++++.]

入力:

5 gtdx wjbfwiji. ljy Gfi hfssty 

出力:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

バグのリスト

入力/表示のバグ:

  1. 非正の数または複数の数字である数は、プログラムを中断します。

  2. 解読者は、ZをAの前に来させません。ASCII文字値を減算するだけです。

  3. スペースはASCII ESC(27)文字として表示されます。

  4. 入力がタブで終了していない場合、プログラムは入力指示の後続行しません。

  5. プログラムは手動で終了する必要があります。停止するまでESC文字を継続的に表示します。

  6. 入力ファイルがASCIIエンコードされていない場合、プログラムは壊れます。

  7. プログラムは、ソートされた出力の最初の文字を表示しません。

ソートバグ:

ソートは非常に単純に実装しました。

  1. ワード数が5に等しくないと、プログラムは中断します。

  2. 入力のバイト数が60を超えると、プログラムは中断します。

  3. プログラムは、アルファベット順が入力例と同じ場合にのみ正しくソートできます。

  4. 単語のいずれかが入力例よりも小さい場合、プログラムは余分なスペースを追加し、単語のいずれかが長い場合は文字を上書きします。

バグ文字比率は0.0228です。確かに、ジョーイは私を打ち負かしましたがは自分のプログラムで8種類のキャラクターしか使用していないという事実に誇りを持っています。バグはもっと重大です。


2
re]arded?深刻に聞こえます。
ジョーZ.

7

C-224文字、2つのバグ、未定義の動作の7つのケース

編集:ここでの私の評価は間違っています。符号なし整数のオーバーフローは、実際にはCで明確に定義されています。さらに、符号付きと符号なしの比較も明確に定義されていますが、コンパイラーは、その定義方法があなたの考えと異なるかもしれないので警告します。

m(char**a,char**b){return strcmp(*a,*b);}main(int c,char*v[]){unsigned i,j
,o;o=atoi(v[1])+19;for(i=2;i<c;i++)for(j=0;j<=strlen(v[i])-1;j++)v[i][j]=(
tolower(v[i][j])-o)%26+97;qsort(v,c,sizeof(v),m);for(i=2;i<c;puts(v[i++]));}

使用法:

$ ./a.out 5 gtdx wjbfwiji ljy Gfi hfssty
bad
boys
cannot
get
rewarded

壊す:

m(char**a,char**b){return strcmp(*a,*b);}
main(int c,char*v[])
{
    unsigned i,j,o;

    // Undefined behavior if o is assigned negative value.
    o=atoi(v[1])+19;

    // Comparison between signed and unsigned integer.
    for(i=2;i<c;i++)
        // * Bug: if strlen(v[i]) is zero, subtraction will overflow
        //        unsigned value, and loop will have extra iterations.
        // * strlen is implicitly declared.
        //   Undefined behavior if sizeof(void*) != sizeof(int)
        for(j=0;j<=strlen(v[i])-1;j++)
            // tolower expects either an unsigned char casted to an int, or EOF.
            // Thus, undefined behavior if v[i][j] is non-ASCII.
            v[i][j]=(tolower(v[i][j])-o)%26+97;

    // * Bug: Program name and offset are included in the sort.
    //        "./a.out" and "5" both happen to be less than lowercase strings.
    // * qsort is implicitly declared.
    //   Undefined behavior if sizeof(void*) != sizeof(int)
    qsort(v,c,sizeof(v),m);

    // Comparison between signed and unsigned integer.
    for(i=2;i<c;puts(v[i++]));
}

氷を砕くための良い仕事。0.0402のバグ文字比があると言います。
ピーターオルソン

@Peterコメントや空白/ CRLFは含まれますか?
Mateen Ulhaq

@muntooいいえ。9/ 224です。
ピーターオルソン

しかし、ソートされていないテキストも出力すべきではありませんか?
ロージャッカー

5

JavaScript:403文字、8バグ、比率= 0.0199

Cほど悪くはありませんが、JavaScriptには、少なくとも初心者が使用している場合(すべてのバグが修正されていないデモ)、バグを引き起こす可能性のある設計上の欠陥があります。

function W(v){D.write("<input value="+v+">");return D.body.lastChild}function R(J){I=S.indexOf(C=i.value[J]);H=s.value;if(!I){o.value+=C}if(H>0){o.value+=S[I+H]}if(H<0){o.value+=S[I-26-H]}p.value=o.value.split(" ").sort().join(" ");setTimeout("R("+(J+1)+")",99)}D=document;S="ZYXWVUTSRQPONMLKJIHGFEDCBA";S+=S;S+=S.toLowerCase();i=W("input");s=W("shift");W("run type=button onclick=R(0)");o=W("");p=W("")

function W(v) {
    D.write('<input value=' + v + '>');
    return D.body.lastChild;
}

function R(J) {
    I = S.indexOf(C = i.value[J]);
    H = s.value;
    if(!I) o.value += C;
    if(H > 0) o.value += S[I + H];
    if(H < 0) o.value += S[I - 26 - H];
    p.value = o.value.split(' ').sort().join(' ');
    setTimeout('R(' + (J + 1) + ')', 99);
}

D = document;

S = 'ZYXWVUTSRQPONMLKJIHGFEDCBA';
S += S;
S += S.toLowerCase();

i = W('input');
s = W('shift');
W('run type=button onclick=R(0)');
o = W('');
p = W('');

  1. I + H 追加ではなく、文字列連結です。 undefinedundefinedundefined...
  2. !I の戻り値をチェックする正しい方法ではありません .indexOf()一致しない場合は-1を返します。boysVrewardedVV...
  3. 行方不明 elseキーワード:boys Vrewarded.V Vget...
  4. 入力の終わりで停止しません: ...cannotundefinedundefined...
  5. ゼロシフトを正しく処理しません(たとえば、プログラムを使用して単語を並べ替えるだけです)
  6. 負のシフトを処理しますか?正しくない。
  7. ボタンをダブルクリックすると、2番目のタイムアウトが開始され、誤った出力になります(以前のバグのほとんどが修正されたデモ)。
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot
  8. ボタンがクリックされたとき、出力テキストボックスは空でなければなりません

また、ES5でのみ標準化されたECMAScript 3の拡張機能を使用するため、これはIEの古いバージョンでは機能しないことに注意してください。


2
バグのリストにIEのサポートの欠如を含めないことをお勧めします。それを追加することは非常に魅力的でした。Web開発では非常に一般的な「バグ」であるため、 Netscape 4(または任意のブラウザ)のサポートの欠如は本当にバグです。
ピーターオルソン

さて、時代遅れのブラウザのサポートの欠如は確かに誰も傷つけませんが、現在のブラウザのサポートの欠如はそうします。あなたが流行の最先端にあるものを作成する流行のWeb 2.0企業でない限り、それが出血するまで私はそれバグだと言うでしょう。(答えを読み直してください。古いバージョンのサポートがなくてもバグは発生しない可能性があります。XPは長い間主流のサポートから外れており、サポートされるすべてのWindowsバージョンにはIEの適切なバージョンがあり、それは自動更新でも行われます)。
ジョーイ

1

Python3 184文字、4つのバグ。バグ率0,0217

import string
d=input()
y=int(input())
print("".join(sorted(d.translate(str.maketrans("".join([chr(x)for x in range(96,123)]),"".join([chr(96+(x+y)%26)for x in range(26)]))).split())))

デゴルフ:

data = input() #string to convert
y = int(input()) #value to shift
print("".join(
    sorted(
        data.translate(
            str.maketrans(
                "".join([chr(x) for x in range(96,123)]),
                "".join([chr(96+(x+y)%26) for x in range(26)]))
            ).split()
        )))

入力例:gtdx wjbfwiji。ljy Gfi hfssty
入力例:-5
出力例:Gcanxrb mmnsfdsqdv`qcdc。

既知のバグ:

  1. 大文字を変換しません
  2. `をインクルードし、変換します。
  3. 非ASCII文字を変換しません(åäö)
  4. スペースを印刷しません。
  5. 句読点を処理できますが、無視します-これをカウントしないことを選択しますが、比率を変更すると0.027になります)

意図的にバグを見つけるのは得意ではありません。

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