У нас было много задач по квине , но многие форматы квин схожи, давайте создадим некоторую разницу в наших квинах.
Ваша задача - создать выборку программ на одном языке (не менее 2), каждая из которых выводит свой собственный исходный код, однако ни одна из этих программ не может использовать какие-либо символы.
Например, если вы создаете программу, используя:
printf+qw(printf+qw(%s)x2)x2
Ваша следующая программа не может включать в себя:
%()+2finpqrstwx
и так далее.
правила
- Вы можете использовать символы Юникода, но вы все равно должны получать очки в байтах.
- Все программы должны соответствовать определению сообщества правильного квайн . Это означает, что пустая строка, среди прочего, не считается действительной квиной.
- Стандартные лазейки запрещены.
- Функции или полные программы разрешены, если они соответствуют приведенному выше определению.
- Символо-независимые языки (включая Lenguage и Headsecks) запрещены.
- Большинство программ побеждает, с самым коротким общим кодом в качестве разрыва связи.
code-challenge
restricted-source
quine
Дом Гастингс
источник
источник
Ответы:
V ,
3, 5 quines, 46 байтовПопробуйте онлайн!
HexDump:
Объяснение:
Попробуйте онлайн!
HexDump:
Объяснение:
Попробуйте онлайн!
HexDump:
Объяснение:
Вот где они начинают становиться фанки ...
Попробуйте онлайн!
HexDump:
Объяснение:
Попробуйте онлайн!
HexDump:
Объяснение:
Этот ответ наполнен черной магией. Квины 1 и 4 не новы, но остальные 3 никогда не были найдены раньше, поэтому более половины из этих квинов были обнаружены сегодня.
источник
normie :p
»REEEEEE--
Желе ,
2 3 45 квинов,14 18 81 65 59 56 326 265 247 229216 байт3 байта
Попробуйте онлайн!
Стандартный Quine.
”Ṙ
это один символ буквальный дляṘ
.Ṙ
печатает строковое представление этого, затем строкаṘ
неявно печатается.4 байта
Попробуйте онлайн!
⁾
начинает двухбуквенный строковый литерал иḤ
удваивает его аргумент. При вводе строкиḤ
получает отображение на каждый символ. Таким образом,Ḥ
действие на строку⁾Ḥ
дает⁾⁾ḤḤ
к исходному коду.11 байт
Попробуйте онлайн!
На правой стороне,
“ȮṾṖƊ}
строковый литерал дляȮṾṖƊ}
. Закрывающий символ автоматически добавляется в EOF.Слева от строкового литерала
Ɗ
оборачиваетсяȮṾṖ
в одну монаду и}
превращает ее в диаду, использующую правильный аргумент - строковый литерал.Ȯ
печатает string (ȮṾṖƊ}
),Ṿ
создает строковое представление string (“ȮṾṖƊ}”
) иṖ
удаляет”
символ. Строка“ȮṾṖƊ}
остается после монады и неявно печатается.38 4936 байтПопробуйте онлайн!
Впервые я когда-либо использовал пространство в геле для гольфа.
Список чисел в начале содержит
ord
остальные символы в коде. После того:270 198 180162 байтаПопробуйте онлайн!
Использует базовые 250 номеров и индексов в кодовой странице желе. Сохранено 72 байта путем изменения алгоритма. Использовал каждое число для индексации на кодовой странице Jelly, но теперь я преобразовываю целое число обратно в основание 250, а затем индексирую в кодовую страницу Jelly, в основном вдвое уменьшая количество литералов, которое мне нужно в первой строке. Это также уменьшает количество необходимых уникальных персонажей, но я не могу придумать, как сделать больше квинов.
Я использовал,
⁾“”
которые создают строковые литералыỌ
иØJ
которые создают строки из чисел. Я не могу придумать какие-либо другие способы создания струн. У меня все еще есть цифра9
и она‘’
доступна, поэтому, если есть другой способ создания строк из чисел, можно создать еще одну квинну.источник
Haskell , 3 квина, 1119 байт
Quine 1, 51 байт
IO
Печать анонимного действия напрямую на стандартный вывод.Попробуйте онлайн!
Quine 2, 265 байт
Функция
f
принимает фиктивный аргумент и возвращает строку.Попробуйте онлайн!
Quine 3, 803 байта
Все, что
LANGUAGE
идет после прагмы, является произвольной функцией, принимающей фиктивный аргумент и возвращающей строку.Попробуйте онлайн!
Символы
Куайн 1:
Quine 2:
Quine 3:
Как это работает
Куайн 1
Quine 1 - это модифицированная версия моего недавнего Golf с ответом quine (с улучшениями от H.PWiz):
main=
был удален.<>
и$
были заменены их почти синонимамиmappend
иid
.Это освобождает жизненно важных персонажей
=<>
и полезного оператора$
для других квинов.Куайн 2
В Quine 2 используются несколько аналогичные методы для программирования 2 в моем недавнем ответе « Взаимно исключающие квинусы» , но он приспособлен для непосредственного квинования себя и особенно для того, чтобы не использовать символьные литералы, которые необходимы для квин 3. Оба из них достигаются с помощью
show
функции, который по счастливой случайности еще не использовал ни одного из своих персонажей.В этой строке используются табуляции вместо пробелов, но я использовал пробелы ниже для удобства чтения.
g
это данные Quine, как список целых чисел в конце кода. Каждое число представляет символ из остальной части кода.9
, так что вкладка есть0
. Это делает кодировку немного короче, позволяя строчным буквам для имен функций и переменных помещаться в 2 цифры.b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
является функцией для преобразования числа в символ (фактически строка из одного символа)[[show 9!!0,show 1!!0..]!!6..]
диапазон символов, начинающийся с символа табуляции, который индексируется с помощью!!c
.[show 9!!0,show 1!!0..]
, начиная с цифр'9'
и'1'
и прыжков вниз с шагом 8.show
строке соответствующей цифры.f c=[b=<<g]!!0++show g
это основная функция.c
это фиктивный аргумент.b=<<g
использует=<<
для преобразования каждого числа вg
его символ. (Использование,=<<
а не egmap
, поэтомуb
необходимо обернуть его возвращенный символ в список.)show g
дает строковое представлениеg
списка России и++
объединяет строки.=<<
имеет более низкий приоритет, чем++
, некоторые скобки необходимы. Чтобы избежать использования()
(зарезервировано для Quine 3),[...]!!0
индексирует в список с одним элементом.Куайн 3
По замыслу других quines quine 3 по-прежнему имеет доступ к скобкам, лямбда-выражениям, символьным литералам и конструктору строки / списка
:
. Этого будет достаточно, чтобы построить функцию, которая предопределяет код на Куайна в строку.К сожалению, все строчные гласные (кроме иногда
y
) были использованы, не оставляя полезных буквенно-цифровых встроенных функций. И[]""
ушли. Это не оставляет нормального способа создать пустую строку, чтобы начать притворяться, что код.Тем не менее, почти все заглавные буквы все еще доступны, поэтому
LANGUAGE
прагма для получения расширения языка возможна. Снова по счастливой случайности,CPP
(включить препроцессор C) это единственное расширение языка, названное только заглавными буквами. И макросы CPP часто имеют заглавные имена.Таким образом, чтобы получить необходимую пустую строку, квина включает
CPP
, использует__TIME__
макрос для получения строковой константы формы"??:??:??"
(удобно всегда иметь одинаковую длину) и сопоставления с образцом на ней.После языковой прагмы квайн состоит из лямбда-выражения, связывающего свои параметры с этими четырьмя аргументами (оставляя последний фиктивный параметр
_
для последующего применения):q
привязан к'\''
, давая символ одинарной кавычки;_:_:_:_:_:_:_:_:z
привязан__TIME__
, то есть, как строка"??:??:??"
, создаваяz
пустую строку;y
привязанный к(\(?)v k x->v$k?x)
лямбда-комбинатору, используемому для преобразования данных о хине из левой ассоциированной ("foldl") в правую ассоциированную ("foldr") форму;(#)
привязан к\(&)(%)v->v&'{'&'-'&...
самим данным по квине.Данные по квине приводятся в форме церковного кодирования, лямбда-выражения с параметрами
(&)(%)v
.(&)
,(%)
иv
эта кодировка может использоваться либо для создания основного кода quine, либо для перестройки самого представления данных quine.&
и%
левых ассоциативных операторов стало внутри лямбды. Таким образом, параметры персонажа объединяются с начальнымиv
слева.k
есть соответствующий&'k'
.k
есть'
или\
, которое необходимо экранировать внутри символьных литералов, вместо этого используется кодировка%'\k'
.Поскольку кодирование данных остается ассоциативным, а строки построены ассоциативным образом,
y = (\(?)v k x->v$k?x)
вводится комбинатор для устранения несоответствия.y(...)
предназначен для построения подходящих функций для использования в качестве данных(&)
и(%)
операторов quinev
является функцией от строк к строкам (дляv
примера приводятся данные по квине ).k
является символом,x
строкой и?
оператором, который объединяет их в новую строку. (Для основного кода(?)=(:)
. Для фактического восстановления представления данных Quine это более сложно.)y(?)v k = \x->v$k?x
есть еще одна функция из строк в строки.В качестве примера того, как это меняет ассоциативность, если
(&)=y(:)
:В более общем случае, когда
(#)
функция данных quinef1,f2
является функциями, объединяющими символы со строками:применяя функцию данных quine с помощью
(&)=y(f1)
и(%)=y(f2)
, и это использует предписанныеf1
иf2
для объединения символов данных quine сx
, а затем передает полученную строку вv
.Тело основного лямбда-выражения объединяет все это:
'&':q:k:q:x
для символа,k
предшествующего&'k'
строкеx
, в то время как'%':q:'\\':k:q:x
prepends%'\k'
, которые являются их исходными формами данных Quine.y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
, это правильные параметры для перестройки представления данных Quine, перед которым ставится финалz
(пустая строка), а затем передается следующей функции.y(:)#y(:)
являются правильными параметрами для добавления основного кода квина в строку без других модификаций.\x->x
функция ничего не делает с созданной формулой, которая возвращается.источник
Perl 6 , 3 квина, 274 байта
Quine 1, 52 байта
Попробуйте онлайн!
Quine 2, 102 байта
Попробуйте онлайн!
Quine 3, 120 байт
Попробуйте онлайн!
Проверка отдельных наборов байтов
Было много маневров, чтобы получить эту третью муку. Perl 6 имеет 4 методы вывода (что я знаю),
say
,put
,print
иprintf
. Обаsay
иput
выводят новые строки, так как я не могу использовать оба.put
,print
,printf
Все они содержатp
иt
. Мы можем обойти это частично используяEVAL
верхний регистрPRINT
. Оттуда, я не думаю, что можно получить 4 квина ... (хотя, возможно, что-то вродеshell "echo 'quine'"
может работать)Затем мы можем обойти проблемы с пробелами, используя различные типы пробелов для разделения операторов, пробелов, табуляции и новых строк.
Пояснения:
Куайн 1:
Quine 2:
Это квинна в формате
printf |(q[printf q[%s]]xx 2)
, то есть она форматирует копию строки в себя. Однако мы не можем использовать,s
так как это использовалось в предыдущей квинеsay
. Таким образом, мы используем строку OR (~|
) для@
и!3
, чтобы произвести%s
деталь, но мы не можем сделать это как для строки форматирования, так и для строки, которая будет вставлена, поэтому мы должны сделать этоZ~
с дополнительной строкой и пустой строкой, хотя мы тогда не можем использовать,
для разделения двух, поэтому мы делаемXx qw[1 0]
для умножения строки на 1 и 0.Quine 3:
Это EVAL quine, который старается изо всех сил делать все заглавными, чтобы избежать конфликта с другими quine. Это включает в себя много из
EVAL
х, а также немалоlc
иuc
конвертировать между случаями.источник
MathGolf ,
4 56 квинов, 193 535 байт9 байт
Попробуйте онлайн!
45 байт
Попробуйте онлайн!
49 байтов
Попробуйте онлайн!
99 байт
Попробуйте онлайн!
4488 байт
Попробуйте онлайн!
188 845 байт
Я не могу связать это, так что вот программа на Perl 6, которая генерирует фактический quine
Проверка отличимости
Я могу определенно выжать еще одну квиню из этого, хотя я думаю, что у меня не осталось способов протолкнуть строки прямо в стек, поэтому мне придется прибегнуть к более странным методам. Даже незнакомые методы поступают, как я пытаюсь за шестую квиню. В некоторых случаях квины могут быть короче, но я сокращаю количество используемых байтов при подготовке.Хорошо, технически я мог бы сделать еще одну квинну, так как у меня все еще есть несколько нужных мне операторов (push-строка, инкрементная строка, дублирование, отображение, выталкивание), именно циклы сжимают нас. Это
{}
единственные операторы, которые могут указывать кодовый блок произвольной длины, и я действительно нуждаюсь в них в 6-й строке. Я мог бы использовать некоторые другие блоки кода, но они ограничены, и я сомневаюсь, что циклы зацикливания будут такими короткими, поскольку у нас заканчиваются простые операторы.Хорошо, некоторые запоздалые объяснения:
Все квины имеют почти одинаковую структуру:
Куайн 1:
По сути, это то же самое, что я написал в обычном вопросе.
Куайн 2
Quine 3:
Quine 4:
Quine 5:
Quine 6:
Причина этого Куайн так много больше , чем другие, что увеличивающиеся строк использует юникод представления, которые действительно отстой для некоторых из символов в коде, особенно , когда мы пытаемся создать символ
⌂
в коде, который раздувает код более чем на 8000 символов, что приводит к значительному увеличению части представления.Эта последняя квинна была бы значительно уменьшена, если бы MathGolf был непротиворечивым относительно того, использовали ли строки нативную кодовую страницу или нет.
источник
chr/ord
для одного из них, я должен заставить обе использовать вместо этого кодовую страницу, я думаю.Python 2, 2 квина,
434353349446 байтЭто было в основном просто посмотреть, смогу ли я сделать это на Python.
30 байтов (включая завершающий перевод строки):
и 416 байтов без завершающего символа новой строки:
(Гольф 81 байт благодаря Линн, но добавил нагрузку из-за заботы о новой строке.)
объяснение
Первый - это просто стандартная короткая Python-квина , но модифицированная, чтобы не использовать
_
. Поскольку это Python 2, он также не использует(
или)
.Второй задумался. Длинная строка кодируется с использованием
hex
кодека (таким образом гарантируя, что он будет содержать только0
-9
иa
-f
) и декодируется какЭто использует хитрость quine для получения собственного исходного кода, затем кодирует его, используя
hex_codec
, а затем печатает его в окруженииexec"".decode("hex")
, используя,sys.stdout.write
чтобы избежать печати новой строки. Выполнение этого кода выводит вторую квинну, как я ее сгенерировал.Я подозреваю, что более двух невозможно в Python, хотя я хотел бы увидеть это, если я ошибаюсь!
Если вы не против, Eval Quines
Эрджан Йохансен предложил следующее для предварительно закодированной второй квин
который получит 30 + 248 = 278 байт для следующего вывода:
Использование
exec
этого способа не обманывает в соответствии с PPCG надлежащими правилами но мне кажется несколько обманчивым (элегантным и умным, но все же обманчивым), потому что некоторые символы используются и как код, и как данные. (Хотя моя версия действительно используетexec
, код и данные являются отдельными.) Таким образом, я буду держать мой счет на 446.источник
"hex"
работает вместо того"hex_codec"
, что должно сэкономить вам несколько байтов!print '<tab>',
не добавляет пробел в конце. С помощью этого вы можете 85 байт от внушения Джо Кинга: tio.run/...Japt ,
23 квина,106172 байтаПервый - довольно подробный вариант моего ответа N char .
Попробуй это здесь .
Вторая квинна - это лучшая квинта ETHProduction , которая является хорошим стандартным квинтом для Джапта.
Попробуй это здесь .
Третий использует
``
и код XORing для хранения данных.Попробуй это здесь .
Поскольку
()'
они все еще доступны, возможно, удастся выжать еще одну квинну.источник
"'[+U+']+R+(Umd)¬"q mc
вы получите первую строчку для быстрого обновления, если это поможет.Gol> <> ,
23 квина,17 28 2726 байт6 байт
Попробуйте онлайн!
11 109 байтПопробуйте онлайн!
11 байт
Попробуйте онлайн!
Gol> <> имеет три способа печати любого символа:
o
Получите одно значение и напечатайте как символH
Поп все, распечатать как символ, и остановитьS"..."
Вывести строковый литерал, не затрагивая стекНо я не мог найти способ написать Quine, используя
S"..."
в качестве единственного метода вывода, поэтому я придумал два вышеупомянутых, используя два вида строковых литералов.Третий (Джо Кинг) использует
p
команду для создания"
inS"
на лету, которая в свою очередь печатает все, кроме нуля в конце. ЗатемEh
печатает ноль и выходит.Теперь, когда мы использовали все выходные команды И
p
команду, я считаю, что невозможно создать еще одну квинну (если только кто-то неS"
придумает квиню без нееp
).источник
S"..."
?Рубин , 2 квина, 27 + 44 = 71 байт
Попробуйте онлайн!
Попробуйте онлайн!
Я в основном ограничен методами вывода, здесь. Есть немало способов манипулирования строками, но кроме
$><<
всех используемых методов вывода, кажется, что они слишком сильно пересекаются. Я думаю, что может быть выход,eval
но сложно сложить несколько манипуляций со строками разных типов.источник
Javascript ES6, 2 квина, 43 + 22 = 65 байт
Куайн 1:
Quine 2:
источник
g=z=>"g="+g
ли действительный JS Quine?> <> , 2 квина, 8 + 16 = 24 байта
8 байт
Попробуйте онлайн!
Взято из этого ответа .
16 байт
Попробуйте онлайн!
Это основано на
'r3d*>o<
Куайном, за исключением того,o
и<
не может быть использована, так что я заменил<
с|
и динамически создаваемыеo
(111 = 8 * 13 + 7) и помещают его , где второй>
есть.2 квина это предел
К сожалению, мы ограничены количеством выходных команд.
n
бесполезен, потому что он выводит только числа, поэтомуo
должен быть выполнен в любой строке. Единственный способ динамически создаватьo
это сp
. Таким образом, один quine может использоватьo
, а другой может создать его сp
, но не может быть третьего квина.Может быть возможно, чтобы третий quine оставил исходный код в стеке, если это имеет значение.
источник
Java 10, 2 квина,
14481248 байт13501122 байтаПопробуйте онлайн.
Эквивалентно:
Объяснение:
126 байт
System.console()
вернется,null
когда ничего не предоставлено, поэтому TIO возвращает aNullPointerException
в этом случае .Чтобы доказать, что это рабочий метод, замените его
System.console()
наSystem.out
: Попробуйте онлайн.Объяснение:
Общее объяснение:
В Java quine обычно делается так:
String s
Содержит исходный код отформатирован.%s
используется для ввода этой строки в себя с помощьюs.format(...)
.%c
,%1$c
И34
используются для форматирования двойных кавычек.s.format(s,34,s)
складывает все это вместе.В этом случае кратчайшая лямбда-функция quine в Java 10 будет такой ( 82 байта ):
Попробуйте онлайн.
Поскольку единственный способ получить две квины в Java - использовать версию с юникодом
\uHEXA
, которая преобразуется в символы во время компиляции, я не могу использовать символы0123456789ABCDEF\u
в не-юникодной версии. Таким образом, меньшая версия не в Юникоде будет использоватьSystem.console()
вместоreturn
илиSystem.out
(оба содержат 'u'), и будет использовать'}'-'['
и два раза%c
вместо34
и%1$c
.Несколько замечаний по поводу версии Unicode:
%04X
вместо%04x
(для шестнадцатеричных прописных вместо строчных).92
,%c
и%3$c
для форматирования косой черты.\U
букв вместо строчных,\u
по-видимому, недопустимо, иначе я бы просто использовалreturn
более короткую версию , не поддерживающую юникод.источник