Quine двойной обязанности: Quine! DlroW, olleH


13

Напишите программу, которая будет выводить свой собственный исходный код при запуске, и ничего больше. Кажется легко, правда?

Загвоздка в том, что при изменении исходного кода ваша программа должна вывести «Hello, World!» точно, без кавычек.

Это код-гольф, поэтому выигрывает меньшее количество байтов.

Редактировать : Ваша квина должна быть правильной.



4
@ Честно говоря, это не тот обобщенный термин, о котором я говорю, поскольку это не «функция печати X вашего исходного кода». Это сказало, что это, вероятно, не будет играть совсем не так, как другие вызовы «когда вы перевернете программу ...», которые мы имеем.
Мартин Эндер

1
@ MartinBüttner Это похоже на те проблемы, которые вы описали, и я считаю, что применимы те же аргументы.
Mego

Ответы:


8

Y 19 байт

Upxp"!dlroW ,olleH"

Uзахватывает строку Uв начале, пока Uне встретится следующая , в данном случае, исходный код. pпечатает элемент и xявляется завершающей ссылкой. В обратном порядке это выглядит так:

"Hello, World!"pxpU

Это захватывает строку и печатает ее p, снова завершая программу с x.

Попробуй это здесь!


4
Uтолкает Uнеявно? ಠ_ಠ
Sp3000

1
@ Sp3000 Это сделано для того, чтобы программа могла изменять себя. С технической точки зрения, Uкоманда - это «команда захвата звена цепи». Он не предназначен для квинтинга, но это не помешает мне использовать его для квинтинга. : P
Конор О'Брайен

1
Я не уверен, что это считается правильной формой. Наше определение требует раздела программы, который кодирует другую часть программы , но U...просто кодирует U....
Деннис

@Dennis определить кодирует? Я думал, что pбит сделал вывод, который был частью кодирования.
Конор О'Брайен,

1
Я взял закодировать как нечто, генерирующее вывод, так pи xне засчитал бы. Например, самая короткая SMBF-квина все еще считается мошеннической, хотя код должен ее распечатать. Возможно, стоит попросить Мартина дать разъяснения.
Деннис

20

JavaScript (ES6), 42 38 байт

f=_=>/\//g&&"f="+f||"!dlroW ,olleH">=_

Перевернутый

_=>"Hello, World!"||f+"=f"&&g//\/>=_=f

объяснение

При обращении становится анонимной функцией, которая возвращает строку Hello, World!.

Регулярное выражение /\//gстановится комментарием при обращении, что позволяет синтаксически неверно >=_=fзакомментировать в обратном коде.


Это очень умно. :) Я бы не подумал об этом.
ericw31415

3
+1 только для бегающих глаз =_=.
Даррел Хоффман

6

JavaScript (ES6), 71 байт

trela=a=>alert("trela="+trela+"\ntrela\n``")//
`!dlroW ,olleH`
trela
``

Как это устроено:

Строка 1 определяет функцию, trelaкоторая при запуске выводит исходный код программы. Строка 2 - это неназначенная строка, ничего не делает. Строки 3 и 4 вызывают trelaзлоупотребление синтаксисом строки шаблона.

Перевернутый:

``
alert
`Hello, World!`
//)"``n\alertn\"+alert+"=alert"(trela>=a=alert

Как это устроено:

Строка 1 - это неназначенная строка, ничего не делает. Строки 2 и 3 используют синтаксис строки шаблона для печати Hello, World!. Строка 4 является комментарием.


Я вижу, что у JavaScript, кажется, есть некоторая свобода с его синтаксисом. Ну, по крайней мере, больше, чем Python. Это мило.
Р. Кап

Пустое ли ``ненужное?
Rɪᴋᴇʀ

@EasterlyIrk Нет, необходимо вызывать trelaфункцию (которая печатает квинну) в форвардной версии
jrich

@ jrich О, я не понял, что это ``были аргументы. Здорово.
Rɪᴋᴇʀ

2
Я чувствую, что должен привыкнуть видеть trelaздесь ...> _>
Конор О'Брайен



2

ВОЗВРАТ , 94 байта

"34¤¤,,,,,,,,,,,,,% 'H'e'l'l'o',' 'w'o'r'l'd'!'"34¤¤,,,,,,,,,,,,,% 'H'e'l'l'o',' 'w'o'r'l'd'!'

Перевернутый:

'!'d'l'r'o'w' ','o'l'l'e'H' %,,,,,,,,,,,,,¤¤43"'!'d'l'r'o'w' ','o'l'l'e'H' %,,,,,,,,,,,,,¤¤43"

Try it here.

Выходы в STDOUT. Пока я не найду более подходящую среду для работы с квайнами, сейчас это нужно делать.

объяснение

"34¤¤,,,,,,,,,,,,,% 'H'e'l'l'o',' 'w'o'r'l'd'!'"

Это содержит строку quine. В обратном направлении это помещается в стек, но не выводится.

34¤¤,,,,,,,,,,,,,

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

% 'H'e'l'l'o',' 'w'o'r'l'd'!'

Этот объект выводит верхний элемент стека (в обратном порядке это приводит к появлению пробела) и помещает в стек серию кодов (в обратном порядке эти коды будут впоследствии напечатаны серией символов ,).


Я не могу сказать, является ли это действительно сумасшедшим кодом RETURN или просто нормальным кодом RETURN ._.
Вниз

И то и другое ;_; Я плачу всем
Мама Ролл

2

Деление 2, 42 байта

Бесстыдная адаптация превосходной квинны от @ MartinBüttner в этом ответе

'!+O!'!d'!l'!r'!o'!W'! '!,'!o'!!l'!e'!H'R"

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

И поменял местами

"R'H!'e!'l!!'o!',!' !'W!'o!'r!'l!'d!'!O+!'

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

В версии Quine атом начинается в Rзаголовке справа. В "начинается режим , который оборачивает к следующей печати "(сам). Это печатает все, кроме ". '!+установите атом на символ ". Oраспечатывает его и уничтожает атом, заканчивая программу.

Обращенная версия начинается Rснова и для каждого символа в Hello, Worldнаборе атома и печатает !его, не разрушая атом. Для последнего символа !печать Oуничтожает атом.



0

Python 2, 131 байт

Вперед:

print(lambda x:x+repr(x)+")#'!dlroW ,olleH' tnirp")('print(lambda x:x+repr(x)+")#\'!dlroW ,olleH\' tnirp")(')#'!dlroW ,olleH' tnirp

Задний ход:

print 'Hello, World!'#)'()"print '\Hello, World!'\#)"+)x(rper+x:x adbmal(tnirp'()"print 'Hello, World!'#)"+)x(rper+x:x adbmal(tnirp

Первая половина - это строка в одну строку, за которой #следует комментарий, отделяющий первую половину от более простой второй.


Адаптация этого Python Quine дает_='_=%r;print _%%_#"!dlroW ,olleH"tnirp';print _%_#"!dlroW ,olleH"tnirp
Sp3000

0

C 108 байтов

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}//};)"!dlroW ,olleH"(stup{)(niam

С99 я предполагаю?
Нил

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