Составление английского для вашего босса

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 или меньше, чтобы вывести какое-то демотивационное сообщение вашему боссу.

РЕДАКТИРОВАТЬ: Количество байтов сообщений не учитывается в ваш счет. (Спасибо Мартину Бюттнеру за эту хорошую идею)

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

rodolphito
источник
Должен ли я иметь дело со строками, которые не содержат букв?
Οurous
Вы можете создать только опечатку в алфавитных символах, и вы можете предположить, что входной файл является допустимым непустым файлом, который существует.
Родольфито
7
Я не фанат оставлять сообщения об ошибках до нас. Даже если мы «не сообщаем об ошибке», они все равно могут иметь значение из нескольких байтов, возможно, даже двух десятков, если мы собираемся получить второй бонус. Это может быть довольно много. Я думаю, что для честного соревнования по гольфу вы должны указать 5 сообщений об ошибках и демотивационное сообщение или позволить нам вычесть их длину строки из числа байтов.
Мартин Эндер
Спасибо за совет, я думал о том, чтобы иметь предопределенные сообщения, но я хотел дать немного больше свободы с этим. Вычитать количество байтов сообщения из оценки - отличная идея.
Родольфито

Ответы:

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

Обратите внимание, что многие токены являются одним байтом.

Timtech
источник
Где я могу запустить этот код?
Родольфито
Калькулятор ТИ-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, если нет.
Родольфито