Вызов
Создайте две программы, A и B, которые являются программами cat на одном языке. При объединении AB (также на том же языке) должен быть квине.
Например, предположим , что hello
и world
являются программы кошачьи на языке XYZ. Если helloworld
это квин на указанном языке, то ваше решение действительно.
Для тех из вас, кто не знаком с кошками и квин, программа cat - это программа, которая печатает именно то, что было ей дано через stdin, а quine - это программа, которая печатает свой собственный исходный код.
Подсчет очков и правила
- Общее количество байтов объединенной программы AB - это ваш счет. Поскольку это кодовый гольф, выигрывает самая низкая оценка.
- Стандартные лазейки запрещены
- Входные данные должны быть взяты из стандартного ввода, а выходные данные должны идти в стандартный вывод.
- Программы cat не должны принимать аргументы; им нужно только скопировать стандартный ввод в стандартный вывод.
- Quine должен работать, когда программе не дается никаких входных данных, но он не должен работать правильно (но может работать) для других входных данных.
- Quine не нужно завершать, при условии, что он печатает точно свой исходный код один раз, и ничего более.
- Quine должен иметь длину не менее одного байта.
- A и B могут быть одной и той же программой.
- BA не должен быть квинем или даже действительной программой.
AB
должны добавить, что он должен быть не пустым, так как во многих языках есть 0-байтовая кошка, допускающая 0-байтовую квин.Ответы:
V , 2 + 2 == 4 байта
Попробуйте квайн!
Попробуйте кошку!
А это
2i
B также
2i
Как это работает?
Прежде всего, некоторые объяснения того, как работает V. Одна заметная вещь, которая делает этот ответ возможным, состоит в том, что в V пустая программа является программой cat. Это не особый случай, это присуще тому, как работает V. При запуске все входные данные загружаются в «буфер», каждая команда каким-то образом модифицирует буфер, а затем, когда программа завершается, буфер неявно печатается. Это означает, что любая строка NOP также является программой cat.
Команда
i
означает войти в режим вставки , что означает, что каждый следующий за ним символi
будет добавлен в буфер. С предшествующим ему номером этот текст будет продублирован n раз.Это означает, что для программы cat ничего не будет добавлено в буфер, и оно будет напечатано так, как оно было прочитано. Другими словами:
Но для Quine есть текст после
i
:Нахальный не ответ
V , 0 байтов
Попробуйте онлайн!
А это пустая программа.
B также пустая программа.
:П
источник
Рубин, 71 байт
Можно разбить на кошек следующим образом:
а также
Эти две кошки идентичны, за исключением ведущей 2, которая является запретной во всех трех программах.
<<2
Является herestring, а это означает , что все , начиная со следующей строкой , пока нагрузочный 2 на своей собственной линии является строкой, которую мы сцепить к себе (*2
) и добавить косую 2. В кошках herestring хорошо образованные , но пустые, поэтому регулярное выражение не будет соответствовать ему, и мы перейдем к$<.read
выражению и выведем STDOUT. Однако после того, как мы объединяем кошек, строка не будет заканчиваться до третьей строки, поэтому регулярное выражение совпадает, и мы закорачиваем и выводим квинну.источник
Pyth,
29 байтов (5 + 24)27 байтов (5 + 22)Это было весело.
Попробуйте здесь Quine.
Попробуйте здесь первый кот. Попробуйте здесь
второй кот.
Пояснения
источник
C # (компилятор Visual C #) , 551 байт
A: 95 байт
Попробуйте онлайн!
B: 438 + 18 байт.
Попробуйте онлайн!
A + B: 533 + 18 байт
Попробуйте онлайн!
A и B принимают ввод в качестве аргумента командной строки. A + B игнорирует любой ввод. 18 байтов на B и A + B добавляются для
/p:StartupObject=B
опции, отправляемой в MSBuild. Это только строго необходимо для A + B, но казалось обманом, чтобы не иметь его в B. Таким образом, флаги компилятора для A + B - это флаги компилятора для A (нет) плюс флаги компилятора для B.объяснение
Программа А проста. Класс A содержит (неиспользованную) статическую переменную,
i
инициализированную2
и выдает первый аргумент при запуске. Значение//
в конце важно для кода A + B, но ничего не делает в самом A.Программа B странная в изоляции, но по сути то же самое. Он создает класс A, содержащий статическую переменную,
i
инициализированную для0
, и затем запускает метод Main класса B, который делает то же самое, что и программа A, потому чтоA.i
он меньше 1, и возвращается перед любыми странными вещами. Новые строки здесь не нужны, но они важны для A + B.При объединении программа
//
из программы A комментирует объявление класса A из программы B, но из-за новой строки класс B вполне подойдет, позволяя вместо этогоA.i
ссылаться на2
значение из программы A. Флаг компилятора заставляет Программу запускать B.Main (), так как A.Main () также существует. В результате программа A + B не выводит свой аргумент, а вместо этого переходит к следующему сегменту B.Main (), который в основном представляет собой стандартную C # quine .источник
Haskell , 116 + 20 =
187175174136 байтС тех пор, как Эрджан Йохансен показал мне, сохранено несколько байтов
interact
Кот 1
Попробуйте онлайн!
Кот 2
Попробуйте онлайн!
Куайн
Попробуйте онлайн!
Основной принцип работы здесь заключается в том, что когда мы добавляем второго кота к первому, мы меняем имя функции, с которой мы взаимодействуем, с
a
наidmain
. Такinteract id
как это кот, мы хотим,idmain
чтобы мне была функция, которая возвращает квин. Очевидным решением будет использованиеconst
, однако, так как мы можем предположить, что ввод также пустой(++)
. Отсюда мы находим исходный код довольно стандартным способом, у нас есть переменная,g
которая кодирует исходный код, и мы используем специальную оболочку для печати его в строковой форме и форме кода. Есть небольшое исключение, что нам нужно поместить наш кодер вперед, потому что нам уже нужно заканчиватьinteract id
. Это означает, что дополнительныйg=
не кодируется и должен обрабатываться вручную. Наша следующая кошка довольно стандартна, за исключением того, что нам нужно сделать ее действительным кодом, когда она прикреплена к концу другой кошки, поэтому нам нужно, чтобы обе кошки были экземплярами охранников шаблонов.Альтернативная стратегия, 43 + 105 =
186148Кот 1
Попробуйте онлайн!
Кот 2
Попробуйте онлайн!
Куайн
Попробуйте онлайн!
источник
getContents
+putStr
наinteract id
. Попробуйте онлайн! (Quine больше не работает с непустым вводом, что позволяет использовать(++ ...)
раздел дляidmain
.)interact
, я думаю, это потому, что я редко занимаюсь IO с Haskell. Я отредактировал пост.Python 3, 286 байт
Мой первый Python Golf и мой первый Quine! Не очень элегантно, но это работает.
Программа А (238 байт)
(без завершающей строки)
Программа B (48 байт)
(без завершающей строки)
Попробуйте онлайн
Подтверждения
источник
end=open...
и использовать%r
вместо того,%s
чтобы не делать новые строки и цитаты%r
. Не уверен, что вы имеете в виду о новой строке, хотя.%s
чтобы форматировать новую строку в, вы можете просто сделать литерал\n
. Вы также можете использовать;
для разделения операторов вместо\n
(за исключениемif
необходимости быть в отдельной строке).%
можно экранировать в строке, выполнив%%
. Единственный аргумент, необходимый для форматирования строки, - это сама строка, все остальное можно чередоватьlocals()
для сохранения 2 байта.C ++ (лязг) , 313 + 102 = 415 байт
Программа А (заканчивается новой строкой):
Программа B (не заканчивается новой строкой):
Не очень подлый, и, как обычно, C ++ не так уж и хорош для quining. Я не удивлюсь, если есть способы побрить байты здесь и там от той же самой идеи. Один маленький улов - изменение поведения чего-либо после того, как оно было определено, и инициализатор динамической переменной с побочным эффектом делает свое дело. (Может ли это быть даже сделано в C без расширений компилятора?)
Попробуйте онлайн: A , B , AB
(Единственная проблема с переносимостью, о которой я знаю, заключается в том, что программа предполагает размещение
<cstdio>
имен как в глобальном пространстве имен, так и в немstd
.)источник
Befunge-98 (FBBI) , 8 + 15 = 23 байта
A + B: (работает только без ввода)
Попробуйте онлайн!
A:
Попробуйте онлайн!
B:
Попробуйте онлайн!
источник
Python 3 , 100 + 37 = 137 байт
Программа А:
Попробуйте онлайн!
Программа Б:
Попробуйте онлайн!
Make Quine AB
Попробуйте онлайн!
Работает только тогда, когда ввод пуст, в противном случае он добавляет ввод к выводу.
источник
Атташе , 15 + 126 = 141 байт
A:
Попробуйте онлайн!
B:
Попробуйте онлайн!
A + B:
Попробуйте онлайн!
объяснение
Каждая из программ cat кодирует
AllInput[]|Echo
, что является простой программой cat. B - основная фаза хины; в одиночку, это векторизованная функция (через унарный@
), вызываемая без входов (называемая|Call
) Таким образом, первые условныеIf[_,A,B]
исполняетB
, который простоAllInput[]|Echo
.Когда A + B выполняется, унарный
@
становится двоичным@
из-заEcho
слияния с лямбда-выражением:Теперь это означает, что лямбда выполняется раньше, чем
Echo
есть. Возвращаясь к условию, эта функция теперь имеет все STDIN в качестве аргумента. Итак,If[_,A,B]
выполняетсяA
, что является стандартным фреймворком quine.источник
Stax , 16 + 12 = 28 байт
Кот 1:
Запустите и отладьте его
Кот 2:
Запустите и отладьте его
Куайн:
Запустите и отладьте его
источник
Кот 1:
Луа , 41 байт
Попробуйте онлайн!
Кот 2:
Луа , 70 байт
Попробуйте онлайн!
Куайн:
Луа , 111 байт
Попробуйте онлайн!
io.input(arg[0])
в Cat 2 устанавливает текущий файл в качестве стандартного ввода, и в результате кошка печатает исходный кодисточник
> <> , 12 +3 = 15 байт
Программа А:
Попробуйте онлайн!
И программа Б:
Попробуйте онлайн!
Сделать программу AB:
Попробуйте онлайн!
источник
JavaScript (Node.js) , 199 байт
Попробуйте онлайн!
Кот А, 57 байт
Попробуйте онлайн!
Cat B, 142 байта
Попробуйте онлайн!
источник