Напишите программу со следующими свойствами:
При запуске как есть, программа не выдает выходные данные (т. Е. 0 байтов вывода).
Внутри программы есть место (по вашему выбору: оно может быть в начале, в конце или где-то посередине) со следующим свойством: изменение программы путем помещения туда любой строки приведет к тому, что результирующая программа напечатает эту строку, когда казнены.
Это должно работать независимо от того, содержит ли строка кавычки, обратную косую черту, комментарии, разделители, байты NUL и т. Д .; Неважно, что вы там разместите, строка все равно интерпретируется как строка и печатается полностью дословно. Однако вы можете не обрабатывать очень и очень длинные строки, если они приведут к тому, что компилятору не хватит памяти или тому подобное (если быть точным, вы должны по крайней мере иметь возможность обрабатывать строки длиной до 1000 байт или в три раза больше длина вашей программы, в зависимости от того, что больше).
Пример неверного решения будет
print("");
# ^ text goes here
в Python, Perl, Ruby и т.д .; хотя он работает для многих строк, он не будет работать для строки, содержащей двойные кавычки, или для строки, содержащей подстроку \n
(которая будет интерпретироваться как новая строка ).
Обратите внимание, что эта проблема, вероятно, невозможна в большинстве языков; Проблема, по крайней мере, частично в том, чтобы найти язык, на котором он работает. Выбранный вами язык должен быть языком программирования согласно определению этого сайта , например, не предлагать решение в текстовом формате .
Поскольку это код-гольф , выигрывает самый короткий шаблон программы. Тем не менее, не отчаивайтесь от представления решений, даже если они не могут победить нынешнего победителя! Вы по-прежнему можете побороться за второе, третье и т. Д. Место или просто найти как можно больше ответов там, где это работает. Вы должны, однако, убедиться, что ваша программа соответствует всей спецификации перед ее отправкой; Приближенные решения не позволят решить проблему.
AWK
, просто1
сделало бы это.Ответы:
Excel, 1 байт
Неуправляемая версия
источник
@
.Джольф, 6 байт
объяснение
источник
Perl 5 ,
302119 байтПопробуйте онлайн!
Завершающий перевод строки. Это использует функцию Perl, которая позволяет добавлять произвольные данные к исходному файлу, которые затем могут быть прочитаны с помощью
DATA
дескриптора файла. Когда мы даем файловый дескриптор в качестве аргументаprint
, он получает контекст списка, который заставляет файловый дескриптор возвращать список всех строк в файле, включая новые строки (аналогично, новая строка в последней строке будет опущена). затемprint
неявно объединяет их все, отменяя разбиение на строки и давая нам точную исходную строку независимо от того, где были новые строки.Благодаря @Dada, который понял, что нет необходимости обрабатывать переводы строк вручную, а также @ninjalj и @b_jonas, каждый из которых заметил персонажа, которого можно сыграть в гольф.
источник
undef$/
. В качестве аргументаprint
,<DATA>
вызывается в контексте списка, поэтому он должен читать каждую существующую строку.__END__
вместо__DATA__
.Зш, 6 байт
Есть завершающий перевод строки. Строка вставляется в конец программы.
Bash,
2017 байтСпасибо Адаму за удаление 3 байтов.
* скрипт оболочки nix,
2114 байтСпасибо Адаму за удаление 7 байтов.
источник
zsh
Решение кажется правильным; однако 9-байтовоеbash
решение неверно (оно добавляет завершающий символ новой строки, если в файле его нет).sed 1d
вместоtail -n+2
brainfuck ( нечитаемый Brainfuck ), 9 байт
Добавьте вход в конец. На этот раз нет завершающего символа новой строки.
В поисках языков, которые бы принимали входные данные, добавленные в конец программы, мозговой отрывок казался отличной возможностью; Многие интерпретаторы «мозгового потрясения», написанные на языке esolangs, берут как программу, так и ввод программы из стандартного ввода и, таким образом, нуждаются в некотором способе различения между ними. Существует соглашение, которое используется в этом случае, когда
!
символ различает программу и ввод, трюк, который часто используется для написания таких коротких программ, как,[.,]!Hello, world!
; это в основном создает другой диалект мозгового!
удара, в котором значение отличается от нормального.Поэтому теоретически мы могли бы просто найти одного из этих переводчиков и дать ему
cat
программу для выполнения спецификации. Есть большая тонкость, хотя; brainfuck обычно использует 256 значений для каждой ячейки, 256 октетов, и для EOF нужно использовать одно. Поэтому, если мы хотим иметь возможность буквально отображать все 256 октетов, мы вообще не можем обнаружить EOF и должны завершить программу другим способом. Другими словами, нам нужно найти реализацию, которая либо дает 256 октетов и EOF 257 различных значений, либо аварийно завершает работу в EOF.Введите нечитаемый . В «Нечитабельном» есть интерпретатор «бред», который предшествует этой задаче и принимает входные данные после
!
; кроме того, в отличие от большинства интерпретаторов brainfuck, он использует ячейки bignum и -1 для EOF, что позволяет отличать EOF от других 256 возможных октетов. Таким образом, используя Unreadable Brainfuck в качестве специального интерпретатора для программы, мы можем решить задачу всего за 9 байтов, написавcat
программу brainfuck, которая останавливается при EOF = -1.Можно ли сделать лучше? Что ж, мы могли бы попробовать следующую 7-байтовую программу, которая пытается вывести EOF в конец строки, прежде чем она выйдет из цикла:
Поведение этой программы зависит от поведения интерпретатора Unreadable в условиях ошибки (таким образом, оно зависит не только от реализации brainfuck, но и от реализации, используемой для запуска реализации brainfuck). К сожалению, нечитаемый интерпретатор, который я использую, выдает ошибки при стандартном выводе , что означает, что это сохранение не работает. Если кто-то знает о нечитабельном интерпретаторе, который завершается при попытке вывести EOF или молча пропускает попытку, дайте мне знать; это было бы семибайтовое решение прямо здесь.
источник
,[.,]!
работает здесь и составляет 6 байт (просто отметьте поле с пометкой!
). Также это заканчивается.,
(читать стандартный ввод для текущего элемента ленты), а затем]
(выходной цикл, если текущий элемент ленты равен 0). Таким образом, чтение входного байта со значением 0 (т. Е. NUL) нарушит цикл.!
), он автоматически устанавливает текущий элемент ленты на 0, поэтому цикл завершается.Дьялог АПЛ , 11 байт
Ниже приводится тело функции f :
Есть завершающий символ новой строки, после которого можно вставить что угодно.
2↓
отбросьте первые две строки (заголовок и эта строка)⎕CR'f'
С haracter R epresentation из F⋄
тогда→
уволитьсяисточник
Рубин, 20 байтов
Ввод идет в конце (после завершающего символа новой строки). Эта
DATA
идиома - одна из многих, которые Руби украл у Perl .Попробуйте это на eval.in: https://eval.in/684370
источник
JavaScript + HTML5 DOM, 163 байта
Вы можете вставить все что угодно непосредственно перед закрывающим тегом body. Это работает путем извлечения исходного кода страницы и удаления кода открытия и тегов закрытия.
Настоящий кикер придумывал, как избежать бесконечной петли. Ввод
while(true){}
на страницу навсегда блокирует все обратные вызовы, останавливая выполнение, и JavaScript не может приостановить основной поток. Однако код, который больше не существует, никогда не запускается, поэтому тело документа фиксирует seppuku в самой последней команде, удаляя себя, ожидая загрузки своего клона.Да, он длинный и обходной, но сам факт того, что это возможно в JS, удивителен.
источник
PHP, 46 байт
(включая конечный разрыв строки)
Да: даже
file
функция является бинарно-безопасной.[""]+
заменяет 0-индекс (первую строку файла) пустой строкойисточник
gs2 , 4 байта
Использует кодировку CP437. Строка идет в конце.
╥
получает исходный код,¶
нажимает 4,=
отбрасывает столько начальных символов и☼
завершает работу.Попробуйте онлайн!
источник
PHP 94 байта
Поместите строку после последней точки с запятой.
Уга за неясные черты наверное? __halt_compiler () делает именно то, что вы ожидаете от имени. Предыдущий код просто открывает файл и записывает любые байты после этой последней точки с запятой в стандартный вывод. NUL, BEL и т. Д. Выходят нормально. Литералы Unicode (♪) испорчены в Windows, но я думаю, что это просто ошибка Windows cmd в Unicode.
источник
false!==$c=...
нуждается в скобках. 3) неrb
нуждается в кавычках. 4) Вы можете сохранить один байт сfor($f=fopen(...),fseek($f,88);false!==(...);)echo$c;
5) еще на два байта короче:<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
fgets
и добавите в шаблон завершающий перенос строки.Perl 6 , 23 байта
Строка помещается после новой строки после
=finish
.источник
PHP,
4860 байтПросто стало известно, что закрытие PHP не мешает строке содержать
<?
.источник
<?die(substr(file_get_contents(__FILE__),48))?>STRING HERE
. Должно сработать. Я пытался с,<?die('a')?>
и это сработало.die
не печатает его параметр, но отправляет его как код выхода. Это должно бытьdie(print ...)
.file
. На самом деле, я не могу думать ни о чем другом.die('text');
Двоичное лямбда-исчисление , 1 байт
Это один пробел (0x20) перед текстом.
Попробуйте онлайн!
Как это работает
0x20 = 00100000 2 анализируется как
(Так что на самом деле любой из персонажей
!"#$%&\'()*+,-./
будет работать одинаково хорошо.)Поскольку это полное выражение, оставшаяся часть программы интерпретируется как входные данные, а в соответствии с соглашениями ввода-вывода двоичного лямбда-исчисления тождественная функция λ x. x копирует вход непосредственно на выход.
источник
Баш, 17 байт
Разработано независимо от ответа jimmy23013 .
источник
$0
? Кроме того, я думаю, что это работает (я подтвердил, что ничего не анализирует послеexit
).RProgN , 19 байт
Обратите внимание на завершающий пробел.
Вставьте любой текст после этого чанка, и он будет напечатан.
Основано на ответе Линн gs2 .
Попробуйте онлайн!
источник
Excel VBA, 6 байт
Это главным образом, чтобы ответить на вопрос о том, как напечатать текст, как содержится в ответе Адама на окно Immediates в среде VBA.
Базовая настройка:
В ячейке A1 в активном листе используйте формулу ниже, чтобы сохранить строку для печати. Для подсчета байтов это добавит 1 байт
например:
Функция непосредственного окна, 5 + 1 = 6 байт
+1 байт для
'
ячейки A1источник
Vim (в режиме ex), 28 байт
28 байт, включая последний перевод строки.
источник
Vim, 738 байт
Перепривязывает все управляющие символы в режиме вставки к
<c-v>
последующим этим управляющим символом, который вводит их буквально. ^ _ (разделитель блоков), похоже, не нуждается в повторном связывании, так как он выводится буквально по умолчанию.Переменный текст приходит в конце, конечно.
источник