Сейчас самое время показать свои способности писать плохой код. Я пробую новую головоломку для программирования, наиболее похожую на закулисный конкурс Си. Основное отличие состоит в том, что это не так уж и гнусно: просто хорошее веселье. Цель головоломки - собрать как можно больше ошибок в программу. Победителем этого конкурса является тот, кто пишет программу с наибольшим количеством ошибок на персонажа.
Чтобы избежать огромного потока комментариев, требующих разъяснений, я должен прямо сейчас определить, что я считаю квалификационными ошибками.
Во-первых, ошибка не является ошибкой . Если это проблема, которая может быть обнаружена интерпретатором как ошибка (например, несоответствующие разделители, неправильно сформированный синтаксис, доступ к свойству нулевого объекта и т. Д.) Или если это препятствует выполнению или продолжению программы, это не Жук. В противном случае вы могли бы ввести четыре символа, и интерпретатор мог бы перечислить восемь синтаксических ошибок, и вы могли бы заявить, что отношение количества ошибок составляет 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
Первый вывод: мальчики вознаграждены. Плохо не может
Второй вывод: плохие парни не могут быть вознаграждены.
Удачи!
источник
Ответы:
Ruby, 136 символов, 7 ошибок, соотношение = 0.051
[/\d+/]
: у отрицательных чисел их знак удален (кажущаяся попытка проверки ввода)'\s'
Экранирование обратной реакции интерпретируется только в строках с двойными кавычками, поэтому это не будет генерировать пробел, а будет литералом\s
split(/ /)
: в отличие от простогоsplit
, это не будет разбито на новые строки (поэтому последнее слово будет сохранять новую строку)/[^.,:;?!]/
: это регулярное выражение исключает знаки препинания, но не прописные буквы, цифры или знаки подчеркивания, и, что наиболее важно, символы новой строки97
: что-либо кроме знаков препинания или строчных букв будет искаженоsort_by{|a|a[0]}
: видимо, программист не знал об этомsort
, а вместо этого использовал этот нелепый метод, который не сортирует слова, начинающиеся с одной буквыprint
: в отличие отputs
, не выводит новую строку между каждым аргументом (поэтому строки получаются склеенными)источник
Я не собираюсь принимать мой собственный ответ, но я подумал, что покажу вам окончательный дешифровщик сортировки с ошибками. Самое замечательное в этом то, что я даже не планировал большинство ошибок.
Brainf ***: 483 символа, 11 ошибок
Входные данные:
Выход:
Список ошибок :
Ошибки ввода / отображения:
Неположительные числа или числа, которые больше чем одна цифра, ломают программу.
Дешифровщик не делает Z предшествующим A. Он просто вычитает значение символа ASCII.
Пробелы отображаются в виде символа ASCII ESC (27).
Если ввод не завершен вкладкой, программа не продолжит работу после инструкций ввода.
Программа должна быть прекращена вручную. Он будет постоянно отображать символ ESC, пока не остановится.
Программа сломается, если входной файл не закодирован в ASCII.
Программа не отображает первый символ отсортированного вывода.
Сортировка ошибок:
Сортировку я реализовал крайне наивно.
Программа ломается, когда количество слов не равно 5.
Программа ломается, если количество байтов ввода превышает 60.
Программа может правильно сортировать, только если алфавитный порядок идентичен примеру ввода.
Программа добавляет дополнительные пробелы, если любое из слов меньше, чем в примере ввода, и перезаписывает символы, если любое из слов длиннее.
У меня соотношение баг-чар 0.0228 . По общему признанию, Джои избил меня , но я горжусь тем, что я использовал только 8 различных символов в моей программе, и мои ошибки намного более критичны.
источник
re]arded
? Звучит серьезно.C - 224 символа, 2 ошибки, 7 случаев неопределенного поведения
Изменить: моя оценка здесь неверна. Переполнение целого числа без знака на самом деле хорошо определено в Си . Кроме того, сравнение между подписанным и неподписанным тоже хорошо определено, но компилятор предупреждает, потому что способ, которым это определено, может не быть тем, что вы думаете.
Использование:
Сломать:
источник
JavaScript: 403 символа, 8 ошибок, соотношение = 0,0199
Хотя JavaScript не такой плохой, как в C, у него есть недостатки в дизайне, которые могут привести к ошибкам, по крайней мере, при использовании новичком ( демонстрация со всеми исправленными ошибками ).
I + H
это конкатенация строк, а не дополнение:undefinedundefinedundefined...
!I
неправильный способ проверить возвращаемое значение.indexOf()
, которое возвращает -1 для несоответствия:boysVrewardedVV...
else
ключевые слова:boys Vrewarded.V Vget...
...cannotundefinedundefined...
boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot
.Также обратите внимание, что это не будет работать на более старых версиях IE, потому что он использует расширение ECMAScript 3, которое было стандартизировано только в ES5.
источник
Python3 184 символа, 4 ошибки. Коэффициент ошибок 0,0217
degolfed:
Пример ввода: gtdx wjbfwiji. ljy Gfi hfssty
Пример ввода: -5
Пример вывода: G
canxrb
mmnsfdsqdv`qcdc.Известные ошибки:
Я не очень хорошо умышленно придумываю ошибки.
источник