Шаблон программы для печати * любой * строки


40

Напишите программу со следующими свойствами:

  • При запуске как есть, программа не выдает выходные данные (т. Е. 0 байтов вывода).

  • Внутри программы есть место (по вашему выбору: оно может быть в начале, в конце или где-то посередине) со следующим свойством: изменение программы путем помещения туда любой строки приведет к тому, что результирующая программа напечатает эту строку, когда казнены.

    Это должно работать независимо от того, содержит ли строка кавычки, обратную косую черту, комментарии, разделители, байты NUL и т. Д .; Неважно, что вы там разместите, строка все равно интерпретируется как строка и печатается полностью дословно. Однако вы можете не обрабатывать очень и очень длинные строки, если они приведут к тому, что компилятору не хватит памяти или тому подобное (если быть точным, вы должны по крайней мере иметь возможность обрабатывать строки длиной до 1000 байт или в три раза больше длина вашей программы, в зависимости от того, что больше).

Пример неверного решения будет

print("");
#      ^ text goes here

в Python, Perl, Ruby и т.д .; хотя он работает для многих строк, он не будет работать для строки, содержащей двойные кавычки, или для строки, содержащей подстроку \n(которая будет интерпретироваться как новая строка ).

Обратите внимание, что эта проблема, вероятно, невозможна в большинстве языков; Проблема, по крайней мере, частично в том, чтобы найти язык, на котором он работает. Выбранный вами язык должен быть языком программирования согласно определению этого сайта , например, не предлагать решение в текстовом формате .

Поскольку это , выигрывает самый короткий шаблон программы. Тем не менее, не отчаивайтесь от представления решений, даже если они не могут победить нынешнего победителя! Вы по-прежнему можете побороться за второе, третье и т. Д. Место или просто найти как можно больше ответов там, где это работает. Вы должны, однако, убедиться, что ваша программа соответствует всей спецификации перед ее отправкой; Приближенные решения не позволят решить проблему.


Соответствующий пост Песочницы здесь .

Можете ли вы уточнить диапазон символов, который мы должны поддерживать для вставленной строки? ASCII? ASCII + непечатный? Все о юникоде?
DJMcMayhem

3
Все 256 октетов. Интерпретируете ли вы их как байты или Unicode, зависит от вас; это не будет иметь большого значения, когда это напечатано.

1
Цель вопроса (и способ, которым он в настоящее время сформулирован) состоит в том, что у вас не может быть никакого дополнительного вывода. Вы имели в виду решение, которое не может быть адаптировано, чтобы избежать его? (Использование лишних байтов для предотвращения случайного вывода предпочтительнее, чем создание случайного вывода и не соответствует спецификации.)

1
Если бы это не требовало изменения кода, это было бы тривиально AWK, просто 1сделало бы это.
Роберт Бенсон

Ответы:


37

Excel, 1 байт

'

Неуправляемая версия

'        <-- print the following text,
             and exit the current formula

Я не думаю, что это может принять новые строки.
Конор О'Брайен

3
@ ConorO'Brien это делает с Shift + Enter
Адам

2
@MrPaulch Это было довольно много ретро техники. Я уверен, что эта команда скрывает некоторые другие неизвестные функции, например, сбой системы.
Адам

1
Это также работает на OpenOffice Calc. Он используется автоматически, когда вы устанавливаете ячейку в формат @.
Исмаэль Мигель

1
Лично я думаю, что этот ответ в порядке. @Dennis удалил мой пост Mathematica, который использует ту же концепцию. Внешний интерфейс Excel будет хранить test // "" "/// как невербальную строку, поэтому по логике его следует удалить. Вот как он хранится <Row> <Cell> <Data ss: Type =" Строка "x: Ticked =" 1 "> test // & quot; & quot; /// </ Data> </ Cell> </ Row>
Келли Лоудер


15

Perl 5 , 30 21 19 байт

печать <DATA> __ END__

Попробуйте онлайн!

Завершающий перевод строки. Это использует функцию Perl, которая позволяет добавлять произвольные данные к исходному файлу, которые затем могут быть прочитаны с помощью DATAдескриптора файла. Когда мы даем файловый дескриптор в качестве аргумента print, он получает контекст списка, который заставляет файловый дескриптор возвращать список всех строк в файле, включая новые строки (аналогично, новая строка в последней строке будет опущена). затемprint неявно объединяет их все, отменяя разбиение на строки и давая нам точную исходную строку независимо от того, где были новые строки.

