Шаблон програми для друку * будь-якого * рядка


40

Напишіть програму з такими властивостями:

  • Коли запустити як є, програма не видає вихід (тобто 0 байт виводу).

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

    Це повинно працювати незалежно від того, чи містить рядок лапки, зворотні риски, позначки коментарів, роздільники, байти NUL тощо; незалежно від того, що ви розміщуєте там, рядок все ще інтерпретується як рядок і друкується повністю дослівно. Однак ви не можете обробити дуже довгі рядки, якщо вони призведуть до того, що у компілятора не вистачить пам’яті тощо (якщо бути точним, ви повинні принаймні мати можливість обробляти рядки до 1000 байт довгими або трьома разів більше тривалість вашої програми, залежно від того, що більше).

Прикладом недійсного рішення може бути

print("");
#      ^ text goes here

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

Зауважте, що ця проблема, мабуть, неможлива для більшості мов; виклик полягає хоча б частково у пошуку мови там, де вона працює. Вибрана мова повинна бути мовою програмування відповідно до визначення цього веб-сайту , наприклад, не надсилаючи рішення в тексті .

Оскільки це , виграє найкоротший шаблон програми. Однак не варто відмовлятись від подання рішень, навіть якщо вони не можуть перемогти поточного переможця! Ви все ще можете позмагатися за друге, третє і т. Д. Місце, або просто знайти якомога більше відповідей там, де це можливо. Однак ви повинні переконатися, що ваша програма відповідає всій специфікації перед її надсиланням; приблизні рішення пропустили б проблему.


Відповідна публікація пісочниці тут .

Чи можете ви уточнити діапазон символів, який нам потрібно підтримувати для вставленого рядка? ASCII? ASCII + недрукований? Все з unicode?
DJMcMayhem

3
Всі 256 октетів. Чи ви інтерпретуєте їх як байти чи Unicode - це ви самі; це не матиме великої різниці при його друкуванні.

1
Завдання запитання (і спосіб його викладу) полягає в тому, що ви не можете мати додаткових результатів. Чи мали ви на увазі рішення, яке неможливо адаптувати, щоб його уникнути? (Використання додаткових байтів, щоб уникнути збитого виходу, бажано створювати зниклий вихід і не відповідати специфікації.)

1
Якщо для цього не потрібна зміна коду, це було б тривіально AWK, просто це 1було б зроблено.
Роберт Бенсон

Відповіді:


37

Excel, 1 байт

'

Безгольова версія

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

Я не думаю, що це може приймати нові рядки.
Conor O'Brien

3
@ ConorO'Brien це робить з shift + enter
Адам,

2
@MrPaulch Це було дуже багато ретро-інженерії. Я впевнений, що ця команда приховує деякі інші невідомі функції, як, наприклад, збій системи.
Адам

1
Це також працює на OpenOffice Calc. Він використовується автоматично під час встановлення комірки у форматі @.
Ісмаїл Мігель

1
Особисто я вважаю, що ця відповідь чудова. @Dennis видалив мій пост Mathematica, який використовує ту саму концепцію. Передній кінець excel зберігатиме тест // "" "/// як не дослівний рядок, тому за його логікою це слід видалити. Ось як він зберігається <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

Zsh, 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
для bash ви можете використовувати sed 1dзамістьtail -n+2
Адам,

13

brainfuck (Нечитабельний Brainfuck ), 9 байт

,+[-.,+]!

Додайте вхід до кінця. Цього разу не існує зворотного нового рядка.

Шукаючи мови, які могли б прийняти вкладений текст, доданий до кінця програми, мозковий епізод здавався виразною можливістю; багато перекладачів, написаних езолангами, приймають як програму, так і вклад програми зі стандартного введення, і тому потрібен певний спосіб розказати між ними. Існує умова, яка використовується в цьому випадку, що !персонаж розрізняє програму та вхід, трюк, який часто використовується для написання коротких програм, таких як епізод ,[.,]!Hello, world!; це, по суті, створює інший діалект головного мовлення, в якому !має інше значення від нормального.

Таким чином, теоретично ми могли просто знайти одного з цих перекладачів і дати йому catпрограму для виконання специфікації. Однак є основна тонкощі; brainfuck зазвичай використовує 256 значень для кожної комірки, є 256 октетів, і один повинен бути використаний для EOF. Отже, якщо ми хочемо буквально відлунювати всі 256 октетів, ми взагалі не можемо виявити EOF і нам доведеться завершити програму іншим способом. Іншими словами, нам потрібно знайти реалізацію, яка або дає 256 октетів і EOF 257 різних значень, або яка збої в EOF.

Введіть Нечитабельно . Там в Brainfuck перекладач в нечитабельним , який передує цей виклик, і який приймає вхідні дані після !; окрім того, на відміну від більшості перекладачів, які працюють на мозку, він використовує бігутові клітини та -1 для EOF, що дозволяє відрізняти EOF від інших 256 можливих октетів. Таким чином, використовуючи Нечитабельний Brainfuck як специфічний інтерпретатор програми, ми можемо вирішити завдання всього за 9 байтів, написавши програму мозгового ебанку, catяка зупиняється на EOF = -1.

Чи можна зробити краще? Що ж, ми можемо спробувати наступну 7-байтну програму, яка намагається вивести EOF в кінці рядка, перш ніж він вийде з циклу:

+[,.+]!

Поведінка цієї програми залежить від поведінки нечитабельного інтерпретатора за умов помилок (таким чином, це залежить не тільки від реалізації мозкового ебання, але і від реалізації, що використовується для запуску реалізації мозкових процесів). На жаль, інтерпретатор "Нечитабельний", який я використовую, видає помилки на стандартному виході , тобто це збереження не працює. Якщо хтось знає про нечитабельний перекладач, який виходить із спроби вивести EOF або мовчки пропускає спробу, дайте мені знати; це було б семибайтним рішенням саме там.


1
,[.,]!працює тут і становить 6 байт (просто позначте поле, позначене !). Також він припиняється.
FinW

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

він працював нормально без байта NUL, коли я це робив.
FinW

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

Але якщо інтерпретатор не читає жодного вводу (наприклад, кінець рядка після !), він автоматично встановлює поточний елемент стрічки 0, отже закінчуючи цикл.
FinW

9

Діалог APL , 11 байт

Далі йде тіло функції f :

2↓⎕CR'f'⋄→

Існує зворотний новий рядок, після якого може бути вставлено все, що завгодно.

2↓ випадають перші два рядки (заголовок і цей рядок) з

⎕CR'f'З haracter R epresentation з F

тоді

кинути


9

Рубін, 20 байт

друк * ДАНІ
__END__

Введення йде в кінці (після закінчення нового рядка). 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>

Ви можете вставити все, що завгодно, безпосередньо перед тегом закриття тіла. Це працює, отримуючи джерело сторінки та знімаючи код відкриття та теги закриття.

Справжній кікер розгадував, як уникнути нескінченного циклу. Якщо розмістити 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 () робить саме те, що ви очікували від імені. Попередній код просто відкриває файл і записує будь-які байти після останньої крапки з комою в stdout. 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 байт

Це головним чином для відповіді на питання, як надрукувати текст, який міститься у відповіді Адама на вікно негайних негараздів у середовищі VBA

Основна настройка:

У комірці А1 в списку активів використовуйте формулу нижче, щоб утримувати рядок, який слід надрукувати. Для підрахунку байтів до цього додається 1 байт

'[Your Text Here]

наприклад:

'Hello 
World

Функція вікна негайних функцій, 5 + 1 = 6 байт

?[A1]

+1 байт для 'комірки A1


0

Vim (у колишньому режимі), 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.