Написать код ошибки [закрыто]

17

Сейчас самое время показать свои способности писать плохой код. Я пробую новую головоломку для программирования, наиболее похожую на закулисный конкурс Си. Основное отличие состоит в том, что это не так уж и гнусно: просто хорошее веселье. Цель головоломки - собрать как можно больше ошибок в программу. Победителем этого конкурса является тот, кто пишет программу с наибольшим количеством ошибок на персонажа.

Чтобы избежать огромного потока комментариев, требующих разъяснений, я должен прямо сейчас определить, что я считаю квалификационными ошибками.

Во-первых, ошибка не является ошибкой . Если это проблема, которая может быть обнаружена интерпретатором как ошибка (например, несоответствующие разделители, неправильно сформированный синтаксис, доступ к свойству нулевого объекта и т. Д.) Или если это препятствует выполнению или продолжению программы, это не Жук. В противном случае вы могли бы ввести четыре символа, и интерпретатор мог бы перечислить восемь синтаксических ошибок, и вы могли бы заявить, что отношение количества ошибок составляет 2.

Во-вторых, ошибка не должна быть явно ошибочной, и ошибка не является пасхальным яйцом . Это, безусловно, субъективный критерий, но я считаю, что это необходимо для такого рода соревнований. Это означает, что у вас не может быть условного кода, который определенно искажает код очевидными способами. (Читайте: используйте язык ямы Тьюринга, потому что никто не будет знать разницу).

В-третьих, ошибка должна быть правдоподобной . Это субъективно, как и выше, но ошибка должна выглядеть так, как будто она была написана менее чем дотошным или, возможно, невежественным человеком или кем-то, кто только что сделал ошибку. Это включает, например, отдельные ошибки или синтаксис, который является допустимым и выглядит правильным, но вызывает нежелательное поведение (скажем, использование квадратных скобок вместо скобок).

Ошибка может вызвать любое нежелательное поведение программы, включая, но не ограничиваясь этим, нежелательный вывод для некоторых исключительных случаев, поведение по-разному основано на чем-то, что, по-видимому, не связано (например, вывод отображается по-разному в зависимости от того, заканчивается ли текущее время) с нечетным или четным количеством секунд), утечки памяти, потеря данных и т. д.

Пример задачи:

Создайте программу, которая отображает все символы ASCII в порядке возрастания их числового значения.

Пример ответа:

Brainf ***, 5 символов, 1 ошибка, коэффициент ошибок 0,2

+[+.]

Ошибка: не отображает символ ASCII для 1. Может быть исправлено путем изменения на .+[.+].

Хорошо, я думаю, что вы должны были получить это сейчас, вот ваша загадка:

Расшифруйте код Цезаря и сортируйте слова по алфавиту

Цезарь шифр создается путем взятия серии букв и сдвига их 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, потому что задача заключается в расшифровке шифра.
Набб
Ах я вижу. @ Набб, спасибо!
ВЫ
Нужно ли поддерживать прописные и строчные буквы?
Джои Адамс
1
@Peter: я открыл новую дискуссию по мета, которая касается этого вопроса (среди других). Возможно, вы хотели бы прокомментировать.
dmckee

Ответы:

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, не выводит новую строку между каждым аргументом (поэтому строки получаются склеенными)

Lowjacker
источник
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? Звучит серьезно.
Джо З.
7

C - 224 символа, 2 ошибки, 7 случаев неопределенного поведения

Изменить: моя оценка здесь неверна. Переполнение целого числа без знака на самом деле хорошо определено в Си . Кроме того, сравнение между подписанным и неподписанным тоже хорошо определено, но компилятор предупреждает, потому что способ, которым это определено, может не быть тем, что вы думаете.

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?
Матин Улхак,
@muntoo Нет. Это 9/224.
Питер Олсон
Но не должен ли он выводить и несортированный текст?
Lowjacker
5

JavaScript: 403 символа, 8 ошибок, соотношение = 0,0199

Хотя JavaScript не такой плохой, как в C, у него есть недостатки в дизайне, которые могут привести к ошибкам, по крайней мере, при использовании новичком ( демонстрация со всеми исправленными ошибками ).

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. Двойной щелчок по кнопке вызывает второй тайм - аут , чтобы начать, что приводит к неправильному выходу ( демо с большинством предыдущих ошибок , исправленных ):
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. Выходные текстовые поля должны быть пустыми при нажатии кнопки

Также обратите внимание, что это не будет работать на более старых версиях IE, потому что он использует расширение ECMAScript 3, которое было стандартизировано только в ES5.

PleaseStand
источник
2
Хороший призыв не включать отсутствие поддержки IE в ваш список ошибок, я был бы весьма искушен, чтобы добавить его, и я почти предложил это, потому что это очень распространенная «ошибка» в веб-разработке, пока я не подумал, стоит ли отсутствие поддержки 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())))

degolfed:

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
Пример вывода: G canxrbmmnsfdsqdv`qcdc.

Известные ошибки:

  1. Не конвертирует заглавные буквы
  2. Включает `и преобразует в / из него.
  3. Не конвертирует символы не ascii (текст)
  4. Не печатает пробелы.
  5. Может обрабатывать, но игнорирует знаки препинания - я выбираю не считать это, но если я делаю, мое соотношение достигает 0,027)

Я не очень хорошо умышленно придумываю ошибки.

Роберт С.
источник