编写儿童车代码[关闭]


17

现在是时候炫耀您编写不良代码的能力了。我正在尝试一种新的编程难题,我认为与欠缺C竞赛最相似。主要的区别是这并不那么有害:它只是一些很好的清洁乐趣。难题的目标是将尽可能多的错误打包到一个程序中。这项竞赛的获胜者是每个角色中漏洞最多的程序编写者。

为了避免大量的评论要求澄清,我现在应该定义我认为合格的错误。

首先,错误不是错误。如果是解释器可以将其检测为错误的问题(例如,不匹配的分隔符,格式错误的语法,访问空对象的属性等),或者阻止了程序的执行或继续,则不是一个错误。否则,您可以输入四个字符,解释器可以列出八个语法错误,并且可以声明错误字符比率为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

系统将为您提供两个输入(您可以在合理范围内获得输入,但对您而言最方便)。第一个输入是单词,第二个输入是它移过来的值。您的任务是输出已解码的单词,然后按字母顺序对已解码的单词进行输出。

示例(对坏男孩没有冒犯性,这只是一个示例):

首先输入:gtdx wjbfwiji。ljy Gfi hfssty

第二输入:5

第一输出:男孩得到奖励。变坏不能

第二输出:坏男孩无法得到回报。

祝好运!


您的示例的第二个输入不是-5吗?

@ S.Mark:输入为5,因为任务是对密码进行解码。
Nabb 2011年

知道了 @Nabb,谢谢!

我们是否必须同时支持大写和小写字母?
乔伊·亚当斯

1
@Peter:我已经开始对与这个问题有关的meta进行新的讨论。也许您想发表评论。
dmckee 2011年

Answers:


14

Ruby,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。诚然,Joey击败了我,但我为自己在程序中只使用了8个不同的字符而感到自豪,而且我的错误更加严重。


2
re]arded?听起来很认真。
Joe 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的bug-char比率。
彼得·奥尔森

@Peter是否包括注释和空格/ CRLF?
Mateen Ulhaq 2011年

@muntoo号。它是9/224。
彼得·奥尔森

但是它是否也应该输出未排序的文本?
Lowjacker 2011年

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. 双击该按钮使第二超时启动,从而导致不正确的输出(演示与大多数固定以前的bug
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot
  8. 单击按钮时,输出文本框必须为空

还要注意,这不适用于旧版IE,因为它使用了ECMAScript 3的扩展,该扩展仅在ES5中进行了标准化。


2
很好地呼吁不要在您的错误列表中包括对IE的支持,我很想添加它,并且我几乎建议使用它,因为它是Web开发中非常常见的“错误”,直到我考虑是否缺少对Netscape 4(或任何任意浏览器)的支持确实是一个错误。
彼得·奥尔森

好吧,缺乏对过时浏览器的支持当然不会伤害任何人,但是缺乏对当前浏览器的支持会带来好处。除非您是一家时髦而完全rad Web 2.0的公司,否则不要在技术的最前沿创建东西,直到它消失为止,我会说这一个错误。(重新阅读答案;那么,缺少对较早版本的支持可能就没有bug。XP早已超出了主流支持范围,并且所有受支持的Windows版本都运行了不错的IE版本,甚至可以通过自动更新来运行)。
Joey

1

Python3 184个字符,四个bug。错误率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)

我不太擅长提出错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.