Благодаря @Dada, который понял, что нет необходимости обрабатывать переводы строк вручную, а также @ninjalj и @b_jonas, каждый из которых заметил персонажа, которого можно сыграть в гольф.


2
Я не думаю, что вам нужно undef$/. В качестве аргумента print, <DATA>вызывается в контексте списка, поэтому он должен читать каждую существующую строку.
Дада

Вы правы. Он считывает входные данные по строке, сохраняя разделители строк, а затем неявно объединяет их все при печати, так что нет необходимости в первую очередь использовать лоскут. Это также 8-байтовая экономия; Я пойду починить пост.

4
Вы можете использовать __END__вместо __DATA__.
ниндзя

Что говорит @ninjalj, плюс вы можете опустить символ новой строки после знака «больше, чем» (но вам нужен символ новой строки в конце программы).
b_jonas

14

Зш, 6 байт

<<'
'

Есть завершающий перевод строки. Строка вставляется в конец программы.

Bash, 20 17 байт

Спасибо Адаму за удаление 3 байтов.

exec sed 1d "$0"

* скрипт оболочки nix, 21 14 байт

Спасибо Адаму за удаление 7 байтов.

#!/bin/sed 1d

1
@Copper Есть завершающий перевод строки. Строка вставляется после этого.
jimmy23013

Ах я вижу. Спасибо, что поправили меня!
Медь

6/9-байтовые решения выглядят так, будто они используют ошибку в интерпретаторе (конечно, это не запрещено). (AFAICT, немного поэкспериментировав, ищет новую строку в строке сама по себе, но линии определяются путем разделения на новые строки, поэтому новой строки в строке само по себе никогда не может быть.) zshРешение кажется правильным; однако 9-байтовое bashрешение неверно (оно добавляет завершающий символ новой строки, если в файле его нет).

@ ais523 Мне тоже показалось, что это ошибка. И я не ожидал, что их разрешат переводчики. Убрал решение Bash.
jimmy23013

1
для Баш вы можете использовать sed 1dвместоtail -n+2
Адам

13

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 или молча пропускает попытку, дайте мне знать; это было бы семибайтовое решение прямо здесь.


1
,[.,]!работает здесь и составляет 6 байт (просто отметьте поле с пометкой !). Также это заканчивается.
FinW

@FinW: я не могу понять, как ввести байт NUL на этот сайт, но этот код определенно закончится рано, если он его увидит.

когда я это сделал, все работало без байта NUL.
FinW

1
У вас буквально есть ,(читать стандартный ввод для текущего элемента ленты), а затем ](выходной цикл, если текущий элемент ленты равен 0). Таким образом, чтение входного байта со значением 0 (т. Е. NUL) нарушит цикл.

Но если интерпретатор не читает никаких входных данных (например, конец строки после !), он автоматически устанавливает текущий элемент ленты на 0, поэтому цикл завершается.
FinW

9

Дьялог АПЛ , 11 байт

Ниже приводится тело функции f :

2↓⎕CR'f'⋄→

Есть завершающий символ новой строки, после которого можно вставить что угодно.

2↓ отбросьте первые две строки (заголовок и эта строка)

⎕CR'f'С haracter R epresentation из F

тогда

уволиться


9

Рубин, 20 байтов

печать * ДАННЫЕ
__КОНЕЦ__

Ввод идет в конце (после завершающего символа новой строки). Эта DATAидиома - одна из многих, которые Руби украл у Perl .

Попробуйте это на eval.in: https://eval.in/684370


1
Он не только украл его, он даже короче ...
simbabque

9

JavaScript + HTML5 DOM, 163 байта

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

Вы можете вставить все что угодно непосредственно перед закрывающим тегом body. Это работает путем извлечения исходного кода страницы и удаления кода открытия и тегов закрытия.

Настоящий кикер придумывал, как избежать бесконечной петли. Вводwhile(true){} на страницу навсегда блокирует все обратные вызовы, останавливая выполнение, и JavaScript не может приостановить основной поток. Однако код, который больше не существует, никогда не запускается, поэтому тело документа фиксирует seppuku в самой последней команде, удаляя себя, ожидая загрузки своего клона.

