В свое время на PPCG я заметил, что проблемы с квин и полиглоты довольно популярны. Кроме того, мета-решения проблем, то есть сценарии, которые генерируют программу, которая является решением проблемы, имеют тенденцию получать много положительных отзывов от сообщества. Поэтому я создал этот вызов, который реализует эти три идеи.
Ваша задача, читатель и энтузиаст кода , состоит в том, чтобы создать как можно более короткий сценарий, который может работать на двух языках A и B, чтобы генерировать квин для A и B. Когда ваша программа запускается на языке A, она должна сгенерировать программа, которая является quine на языке B, но не на языке A и наоборот. Языки A и B могут быть разными версиями одного и того же языка, при условии, что вы помните, что сгенерированные quines должны работать только в одной из версий.
Имейте в виду, что стандартные лазейки следует считать закрытыми и разрешены только надлежащие квины .
Удачи, побеждает меньшее количество персонажей!
Ответы:
CJam 0.6.6 dev / GolfScript,
151412 байтСпасибо @ jimmy23013 за 2 байта в гольфе!
Остальные будут обновлены.
верификация
Так как представление включает в себя значительные пробелы, лучше всего сравнивать hexdumps.
CJam
CJam печатает
"`0$~"0$~
и завершает перевод строки. Попробуйте онлайн!Сгенерированная программа печатает
"`0$~"0$~
с завершающим переводом строки в GolfScript ( Попробуйте онлайн! ), Но без перевода строки в CJam ( Попробуйте онлайн! ).Как работает метахин
Как работает квайн
В отличие от GolfScript, CJam по умолчанию не печатает завершающий перевод строки, поэтому в CJam это не quine.
GolfScript
GolfScript печатает
"`0$~"0$~
без пробела. Попробуйте онлайн!Сгенерированная программа печатает
"`0$~"0$~
без пробела в CJam ( Попробуйте онлайн! ), Но GolfScript добавляет перевод строки ( Попробуйте онлайн! ).Как работает метахин
Как работает квайн
В отличие от CJam, GolfScript добавит перевод строки к содержимому стека, поэтому в GolfScript это не квинна.
источник
"0$p"0$~a:n;
,a:n
, но использованиеp
не пришло мне в голову.CJam / Fission, 22 байта
Попробуйте это в CJam. Попробуйте это в Fission.
В CJam это печатает стандартную квиншу деления :
Попробуйте Quine Fission.
В Fission это печатает
"
без-стандартный вариант стандартной CJam quine:Попробуйте CJam Quine.
Это также работает для 22 байтов (печать тех же самых строк):
объяснение
В CJam:
Таким образом, в конце программы, стек содержит строку
"'!+OR"
и символ"
, оба из которых печатаются неявно.При делении программный поток начинается
R
с правостороннего атома.'"
только изменения массы атомов,)
,5
и-
игнорируются по разным причинам. Затем атом переходит в режим печати"
и печатает{'_'~}_~
.;
уничтожает атом и завершает программу.источник
{'_'~}
Clojure / Common Lisp, 274 байта
Некоторые пробелы добавлены для удобства чтения
В основном определяет макрос, который возвращает quine в Clojure. Для Clojure требуются параметры для определения макроса в виде вектора (
[]
), тогда как Common Lisp (к счастью) просто игнорирует его. После этого мы различаем два языка, оценивая,'()
что равноnil
и, следовательно, ложно в Common Lisp и находитсяtrue
в Clojure. Затем мы выполняем строковые манипуляции с использованием Clojure, которые Common Lisp даже не пытается оценить, как это происходит в другойif
ветке. С другой стороны, Clojure пытается проверить, является ли другая ветвь, по крайней мере, правильной перед выполнением, поэтому пришлось использовать ее,eval
чтобы быть корректной в Clojure и выводить правильную строку в Common Lisp.Примечание: простое возвращение двух разных строк может быть короче, но это не будет отличаться от проблем полиглота, связанных с выводом разных строк на разных языках. ¯ \ _ (ツ) _ / ¯
Оригинальный исходный код Clojure: https://ideone.com/SiQhPf
Общий исходный код Common Lisp: https://ideone.com/huLcty
Clojure выход:
((LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))) '(LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))))
Общий вывод на Лиспе:
((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))
Вывод Clojure выполняется в Common Lisp: https://ideone.com/T1DF7H
Наоборот: https://ideone.com/Fezayq
источник
Jelly / GolfScript,
1816 байтверификация
Тестирование всех участвующих программ с точными потоками байтов может быть сделано только локально.
Желе
С кодовой страницей желе программа выглядит следующим образом.
Это печатает ( Попробуйте онлайн! )
это квинна в GolfScript ( попробуйте онлайн! ), но ошибка парсера в Jelly ( попробуйте онлайн! ).
GolfScript
На латинице 1 программа выглядит следующим образом с непечатаемым символом DEL между
}
иþ
.Это печатает ( Попробуйте онлайн! )
или, визуализированный с помощью кодовой страницы желе,
который является квиной в Jelly ( попробуйте онлайн! ), но печатает только перевод строки в GolfScript ( попробуйте онлайн! ).
источник
”ṘṘ
, таким образом,ØV
должен уйти, верно?JavaScript / C 278 байт
При ошеломляющих 278 байтах:
C-quine:
int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}
JavaScript-квин:
A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));
источник
Befunge / Fission, 35 байт
Попробуйте это в Befunge | Попробуй это в Fission
В Befunge это создает квин Fission :
В Fission это производит Quine Befunge :
источник
Python / Retina,
70656466 байтЯ использовал ту же стратегию, что и в предыдущем полиглоте Python / Retina .
Попробуй в Python | Попробуй в Retina
#
это комментарий в Python, поэтому он просто печатает квинту Retina в Python. В Retina первый этап (2 строки) ничего не делает, потому#
что на входе ничего не будет найдено. На следующем этапе ничего не заменяется основой quine Python. Третий этап заменяет каждую точку с запятой на#print _%
часть. Последний этап удаляет все#
.Куайн в сетчатке:
Quine в Python:
Используемые квины можно увидеть в этом испытании . Quine Retina является ошибкой в Python, а Quine Python не выводит в Retina.
источник
Python 3 / Python 2, 62 байта
Попробуйте это в Python 2 , Python 3 .
Основано на Quine Python здесь . Различающий фактор между двумя версиями заключается в том, что они делают
int(-1/2)
: в Python 2/
- целочисленное деление (округление вниз) с результатом-1
; в Python 3/
- это деление с плавающей точкой (-0.5
), котороеint
усекается до0
.Мы строим строку
_
из трех частей.'_=%r;print(_%%_['
и'int(-1/2):])'
всегда одинаковы. Интересная часть'~'*-~int(-1/2)
:-~int(-1/2)
есть0
, и тильда не добавляется в строку;-~int(-1/2)
есть1
, и тильда добавляется в строку.Таким образом, Python 2 выводит строку Python 3
и Python 3 выводит Quine Python 2
В каждой версии выражение внутри
[ :]
оценивается как0
, что заставляет срез включать всю строку, тогда как на неправильном языке оно оценивает-1
, что заставляет срез включать только последний символ, обрезая вывод, так что это не полная квинна.источник
Brain-Flak , brainfuck
46174009 байтПопробуйте онлайн!
Попробуйте онлайн!
Объяснение уже в пути Я все еще играю в гольф
источник