Вдохновленный этим комментарием ...
Спасибо пользователям Step Hen , Wheat-Wizard и Dennis за помощь в разработке спецификации этого задания перед его публикацией!
Это нить ментов. Для нити грабителей, иди сюда
В этом задании перед вами стоит запуск некоторого кода, который делает его таким, чтобы ваш язык больше не удовлетворял нашим критериям языка программирования. В этом вызове это означает сделать так, чтобы язык больше не мог ...
Возьмите числовой ввод и вывод
Добавьте два числа вместе
Проверьте, является ли определенное число простым или нет.
Это задача полицейских и грабителей , где есть две разные задачи с двумя разными целями: копы попытаются написать некоторый код, который делает язык в основном непригодным для использования, и грабители попытаются найти скрытый обходной путь, который позволяет копам восстановить свой язык.
Как полицейский, вы должны написать два фрагмента кода:
Тот, который делает ваш язык в основном непригодным, например, удаляя встроенные функции для ввода / вывода и числовые операции. Чем больше функций вы удалите, тем лучше. Этот код не может произойти сбой или выход. Должна быть возможность добавить код в конец этого фрагмента, и этот код будет оценен . А также...
... фрагмент кода, который принимает два неотрицательных целых числа в качестве входных данных, складывает их вместе и выводит их сумму. Этот фрагмент должен работать правильно даже после запуска первого фрагмента. Когда два фрагмента объединены вместе, они должны сформировать полную программу, которая добавляет два числа, или определить функцию, которая добавляет два числа. В идеале этот фрагмент должен опираться на очень неясное поведение, чтобы его было труднее найти.
Вы можете выбрать любой стандартный метод ввода и вывода . Однако вы должны точно указать, какой формат (входной и выходной) вы используете. Грабитель не может взломать ваш ответ, если он не использует тот же формат, что и вы.
После написания обоих этих фрагментов вы должны опубликовать первый ответ, не раскрывая второй. Ваш ответ должен содержать всю следующую информацию:
Первый фрагмент (явно не второй).
Язык (включая минорную версию, так как большинство представлений, вероятно, будет опираться на странные крайние случаи)
Формат ввода-вывода, в том числе ли это функция или полная программа. Грабители должны использовать тот же формат, чтобы их трещина была действительной.
Любые странные крайние случаи, необходимые для вашего ответа на работу. Например, работает только на Linux или требует подключения к Интернету . Очевидно, это немного субъективно, но если у полицейского есть какой-то крайний крайний случай, который предотвращает его взлом, а затем обнаруживает это только в безопасности, я считаю это плохим спортивным мастерством. У потенциального грабителя должна быть вся информация, необходимая для взлома вашего ответа, прежде чем он будет взломан.
Вам не нужно раскрывать количество байтов, пока ваш ответ не будет безопасным.
Вот пример. Для первого фрагмента вы можете отправить следующую программу на Python 3:
Python 3
print=None
Принимает ввод из STDIN и вывод в STDOUT
И тогда, как ваш второй фрагмент, вы можете написать:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Это верно, потому что он будет принимать два числа в качестве входных данных и выводить их сумму, даже если вы соедините два фрагмента вместе, например
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Однако для грабителя будет очень легко найти решение. Поскольку это было бы очень легко взломать, вы можете попытаться исправить этот конкретный подход следующим образом:
import sys
sys.stdout=None
print=None
Однако даже у этого есть очень легкий обходной путь:
del print
a,b=int(input()),int(input())
print(a+b)
Как полицейский, ваша цель - сделать скрытый обходной путь как можно более скрытным, чтобы не дать грабителям найти его.
В разбойниках будут смотреть на один из ваших ответов, и попытаться взломать его. Они могут взломать его, написав любой допустимый фрагмент кода, который может работать как фрагмент 2 (сложение двух чисел после того, как язык становится в основном непригодным для использования). Это не обязательно должен быть тот же фрагмент, который вы изначально предполагали. Если грабитель взломает ваш ответ, он оставит комментарий к вашему ответу, а затем вы должны отредактировать его, чтобы указать, что он был взломан. Если ваш пост взломан, вы должны отредактировать свой ответ, чтобы показать решение (фрагмент 2), которое вы изначально планировали. Это не правило как таковое , просто дружеское предложение, чтобы игра оставалась веселой. Ты не должен.
Если ответ остается без изменений в течение одной недели, вы можете отредактировать свой второй фрагмент и указать, что ваш ответ теперь безопасен . Если вы не редактируете его по истечении недели, другие пользователи все равно могут его взломать, пока вы не сделаете это. Если вы не раскрываете свой второй фрагмент, вы не можете требовать баллы за ваш ответ или называть его безопасным.
Победителем в потоке полицейских является самый короткий безопасный ответ, включающий оба фрагмента , подсчитанные в байтах, и этот ответ будет принят после того, как пройдет достаточно времени. Вам не нужно раскрывать количество байтов до тех пор, пока ваш ответ не будет безопасным, поскольку количество байтов не имеет отношения к вашему счету, пока ваш ответ не будет безопасным. В случае, если прошло достаточно времени, а ответы не остались без изменений, победителем будет тот ответ, который оставался без изменений в течение самого длительного периода времени.
Веселиться!
Разъяснения правил
Первый фрагмент должен работать правильно, без каких-либо входных данных . Он может выводить все, что угодно, и этот вывод будет игнорироваться - до тех пор, пока после создания фрагмента второй фрагмент работает правильно.
Второй фрагмент должен быть действительно выполнен, чтобы ваш ответ был действительным. Это означает, что ответ как
import sys sys.exit()
недопустимо, потому что это не нарушает язык. Это просто выходит. Точно так же ввод бесконечного цикла недопустим, так как второй фрагмент никогда не будет выполнен.
После того, как вы в безопасности, ваш счет - это количество байтов обоих фрагментов .
Это восходит к Пожалуйста , выявить какие - либо странные случаи краев , необходимые для ответа на работу ... Ваша заявка должна содержать достаточно информации , прежде чем раскрываются воспроизводимыми после раскрываются. Это означает, что если ваш ответ станет безопасным, а затем вы отредактируете в: Вот мой ответ. Да, кстати, это работает, только если вы запускаете его на Solaris, шутка над вами! Ваш ответ недействителен и будет удален и не будет признан приемлемым для победы.
Второй фрагмент кода может потерпеть крах после вывода суммы - до тех пор, пока вывод остается верным (например, если вы выберете вывод в STDERR, а затем получите кучу информации о сбое, это недопустимо).
Вы не можете редактировать свой код после отправки ответа.
Вы не можете полагаться на криптографические функции, такие как шифрование, хэш-функции, CSPRNG и т. Д.
Фрагмент, чтобы найти непроверенные представления:
источник
int main(){ do_evil_stuff(); }
куда должен идти код пользователя? В функции? После всех заявлений вmain
?Ответы:
Gforth 0,7,3 (TIO) , 231 байт [SAFE]
Этот код переопределяет как бесполезные некоторые необходимые методы вывода, а также сложение и что-то важное для объявления функций. Удачи!
Входными данными будут два целых числа со знаком, взятых из верхней части стека в качестве параметров функции Вывод на STDOUT.
Таким образом, вы должны исправить нанесенный ущерб и определить функцию, которая берет два верхних значения из стека и печатает результат в виде целого числа (не с плавающей запятой) в STDOUT без дополнительного вывода (без конечного пробела).
Вот шаблон , если ваша целевая функция названа
f
.Решение:
источник
Haskell, взломанный Кристианом Сиверсом
Полная программа, считывающая два целых числа (включая отрицательные) из стандартного ввода и запись в стандартный вывод.
Я только что отключил Prelude, так что почти ничего не находится в области видимости, а затем добавил определение; дальнейший импорт синтаксически недействителен. Я дал тебе
getLine
иprint
хотя.Отредактировано, чтобы добавить мое оригинальное решение. Взлом Кристиана был другим, но он использовал те же базовые функции (вы можете получить удивительное количество вычислений, выполняя доступ к функциям, которые имеют синтаксический сахар, даже когда вы не можете вызвать что-либо встроенное напрямую или даже назвать используемые типы).
Который, вероятно, не супер-гольф в любом случае, но здесь это более наглядно:
источник
Python 2 , треснувший
Реализует сложение как именованную функцию
Попробуйте онлайн!
Что это делает?
С целью помочь вам немного я объясню, что это делает. Этот код открывает исходный файл и проверяет, соответствует ли остальная часть кода следующим критериям:
import
&)(,.:[]a`cdfijmonrt~
Если он не выполняется ни по одному из критериев, предел рекурсии устанавливается
1
равным значению, что любой код, который вы пишете, достигнет предела рекурсии.Здесь нет хитростей, я написал решение, которое использует только эти символы и не импортирует, я не делаю ничего подрывного, но скажу, что думаю, что это будет довольно сложно взломать.
Чтобы сэкономить ваше время, вот краткий список полезных вещей, которые вы не можете сделать с этим ограничением.
+
ну да,eval
/exec
Не собирался позволить вам сойти с рук с этимЧисла, они могут быть более полезными, чем вы думаете
Строковые литералы
len
=
, Не назначая переменные>
,<
,==
. , , Я оставил тебя без сравнения*
,-
,/
,%
,^
,|
,>>
,<<
Единственные операторы Доступные~
и&
__foo__
, Ни один из этих причудливых методов двойного подчеркивания не допускается.источник
This code is not allowed to crash or exit.
(см. Чат для обсуждения)Python 2 , треснувший
Это четвертая итерация этого ответа. Каждый из последних ответов был взломан путем сброса глубины рекурсии.
Реализует сложение как именованную функцию
Попробуйте онлайн!
Что это делает?
С целью помочь вам немного я объясню, что это делает. Этот код открывает исходный файл и проверяет, состоит ли остальная часть кода исключительно из символов.
&)(,.:[]a`cdfijmonrt~
В случае неудачи для предела рекурсии устанавливается
1
значение, означающее, что любой код, который вы пишете, достигнет предела рекурсии.Я также отключил все модули, поэтому вы ничего не можете импортировать.
Здесь нет хитростей, я написал решение, которое использует только эти символы и не импортирует, я не делаю ничего подрывного, но скажу, что думаю, что это будет довольно сложно взломать.
Чтобы сэкономить ваше время, вот краткий список полезных вещей, которые вы не можете сделать с этим ограничением.
+
ну да,eval
/exec
Не собирался позволить вам сойти с рук с этимЧисла, они могут быть более полезными, чем вы думаете
Строковые литералы
len
=
, Не назначая переменные>
,<
,==
. , , Я оставил тебя без сравнения*
,-
,/
,%
,^
,|
,>>
,<<
Единственные операторы Доступные~
и&
__foo__
, Ни один из этих причудливых методов двойного подчеркивания не допускается.Мое решение
Так что теперь, когда xnor взломал его так, что я достаточно доволен, я собираюсь раскрыть свое решение
Сюрприз, сюрприз его огромная куча тарабарщины. Вместо того, чтобы разбить это, я собираюсь пройти через процесс того, как я сделал это.
Я начал с довольно стандартного алгоритма сложения
Тогда я использовал побитовый трюк для представления
^
с|
,&
,~
.Я использовал еще один побитовый трюк, чтобы избавиться от
|
Теперь все, что осталось, это
<<
, не должно быть слишком сложно, верно? Ну, будьте готовы к ухабистой поездке. Чтобы заменить битовое смещение, я использовал строки, чтобы добавить ноль в конец его двоичного представления.У этого есть несколько проблем, но основной является использование сложения , поэтому я решил обойти это, используя вместо этого формат
Нам не разрешено использовать bin, поэтому я использовал форматирование строки для преобразования в двоичный файл.
Поскольку строковые литералы запрещены, я должен построить строку
{0:b}0
из частей, сделанных с помощью обратных тиков иjoin
их вместе.Пустая строка довольно проста, вы можете просто сделать
Нули были
и
{:}
все они были взяты из словарей.b
кажется довольно трудно получить, его нет в нашем наборе символов, так как мы можем получить объект, который имеетb
егоrepr
? Ну вот как: когда вы используетеrepr
встроенную функцию, вы получаете что-то похожееИ вот откуда мы возьмем наши
b
.Теперь все, что осталось, это числа, мне нужны только -1, 0, 1 и 2, вот как я их представлял:
2 может быть на байте короче, как
основанный на предложениях @ Blender в комментариях, но я не думал об этом до тех пор, пока после факта.
Таким образом, мы подставляем эти числа в
И это трещина.
источник
C (GCC) треснул!
Попробуйте онлайн!
Ввод из STDIN и вывод в STDOUT.
Это работает без ошибок. Хахаха, это довольно зло. Я только протестировал это на GCC TIO. Как правило, вы должны добавить свой код после этого фрагмента, чтобы он заработал :) Комментарий - средний, не слушайте его.
Проверено на
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
. Должно работать на любой системе Linux.Оригинальное решение
источник
__asm__
и у вас есть множество функций на выбор :) не думайте, что C и C ++ здесь хорошие враги.C (GCC в Linux) (взломан)
Вместо использования глупых методов песочницы для чтения файлов, мы делаем это надлежащим образом - с помощью белого списка SECCOMP!
Ваша задача: реализовать сложение с вводом из STDIN и выводом в STDOUT.
Попробуйте онлайн!
Что это за хрень!?
Чтобы помочь вам в вашей непреодолимой задаче, я объясню, что делает этот код.
__attribute__ ((constructor(0)))
гарантирует, чтоs
функция запускается первой. Функция закрывает все открытые файловые дескрипторы для STDIN, STDOUT и STDERR. Затем программа ограничивается строгим белым списком SECCOMP, который ограничивает ваши системные вызовы следующим:Поэтому вы не можете открывать какие-либо новые файлы (или вообще ничего не делать). Затем мы подходим к main и вызываем ваш код, красиво завернутый в
sandbox
функцию.В
syscall(SYS_exit, EXIT_SUCCESS);
конце это просто для того, чтобы убедиться, что программа завершается корректно - по умолчанию GCC завершит работу,exit_group(2)
что не разрешено в белом списке SECCOMP. Эта функция выхода вызывается после запуска вашего кода.Таким образом, у вас нет открытых дескрипторов файлов, и вы не можете открыть ничего нового. Невозможно, верно? ;)
источник
Хаскелл , взломанный Беном
Попробуйте онлайн! Это должна быть полная программа, считывающая два числа из стандартного ввода и выводящая сумму в стандартный вывод.
Каждая полная программа начинается с запуска
main
функции, но здесьmain
вызывает себя и вызывает бесконечный цикл. Что еще хуже, строковый комментарий начинается--
непосредственно за рекурсивным вызовом, чтобы предотвратить его изменение, например,main2
и затем определение его для суммирования.Предполагаемое решение:
Попробуйте онлайн!
--
начинает комментарий строки, если он не может быть проанализирован как часть оператора. (Подсветка синтаксиса, кажется, не знает об этом факте.)--$
Является допустимым инфиксным оператором, который принимает вmain
качестве первого аргумента и некоторый фиктивный второй аргумент()
. Затем определяется, чтобы игнорировать оба аргумента и вместо этого выполнять требуемую задачу.источник
Сборка 16 бит в реальном режиме x86 ( Cracked )
Легко, если знаешь трюк.
источник
or [bp], 256
она недействительна. Это должно бытьor WORD PTR [bp], 256
?)hlt
инструкции (кольцо 0) сильно подразумевает, что это не защищенный режим.Your submission must contain enough information before being revealed to be reproducible after being revealed
Javascript, трещины
Эта задача построена на основе решения Гранта Дэвиса , но исправляет решение, которое он имел в виду (которое создает iframe и использует iframe
window
). Решение запускается в консоли javascript на chromeabout:blank page
и занимает двеinput()
секунды, складывает их вместе и возвращаетconsole.log
результат. Поместите ваш код после:Сначала мы сжимаем
prompt
иconsole
и устанавливаем ярлыкd
. Затем мы создаем наблюдателя мутаций с обратным вызовом, который удаляет каждую цель мутированную. Мы установили , что мутации наблюдатель соблюдать документ, и уведомить обchildList
иsubtree
модификации. Вместо литералаtrue
мы используем наш ярлык для истинного значенияdocument
( спецификация не позволяет этого, но Chrome делает).После того, как я написал это, я понял, что гораздо более элегантный клоббер. Мое намеченное решение все еще работает, но опубликованный треск не делает:
источник
Perl 5, взломанный Ильмари Каронен
Ввод принимается в отдельных строках,
STDIN
а вывод выводится наSTDOUT
.Весь код идет после
__DATA__
маркера. При этом используется метод, аналогичный решению @ WheatWizard, в котором анализируется код и удаляются непригодные символы.Это было протестировано в версиях 5.8, 5.10 и 5.16 и не требует флагов командной строки.
Попробуйте онлайн!
источник
STDIN
с символами на отдельных строках иSTDOUT
. Я добавлю это в основной корпус.Python 3, взломанный zbw
Все модули были удалены, что означает, что встроенные функции отсутствуют, и ничего больше не поделаешь. Вывод в STDOUT, ввод из STDIN. Это вторая итерация этого ответа после того, как предыдущий был разорван тривиальной трещиной путем добавления оператора разрыва.
источник
APL (ngn-apl) , взломанный ngn
Сделано в сотрудничестве с моим коллегой Маршаллом .
Ввод через левый и правый аргументы для
+
. Т.е. ваша цель - вставить код после следующего, чтобы ваша последняя строка читала⎕←3+2
и выводила5
в STDOUT.Попробуйте онлайн!
Работает, устанавливая все полезные функции, для
{}
которых принимает один или два аргумента и возвращает пустой числовой список. Также устанавливает⍣
просто составлять функции.трещина
⍺⍵1/0
повторить 0 с помощью левого аргумента и правого аргумента и 1⍋
получить индексы, которые бы сортировали это (поскольку все элементы равны нулю, это дает 0 1 2… (a + b)⌈/
максимальное значение (а + б)источник
+
с использованием только чистого APL и без грязных трюков.Python 2 , треснувший
Это вторая итерация ответа, который один раз был взломан @HyperNuetrino с помощью метода, которого я не ожидал. Я теперь исправил это так, надеюсь, единственные оставшиеся решения должны будут соблюдать ограничения, которые я намеревался.
Реализует сложение как именованную функцию
Попробуйте онлайн!
источник
u
, но я застрял без этого.u
?.count
, Я могу получить строку до тех пор, пока желаемый результат, но у меня нет возможности взять ее длину.__import__('sys').setrecursionlimit(100)
... и ничего на самом деле не было исправлено. Я не очень хочу публиковать его в ветке грабителя, но мне кажется, что это измена. Попробуйте онлайнJava 8, взломано @ OlivierGrégoire
Вот моя попытка. Идея состоит в том, чтобы просто перегрузить все пространства имен, которые вы можете использовать для вывода (и, я надеюсь, отразить). Выход предназначен для sdout (System.out).
Чёрный список обычно хуже, чем белый, поэтому я уверен, что это просто вопрос времени, когда кто-то придумает подход, который я не рассматривал.
источник
class String{}
после тестирования, даже не подозревая, что это может выбитьmain(String[] ...)
. Это должно сработать сейчасint sum = 0; new Exception("" + sum) { public void printStackTrace() { ClassLoader cl = ClassLoader.getSystemClassLoader(); try { printStackTrace(new PrintStream((PrintStream)cl.loadClass("java.lang.System").getDeclaredField("out").get(null))); } catch (Exception e){} } }.printStackTrace();
cQuents, взломанные Mayube
Это должно быть довольно легко, но вы никогда не знаете.
«Проблема» заключалась в том, что без
C
в вашем коде вы получили ошибку.Решение Mayube:
Каждый элемент в последовательности является первым входом плюс второй раз третий (он же 1)
Мои решения:
Последовательность циклически переключается между первым входом плюс вторым входом и третьим входом (1). Первый пункт во втором есть
A+B
.Аналогично решению Mayube - вместо умножения
B*C
просто складывает,C
а затем вычитает.Попробуйте онлайн!
объяснение
В настоящее время эта программа выводит данные
1
, так как при отсутствии пользовательского ввода первый вход является первым1
в вводе по умолчанию (#
).источник
Default input is combined with user input to form the total input, which must align with the expected input (which is based on the highest input requested by the Sequence Definition)
A,B,C,D,E
в коде. Например, если в какой-то моментD
в вашей программе есть переменная , синтаксический анализатор ожидает, что будет 4 входа, но если он также естьE
, анализатор ожидает, что будет 5 входов. Там не может быть меньше, чем ожидаемая сумма. Однако всегда есть необязательный последний входn
, который по-разному используется в разных режимах.A
, поэтому он ищет один вход. Так как есть два, оба из#
которых указывают вход по умолчанию, он использует первый какA
значение, а второй какn
.BC
, A был бы первым входом, B был бы вторым, C был бы 1, а n был бы вторым 1?#1,1
(без полосы), это было бы: A как первая 1, B как вторая 1, C как первый вход и n как второй вход. Вы также можете сделать#1|1
, где A является первым 1, B является первым входом, C является вторым входом, а n является вторым 1.Node.JS версия 7.3.0 (взломано Домом Гастингсом)
Разместите второй блок кода после первого.
Отказ от ответственности: второй блок кода не будет функционировать сам по себе (без размещения после первого). Если это не разрешено, я могу изменить второй фрагмент.
Это полная программа. Вывод
process.stdout
(STDOUT), вводprocess.argv
(аргументы командной строки)Это мои первые полицейские и грабители, надеюсь, это хороший вызов :)
Попробуйте онлайн!
Задача объяснена
Генерирует случайную величину
n
от 0 до 1e7. Если вы вызываете write с правильным значениемn
, ничего не печатается, а устанавливаетсяl
в 0, что «разблокирует» функцию записи, что позволяет вам печатать что угодно. Если вы попытаетесь вызвать write с ненулевой строкой, вы попадете в бесконечный цикл. Если вы попытаетесь вызвать write с чем-либо, кроме правильного, вn
то время как запись «заблокирована», отправьте вас в бесконечный цикл, чтобы предотвратить угадывание.Предполагаемое решение
Пробирается мимо typeof, который, по-видимому, проверяет строки только с помощью Symbol, который также начинается с s. Это приводит к ошибке в функции, вызванной вызовом eval, потому что вы не можете добавить строку "f" в Symbol. Мы отлавливаем ошибку и используем регулярное выражение для восстановления
n
из трассировки стека, где она находится в имени функции. Затем мы пытаемся написать,n
который ничего не печатает, но устанавливает переменную «lock»l
в 0, чтобы «разблокировать» функцию записи. Теперь, когда функция записи разблокирована, мы просто выводим сумму.источник
RProgN2 , Трещины на Арнольд Палмер
Записывает все математические операторы, без возможности их восстановления. В частности, он заменяет их функцией, удаляющей два верхних элемента в стеке.
Попробуйте онлайн!
Оригинальное решение
Попробуйте онлайн!
источник
²
делает этот символ. Хотите просветить меня?[[
в этом случае следующие два понятия и оборачивает их в функцию @ArnoldPalmer«»
создает локальные переменные, а не портит глобальные переменные.Haskell,
161144 байт, Трещины на славкаВход в STDIN, выход в STDERR. Добавьте в конец программы.
Редактировать: предназначен для компиляции без дополнительных аргументов GHC, только нормальный
ghc --make prog.hs
.Отредактировано снова, чтобы уменьшить количество байтов.
Веселиться!
источник
main = do x <- readLn :: IO Integer; y <- readLn; print $ x + y
main
функция будет в модуле,Main
если-main-is
флаг не указан .Маскарпоне , взломанный Илмари Каронен
На входе вводятся церковные цифры, используемые
i
для приращения иz
для нуля. Например, 2 + 3 будет:С завершающим символом новой строки
вывод должен быть числом на stdout в том же формате, что и на stdio. Например, если ответ пять, вы должны вывести:
(Маскарпоне не имеет понятия о числах)
Предполагаемое решение:
Это не сразу видно из документации, но, как сказал @IlmariKaronen в своем крэке, строковые литералы в маскарпоне на самом деле являются синтаксическим сахаром для проталкивания последовательности символов.
Я намеренно писал комментарии,
[this]$
чтобы я выглядел так, будто я нажимаю на строку и сразу же высовываю ее. Наивный взломщик мог попробовать что-то вроде[:,>!]/*
толкания строки, обмена с интерпретатором и интерпретации.Я также притворяюсь, что выталкиваю интерпретатор, который оставил в стеке
$
, но$
уже был переопределен в NOP. Вы остаетесь с этим интерпретатором в стеке, и вы должны носить его с собой по всей программе; через каждый символ каждой строки.источник
C # (.NET Ядро) Трещины от Илмари Karonen
Также трещины на Навина .
Считывает два значения из стандартного ввода и записывает результат в стандартный вывод. Протестировано на Windows с Framework версии 3, 4.6 и на TIO .
Вот полная программа, которую я намеревался.
Попробуйте онлайн!
источник
GolfScript , взломанный Деннисом
Попробуйте онлайн!
Это является код-гольф вызов, в конце концов, так почему бы не попробовать GolfScript?
Действительным решением должен быть фрагмент, который считывает два целых числа из стека, складывает их вместе и возвращает результат в стеке. Подвох в том, что он все равно должен работать даже после того, как приведенный выше код переопределил почти все встроенные операторы GolfScript, чтобы ничего не делать. По крайней мере, я оставил
;
нетронутым, так что вы все равно можете вытолкнуть значения из стека. ;-) Ваш код должен работать на стандартном интерпретаторе GolfScript, как это реализовано, например, на TIO (см. Ссылку выше).Решение Дениса , как и мое , опирается на редко используемую функцию GolfScript, которая позволяет интерполировать код Ruby в двойных кавычках. Мы используем эту функцию для определения нового оператора сложения, который работает точно так же, как встроенный
+
оператор, и затем вызываем его.(Одна из причин, почему функция интерполяции Ruby в GolfScript так редко используется, заключается в том, что, к сожалению, интерполированный код Ruby выполняется во время синтаксического анализа , и его вывод кэшируется интерпретатором GolfScript. Таким образом, если, например, у вас есть строка с интерполированным кодом Ruby в цикле код будет запускаться только один раз до запуска самой программы и после этого всегда возвращать одно и то же значение на каждой итерации цикла. Вы можете обойти это, используя строку eval для отсрочки синтаксического анализа, но это делает и без того неудобный синтаксис еще более некрасиво и многословно, и в любом случае для этой задачи я также отключил оператор eval
~
, но оказалось, что определение новых встроенных операторов GolfScript это то, что эта функция делает довольно красиво и чисто.)источник
"#{var'_','gpush a+b'.cc2}";_
, которое работает точно так же, как у вас, за исключением того, что на несколько байт короче.Node.js v8.2.0, взломан Домом Гастингсом
Вы должны реализовать
logic
функцию. Входные данные - это аргументы (из стандартного ввода), выходные данные - то, что возвращает ваша функция (выводится в стандартный вывод).Моя кодовая церковь кодирует числа из входных данных. Остальная часть кода просто для того, чтобы запугать вас.
Функция беспорядка делает некоторую хитрость для реализации бессмысленной нотации (
a . b == dot (a) (b)
), которую я в основном использую для добавления. id .
к случайным местам, которая ничего не делает, но сбивает с толку любого, незнакомого с функциональным программированием.Преобразование, примененное к числам до того, как я передаю их в
logic
функцию, - этоx+1
иy-1
, которое добавляет до 0, так что это еще один NOP, который нужно добавить в неизвестность.Предполагаемое решение было:
источник
Информ 7 , взломанный ppperry
Ввод должен быть набран игроком в виде интерактивной команды, например,
add 17 to 25
илиsum 17 25
. Вы можете выбрать точную форму команды, которую следует ввести, если она содержит два числа. Сумма чисел (например42
) должна быть напечатана в ответ на команду.Задача, конечно же, заключается в том, чтобы сделать это, в то время как вся операция «чтение команды» заменяется запретом. Есть, вероятно, несколько способов решить эту проблему, но, по крайней мере, это должно потребовать некоторого знакомства с языком. Тот, который я придумал, на самом деле довольно простой, хотя и немного неожиданный.
Я проверил свое решение в среде GNOME Inform 7, версия 6L38 , в Ubuntu Linux. Предполагаемое решение работает как на бэкэндах Glulx, так и на Z-машине, и должно работать на других последних версиях Inform 7. Обратите внимание, что (без подходящего обходного пути) приведенный выше код приведет к тому, что интерпретатор будет занят циклом при попытке прочитать команду; По-видимому, интерпретатор Z-машины перестает отвечать на запросы, когда это происходит, и не может быть остановлен внутри IDE, поэтому я рекомендую использовать Glulx для тестирования.
источник
CPython 3 (снова), взломанный Сизифом
Вы можете делать все, что захотите - до тех пор, пока это не будет реализовано в C. Это означает, что нет
print
, нетinput
- все они попадут в_(1)
очередь и завершатся. Ввод из STDIN с числами в двух отдельных строках, вывод в STDOUT. Интересно, как долго это продлится ... Мне потребовалось немало времени, чтобы найти второй рабочий фрагмент после того, как придумал этот трюк с отключением. Явное указание Cpython, чтобы избежать взлома на основе какой-либо альтернативной реализации sys.setprofile.источник
functools
?Java 8 ( треснувший )
Вторая попытка На этот раз я потратил две минуты тестирования.
Большинство вещей должно быть покрыто.
источник
Python 2 взломан
Попробуйте онлайн!
Я предвосхищу это, сказав, что этот ответ - резкое движение, задуманное как ответ с нижней границей.
Вдохновленный ответами Wheat Wizard и HyperNeutrino .
Фрагмент читает исходный файл и отказывается продолжать, если последний разделенный пробелом фрагмент кода не попадает в25
e6400dd63733d10ec042e3c28033cfa85e1d25fbef80020810c354d7c942e843
.РЕДАКТИРОВАТЬ : Отредактировано немного в ответ на этот комментарий . Основная проблема не меняется, любая попытка взлома не считается недействительной.
источник
This code is not allowed to crash or exit.
Java 8 Трещины на @ OlivierGrégoire
Я пытался сделать это как можно сильнее! :) И, в отличие от другого ответа на Java, вы должны будете следовать точным правилам испытания, поместив его после всего этого фрагмента (так что нет, вы не помещаете свой код в
public static void main(String[] args)
метод, вы помещаете его после всего занятия. :) Удачи!Я добавил комментарии, чтобы показать, что ограничивается.
( Вдохновленный этим постом, который является менее ограничительным и приемлемым с тем же подходом, который я мог бы использовать в своем ответе. )
Попробуй это здесь. (ideone.com вместо TIO, так как там, похоже, он не работает .. Тестирование было выполнено в Eclipse IDE, но мое намеченное решение действительно работает, если вы используете ideone.com)
источник
Желе: трещины
Это будет безумно легко по сравнению с удивительным Python-ответом Wheat Wizard, но здесь мы идем: P
Шестнадцатеричный sha256 моего решения, включая первый фрагмент, есть
cfeb1e193ad77f66f039c0d6a792a3e4c311490f6412698e019ca1fae10c0e0a
.Запись
Вы можете не иметь никаких новых строк в коде, кроме строк, в противном случае этот код даже не будет выполняться, что противоречит цели этой задачи.
Взломанный DJMcMayhem
Честно говоря, здесь используется новая строка, поэтому я хотел бы увидеть решение, которое не использует новую строку.
Также решение Джонатана Аллана
Это не использует новую строку, поэтому он был взломан. :П
Мое решение таково:
Первый фрагмент удаляет только односимвольные атомы, что означает, что Python eval все еще работает :)))
источник
JavaScript, Cracked
Вход:
prompt()
дваждыВыход:
console.log()
Мое решение не работает в jsfiddle. Работает на странице about: blank с консолью Google Chrome JS.
Мое решение:
Объяснение:
Я удалил приглашение и консоль, установив их равными 0.
В своем решении я создаю iframe, который создает песочницу, и новый экземпляр окна, в котором приглашение и консоль работают правильно.
источник
Ява, Трещины
Это
должно было бытьочень легко взломать.Предполагаемое решение
Попробуйте онлайн
источник
java.io
.. Но вы все