Примечание. Эта задача разрешает ответы только на скомпилированных языках.
задача
Ваша задача довольно проста: создать две разные программы, которые при компиляции приводят к одинаковому результату.
счет
Здесь начинается самое интересное. Ваша оценка - это количество уникальных байтов, представленных ровно в одной программе. Например, если две ваши программы (закодированные в кодовой странице IBM 437 )
☻☻Program A
а также
☺Program B
Символы, которые находятся в одной программе
☻☺AB
Таким образом, счет равен 4. Обратите внимание, что ☻
в первой программе он появляется дважды, но учитывается только один раз.
Ваша цель - набрать наивысший балл, максимально возможный балл 256.
Вот программа скоринга, которая работает для программ, закодированных в ASCII.
УСЛОВИЯ
Каждый байт в обеих программах должен быть заменен другим байтом, в результате чего либо программа компилируется с другим результатом, либо не компилируется все вместе. Удаление любого байта должно сделать то же самое.
Вы можете использовать любые флаги компиляции, если обе программы запускаются с одинаковыми флагами.
Результирующая компиляция должна быть статической (то есть не должна изменяться от запуска к запуску), если результаты варьируются от машины к машине, указывая на машину, на которой она предназначена.
Выход компиляции должен быть байтом для байта, идентичного не «эквивалентного» или «достаточно похожего».
Выходные данные компиляции должны быть непустыми
Предупреждения / Ошибки не должны быть одинаковыми между компиляциями
Если либо программы, либо компиляция содержат непечатаемые символы, обязательно включите hexdump. Хотя это технически не требуется.
источник
abcdefghijqlmnop...
чтобы использовать более 20 уникальных символов. Это разрешено?Code-Bowling
вопрос!Ответы:
Perl, оценка 254 + 2 = 256
Вот шестнадцатеричный дамп одной программы:
и вот другая программа:
Perl обычно не думают о скомпилированном языке, но это так; сначала он компилируется в байт-код, а затем выполняется байт-код. Вы можете применить фильтр к байт-коду (например, чтобы сбросить его вместо запуска программы), используя
-MO
опцию. Обе эти программы компилируются в следующий байт-код (разобран с помощью-MO=Terse
):объяснение
Perl заменяет все операторы без эффекта (например, сами по себе строковые литералы) жестко закодированным оператором «оператор без эффекта» в результирующем байт-коде, поэтому обе программы компилируются в одно и то же. С точки зрения замены символов, замена большинства символов из программы 1 апострофами приведет к невозможности компиляции (или замене апострофов на
0
). В программе 2 замена любого символаc
вызовет сбой программы при компиляции (поскольку\c
принимает аргумент).Что касается удаления символов, первая версия этого ответа предшествовала «правилу радиационной стойкости» (что удаление любого символа должно изменить поведение программы). Эта обновленная версия, защищенная от радиации, работает с использованием контрольной суммы; если удаление символа не приводит к синтаксической ошибке, код скомпилируется в вызов несуществующей функции
x
. Компилятор Perl не оптимизирует вызов в том случае, если он сделан (и, как правило, не осознает, что функция не существует), и, следовательно, вывод отличается. Тем не менее, постоянная папка Perl способна видеть, что немутантная программа является одним оператором без эффекта, и, таким образом, оптимизирует все это в один оператор, как раньше.Первоначально я неправильно понял вопрос, считая только уникальные символы из одной программы, и попытался оптимизировать его. Очевидно, что в программе 2 должен быть хотя бы один символ, чтобы сгенерировать код операции «оператор без эффекта», а это означает, что наилучший возможный результат в одной программе - 255. Я пока не нашел способа включить обратную косую черту в программу 1 таким образом, что непосредственно следующий за ним символ не может быть заменен таким образом, чтобы вызвать сбой программы, но меня это не удивило бы, если бы это было возможно (приводя к значению 255 + 1 = 256 ).
источник
С, 231
Программа А
Много непечатных выше. Вот xxd hexdump:
Программа Б
Они компилируются в точно такой же объектный код. GCC встраивает имя файла в объектный код, поэтому вам нужно дать файлам одинаковое имя (в разных каталогах).
Я беспокоился, что тот факт, что нет ссылок,
i
может привести к тому, что компилятор полностью оптимизирует эту переменную, но я думаю, что сделать ее глобальной гарантией того, что она будет присутствовать в объекте. Это может быть проверено путем проверки сгенерированной сборки:Обратите внимание, что в программе B (большая часть) значения char даны в восьмеричном виде. Они также могут быть заданы в десятичном формате, но с использованием восьмеричного числа мы получим пару дополнительных символов -
8
и9
- в наборе разностей.GCC, похоже, не нравятся символы CR, LF и (по понятным причинам) NUL внутри одинарных кавычек
''
.Попробуйте онлайн и наберите очки .
источник
char
неявнаяint
, в ущерб счету.Python, оценка
16262728Уникальные персонажи:
-+;132547698<ACBEDFOXabopsx|
Рассчитать счет
Программа 1:
В программе 1 в кажущейся пустой строке 5 пробелов.
Программа 2:
Некоторая помощь была найдена с исходным кодом оптимизатора глазка .
Протестировано с помощью этого вспомогательного скрипта: попробуйте онлайн!
источник
Python 3.6,
2 3 56Программа 1:
Программа 2:
Python обычно не компилируется, но он компилирует свой исходный код в файлы pyc. Важно отметить, что такая компиляция включает в себя этап оптимизации, который заменяет «1111 + 4168» на 5279. Подчеркивания служат двум целям: одно из них состоит в добавлении одного к партитуре, а другое - в сохранении длины, которая хранится в pyc. заголовок такой же. Все присваивания переменных, отличные от 'x', должны сохранять
co_consts
правильную последовательность. Вx*x
конце служит тоco_stacksize
же самое.источник
compile
функции, которая не добавляет заголовок. Проблемы с mtime и именем файла применимо только к шапкеos.utime
функциюФАСМ, 254
нет 0x00 и 0x1A, потому что fasm не поддерживает два символа
источник