Складання англійської мови для вашого шефа


16

Нещодавно ваш начальник дізнався про цю цікаву мову програмування під назвою англійська . У нього була ця "революційна" ідея, він хоче кодувати з вами, щоб подвоїти показники виробництва коду! Оскільки він не є кмітливим в техніці, він хоче, щоб ви написали компілятор для цього, щоб він також міг кодувати!

Тепер ви злий ледачий програміст і, очевидно, не будете писати програми для складання цієї смішно складної мови. Натомість ви збираєтесь переконатися, що в коді вашого начальника завжди є помилка, щоб він ніколи не потрапляв до фактичної компіляції і застряг виправити граматичні помилки замість кодування.

Завдання полягає в написанні програми, яку можна запустити з терміналу, і приймає шлях до файлу як аргумент. Програма повинна:

  1. змінити введення файлу шляхом введення помилки.
  2. Притворіться, що компіляція не вдалася через те, що ви зіткнулися з друком, який ви ввели.
  3. Запуск програми на копіях одного і того ж файлу не повинен вводити одне і те ж друкарство двічі поспіль.

Щоб проілюструвати виклик, запустіть програму на цьому файлі:

Take an array as input.
Sort the array.
Output the array.

має вивести щось за рядками

Error on line 1:
'Take an arqay as input.'
         ^
arqay is not a valid identifier.

і файл, який ви сказали програмі скласти, тепер повинен виглядати так:

Take an arqay as input.
Sort the array.
Output the array.

Ось ще кілька деталей щодо специфікацій програми:

Вашій програмі дозволяється припускати, що заміна будь-якого символу в програмі, який ваш начальник вводить на інший випадковий символ, призведе до граматичної помилки. Ваша програма не повинна використовувати не алфавітні символи для створення помилок у вашому босі. Ваш начальник ніколи не вживав би цифру чи символ, і він дізнався, що щось стоїть на нозі. Ваша програма повинна вводити лише помилки в словах у програмі вашого начальника. Не змінюйте пробілів у реченнях або розділових знаків. Ваша програма не повинна змінювати випадки програми, яку ваш начальник намагається скласти, тобто помилки на зразок arQayнедійсні. Це запобігає помилкам, наприклад, takeзамість того, щоб Takeстатися, або Arrayзамість цього array. Ваша програма повинна вивести помилку, попередньо вказавши, в якому рядку знаходиться помилка:

Error on line <insert line number here>:

Потім слід роздрукувати рядок із помилкою всередині 'символів. У наступному рядку він повинен розмістити ^символ під словом з помилкою, і, нарешті, він повинен мати текст, що описує помилку (ця частина залежить від вас, ви можете сказати все, що завгодно, поки воно описує помилку).

Можна припустити, що вхідний файл існує і він не порожній. Ви також можете припустити, що вхідний файл не має граматичних помилок перед тим, як додати його.

Бонуси:

-60 байт, якщо помилки, введені вашим кодом, не є абсолютно випадковими, але на основі друку, як у цьому питанні.

-60 байт для щонайменше 5 різних повідомлень про помилки, випадково чергуючись.

-60 байт, якщо ваша програма має шанс 1 на 100 або менше, щоб видати якесь демотиваційне повідомлення вашому начальнику.

EDIT: Кількість байтів повідомлень не зараховується до вашого рахунку. (Дякую Мартіну Бюттнеру за цю гарну ідею)

Це кодовий гольф, виграє найкоротший байт. Будь ласка, не гольфуйте вміст повідомлення про помилку, ваш начальник не буде радий, якщо він не може зрозуміти повідомлення про помилки, і попросить вас виправити їх.


Чи потрібно мати справу з рядками, які не містять букв?
Οurous

Ви можете створити помилку друку лише з символів алфавіту, і ви можете припустити, що вхідний файл є дійсним непорожнім файлом, який існує.
rodolphito

7
Я не прихильник залишати повідомлення про помилки нам. Навіть якщо ми "не переграємо повідомлення про помилку", вони все одно можуть змінити кілька байтів, мабуть, навіть на два десятки, якщо ми збираємось на другий бонус. Це може бути досить багато. Я думаю, що для чесного змагання з гольфу вам слід вказати 5 повідомлень про помилки та демотиваційне повідомлення або дозволити відняти довжину їх рядка від кількості байтів.
Мартін Ендер

Дякую за пораду, я думав над тим, щоб заздалегідь задати повідомлення, але хотів дати трохи більше свободи з цим. Віднімання кількості байтів повідомлення від оцінки - це чудова ідея.
rodolphito

Відповіді:


3

TI-BASIC, 77 - 34 (текст помилки) = 43

У випадку, якщо він захоче зайнятися на своєму калькуляторі TI-83/84;)

Як стандарт для функцій, рядок файлів повинен бути Ansтаким, щоб він міг повертати та відображати вихід.

Ans->Str1:If 1=inString(Ans,"A
Then:"B
Else:"A
End:Disp "ERROR ON LINE 1","'"+Ans+sub(Str1,2,-1+length(Str1))+"'"," ^ INVALID

Зауважте, що багато маркерів - один байт.


Де я міг запустити цей код?
rodolphito

Калькулятор TI-83/84 або емулятор для одного.
Timtech

inString, Ans, sub, Else, Then, End, Disp , Str1... не ті всі 1 байт для калькулятора?
Ісмаїл Мігель

4
ЩО????????????????? Це як би сказати, що 8 біт - це не 1 байт !!!!!!!!! Якщо я представляю код у збірці, використовуючи двійкову форму, вони також вважатимуть байти як 1 макрос 5+ байтів? Це явно нерозумно! (вибачте за сильні слова, але це дійсно СТУПІД!) Це не означає ваш код. Я маю на увазі Ans, не той самий, як байт, представлений символом Ans. Одне - це те, A*n*sщо дає будь-який результат, який бажає калькулятор, інше повертає значення останнього арифметичного виразу. Враховуючи це, я думаю, що неприйняття рахунку REAL робить це неправильним поданням коду.
Ісмаїл Мігель

5
Це не здається випадковим чином змінити файл, воно виглядає так, ніби він завжди відображає зміну в рядку 1, а першу букву змінює на B, якщо її A, або A якщо ні.
rodolphito
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.