Да, он длинный и обходной, но сам факт того, что это возможно в JS, удивителен.


1
В последнее время Chrome раздражен скриптами, блокирующими парсер, и жалуется на них. Мне нравится идея намеренно блокировать синтаксический анализатор, чтобы любой скрипт в нем не испортил вашу попытку печати.

7

PHP, 46 байт

(включая конечный разрыв строки)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

Да: даже fileфункция является бинарно-безопасной.

[""]+ заменяет 0-индекс (первую строку файла) пустой строкой


6

gs2 , 4 байта

╥¶=☼

Использует кодировку CP437. Строка идет в конце. получает исходный код, нажимает 4, =отбрасывает столько начальных символов и завершает работу.

Попробуйте онлайн!


5

PHP 94 байта

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

Поместите строку после последней точки с запятой.

Уга за неясные черты наверное? __halt_compiler () делает именно то, что вы ожидаете от имени. Предыдущий код просто открывает файл и записывает любые байты после этой последней точки с запятой в стандартный вывод. NUL, BEL и т. Д. Выходят нормально. Литералы Unicode (♪) испорчены в Windows, но я думаю, что это просто ошибка Windows cmd в Unicode.


1) Я считаю 93 байта, а не 94. 2) не 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();
Тит

6) и еще два байта, если вы опустите второй параметр fgetsи добавите в шаблон завершающий перенос строки.
Титус


3

PHP, 48 60 байт

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

Просто стало известно, что закрытие PHP не мешает строке содержать <?.


У вас неуместная закрывающая скобка. Тем не менее, гораздо более аккуратный дамп файла, чем моя попытка, я думал, что substr () захлебнется нулевыми байтами - не думаю.
ToXik-yogHurt

Попробуйте это: <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Должно сработать. Я пытался с, <?die('a')?>и это сработало.
Исмаэль Мигель

@IsmaelMiguel не будет работать. dieне печатает его параметр, но отправляет его как код выхода. Это должно быть die(print ...).
Тит

@ ToXik-yogHurt большинство строковых функций являются бинарными. даже file. На самом деле, я не могу думать ни о чем другом.
Титус

@Titus Trydie('text');
Исмаэль Мигель

2

Двоичное лямбда-исчисление , 1 байт

 [text goes here]

Это один пробел (0x20) перед текстом.

Попробуйте онлайн!

Как это работает

0x20 = 00100000 2 анализируется как

00    λx.
01        x
0000  (ignored, can be anything)

(Так что на самом деле любой из персонажей !"#$%&\'()*+,-./будет работать одинаково хорошо.)

Поскольку это полное выражение, оставшаяся часть программы интерпретируется как входные данные, а в соответствии с соглашениями ввода-вывода двоичного лямбда-исчисления тождественная функция λ x. x копирует вход непосредственно на выход.


Из интереса, почему не выводятся конечные нулевые биты между функцией идентификации и вставкой?

@ ais523 Интерпретатор читает байт за раз и один раз λ x . x был проанализирован, заполнение уже было использовано.
Андерс Касеорг

2

Баш, 17 байт

tail -n+3 $0
exit
<string here>

Разработано независимо от ответа jimmy23013 .


Ты имеешь в виду $0? Кроме того, я думаю, что это работает (я подтвердил, что ничего не анализирует после exit).

@ ais523 Исправлено! Спасибо.
noɥʇʎԀʎzɐɹƆ


1

Excel VBA, 6 байт

Это главным образом, чтобы ответить на вопрос о том, как напечатать текст, как содержится в ответе Адама на окно Immediates в среде VBA.

Базовая настройка:

В ячейке A1 в активном листе используйте формулу ниже, чтобы сохранить строку для печати. Для подсчета байтов это добавит 1 байт

'[Your Text Here]

например:

'Hello 
World

Функция непосредственного окна, 5 + 1 = 6 байт

?[A1]

+1 байт для 'ячейки A1


0

Vim (в режиме ex), 28 байт

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 байт, включая последний перевод строки.


0

Vim, 738 байт

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

Перепривязывает все управляющие символы в режиме вставки к <c-v> последующим этим управляющим символом, который вводит их буквально. ^ _ (разделитель блоков), похоже, не нуждается в повторном связывании, так как он выводится буквально по умолчанию.

Переменный текст приходит в конце, конечно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.