Написати код Buggy [закрито]


17

Зараз саме час проявити свої здібності писати поганий код. Я випробовую новий вид головоломки з програмування, найбільш схожу, на мою думку, на нецензурний C-конкурс. Основна відмінність полягає в тому, що це не так вже й ганебно: це лише якась хороша чиста забава. Мета головоломки - запакувати якомога більше помилок у програму. Переможець цього конкурсу - той, хто пише програму з найбільшою кількістю помилок на кожного персонажа.

Щоб уникнути величезної нитки коментарів з проханням роз'яснити, я зараз повинен визначити, що вважаю кваліфікованими помилками.

По-перше, помилка - це не помилка . Якщо це проблема, яку інтерпретатор може визначити як помилку (наприклад, невідповідні деліметри, неправильно сформований синтаксис, доступ до властивості нульового об'єкта тощо) або якщо це заважає програмі виконувати або продовжувати, це не Жук. В іншому випадку ви можете ввести чотири символи, а інтерпретатор може перерахувати вісім помилок синтаксису, і ви можете вимагати співвідношення символів помилки 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, тому що завдання - декодувати шифр.
Nabb

А, бачу. @Nabb, Дякую!
ВИ

Чи потрібно підтримувати як великі, так і малі літери?
Joey Adams

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 прийти до А. Він просто віднімає значення символу 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 випадків невизначеної поведінки

Редагувати: Моя оцінка тут неправильна. Переповнення цілого числа без знака, насправді, добре виразно в 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,0 0,02.
Пітер Олсон

@Peter Це включає коментарі та пробіли / CRLF?
Mateen Ulhaq

@muntoo Ні. Це 9/224.
Пітер Олсон

Але чи не слід також виводити несортований текст?
Lowjacker

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

Також зауважте, що це не працюватиме на старих версіях IE, оскільки він використовує розширення до ECMAScript 3, яке було стандартизовано лише в ES5.


2
Хороший заклик не включати відсутність підтримки IE у вашому списку помилок, я був би дуже спокушений його додати, і я майже запропонував це, оскільки це дуже поширена «помилка» в веб-розробці, поки я не замислювався над тим, чи ні відсутність підтримки для Netscape 4 (або будь-якого довільного браузера) справді буде помилкою.
Пітер Ольсон

Ну, відсутність підтримки застарілого веб-переглядача, безумовно, нікому не шкодить, але відсутність підтримки для поточного . Якщо ви не хіп і повністю працююча компанія Web 2.0, яка створює речі на краєчці технології, поки вона не знекровить, я б сказав, що це помилка. (Перечитайте відповідь; відсутність підтримки для старих версій, ймовірно, не помилка, тоді. XP давно не підтримується, і всі підтримувані версії Windows мають пристойну версію IE, яку можна запустити навіть через автоматичне оновлення).
Joey

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
Приклад виведення: G canxrbmmnsfdsqdv`qcdc.

Відомі помилки:

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

Мені не дуже добре свідомо придумувати помилки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.