Python 2 / Retina, 550 + 645 = 1373 1254 1221, 1195 байт.
Я не совсем уверен , что если unichr
и replace
детали могут быть golfed больше. Я пытался использовать Python 3, но многое теряется из-за необходимости добавлять скобки и обрабатывать их. Я попытался установить R=unicode.replace
и использовать это, но вывод испортился.
Обратите внимание, что по умолчанию в Retina есть завершающий символ новой строки, который не включен в программы. Если кто-то говорит, что мне нужно удалить это, это можно сделать тривиально. Кроме того, код Python работает в repl.it, но он не гарантированно работает на Ideone.com.
Также обратите внимание, что начальные и конечные символы новой строки имеют важное значение в коде ниже.
Программа A (Python 2): 638 587 566 550 байт (UTF-8)
Python 2 , Retina
U=unichr;s=U(39)*3;_=u'''\n#U=unichr;s=U(39)*3;_=u%s.replace(U(9),U(96));print _%%(s+_+s).replace(U(10),U(92)+'n').replace(U(96),U(9)).replace(U(178),U(179)).replace(U(183),U(184)).replace(U(182),U(183))#|¶#·print"Wrong language!"·#?.*t|"·¶#{2}|^.¶\n#1 #\n\n#T ²-¹ _o [^¹]\nn=chr(10);print n+n.join(['print"Wrong language!"','#?.*t|"'])+n\n'''.replace(U(9),U(96));print _%(s+_+s).replace(U(10),U(92)+'n').replace(U(96),U(9)).replace(U(178),U(179)).replace(U(183),U(184)).replace(U(182),U(183))#|
#¶print"Wrong language!"¶#?.*t|"¶
#{2}|^.
Программа B (Retina): 735 667 655 645 байт (ISO 8859-1)
Сетчатка , Питон 2
#U=unichr;s=U(39)*3;_=u'''\n#U=unichr;s=U(39)*3;_=u%s.replace(U(9),U(96));print _%%(s+_+s).replace(U(10),U(92)+'n').replace(U(96),U(9)).replace(U(178),U(179)).replace(U(183),U(184)).replace(U(182),U(183))#|·#¸print"Wrong language!"¸#?.*t|"¸·#{2}|^.·\n#1 #\n\n#T ³-¹ _o [^¹]\nn=chr(10);print n+n.join(['print"Wrong language!"','#?.*t|"'])+n\n'''.replace(U(9),U(96));print _%(s+_+s).replace(U(10),U(92)+'n').replace(U(96),U(9)).replace(U(178),U(179)).replace(U(183),U(184)).replace(U(182),U(183))#|¶#·print"Wrong language!"·#?.*t|"·¶#{2}|^.¶
#1`#
#T`²-¹`_o`[^¹]
n=chr(10);print n+n.join(['print"Wrong language!"','#?.*t|"'])+n
Программа С:
Python 2 , Retina
На самом деле это можно сделать короче, используя #!`W.*!
вместо двух последних строк, но это делает А и В длиннее, потому что наличие `
в строке, где не было ни одного, означает, что мне нужно обрабатывать это по-другому (потому что первый обратный удар в строке в Retina это разделитель конфигурации).
print"Wrong language!"
#?.*t|"
Объяснение:
Программа С:
# Retina: replace nothing with the Python code string
print"Wrong language!" # >> code is executed if run in Python
#?.*t|" # Comment w/ '?' for Retina to skip, then replace up to the 't',
# as well as any quotation marks, with nothing
Сначала я написал Программу C во время первой попытки и оставил ее практически неизменной. В Python он печатает строку и игнорирует комментарий. В Retina он ничего не заменяет, print"Wrong language!"
а затем удаляет части вокруг Wrong language!
.
Чтобы лучше понять сложные программы, давайте рассмотрим упрощенные версии:
Программа А (упрощенная):
print"\n#PYTHON\n#1`#\n\n#T`²-¹`_o`[^¹]\nn=chr(10);print n+n.join(['print"Wrong language!"','#?.*t|"'])+n\n"#|
#¶print"Wrong language!"¶#?.*t|"¶
#{2}|^.
Когда я начал все заново, я использовал PYTHON
бит в качестве заполнителя для кода, который должен печатать Программу А. Эта более простая версия упростила объяснение того, как будут печататься и Программа В, и Программа С.
Все print
и внутри - это то, что печатает Программу B, но сначала давайте посмотрим, как печатается Программа C, потому что это просто. После того, print"..."
как #|
. Этот трюк спас НАГРУЗКИ от трудностей, которые я испытал в своей первой попытке. Это позволяет Retina ничего не заменять на 2-ю строку, которая будет программой C, за исключением того, что есть #
перед. Последние 2 строки удаляют это первым #
. Я использовал, #{2}
чтобы предотвратить удаление сцены все случаи #
. Я не могу использовать, #1`#
как я использовал в Программе B, потому что это вызывает проблемы с тем, что в первой строке Программы A.
Это подводит меня к следующему заданию - распечатка программы B. Возможно, вы заметили другое отличие от реального кода. В самом коде нет обратных галочек, так как я заменил их на вкладки. Я должен был заменить символ, потому что любой обратный удар мог бы сделать предыдущий код строкой конфигурации в Retina, что привело бы к тому, что синтаксис был недействительным. Я выбрал вкладки, потому что они видны, а кодовая точка состоит из одной цифры ( 9
). Код печатает Программу B, как показано в упрощенной версии ниже.
Программа Б:
#PYTHON
#1`#
#T`²-¹`_o`[^¹]
n=chr(10);print n+n.join(['print"Wrong language!"','#?.*t|"'])+n
Первые две строки ничего не заменят на код Python, но на #
передний, а некоторые символы немного отличаются. Эта часть опущена для ясности. Следующий этап удаляет это первым #
. Затем я использую этап транслитерации (T) , #T`²-¹`_o`[^¹]
чтобы отменить некоторые из replace
операций видели в полной программе А. Используя этот этап является способом вывода буквальный знак абзаца ¶
в сетчатке, которые в противном случае могли бы быть impossible.¹ Он заменяет ·
с ¶
, и ³
с ²
, Появления ¹
останутся такими же, потому что их игнорируют [^¹]
.
Программа А:
Новые строки и вкладки были добавлены для удобства чтения.
U=unichr;s=U(39)*3;
_=u'''
\n#U=unichr;s=U(39)*3;
_=u%s.replace(U(9),U(96));
print _%%(s+_+s)
.replace(U(10),U(92)+'n').replace(U(96),U(9)).replace(U(178),U(179))
.replace(U(183),U(184)).replace(U(182),U(183))#|
¶#·print"Wrong language!"·#?.*t|"·
¶#{2}|^.
¶
\n#1 #\n\n#T ²-¹ _o [^¹]\nn=chr(10);print n+n.join(['print"Wrong language!"','#?.*t|"'])+n\n'''
.replace(U(9),U(96));
print _%(s+_+s)
.replace(U(10),U(92)+'n').replace(U(96),U(9)).replace(U(178),U(179))
.replace(U(183),U(184)).replace(U(182),U(183))#|
#¶print"Wrong language!"¶#?.*t|"¶
#{2}|^.
Это следует общей структуре следующей Python quine:
_='_=%r;print _%%_';print _%_
Когда вы добавляете вещи до или после, вы также должны поместить их в строку.
U=unichr;_='U=unichr;_=%r;print(_%%_).replace('','')';print(_%_).replace('','')
Я хотел использовать строку с тройными кавычками, чтобы упростить включение кавычек (избегая использования обратной косой черты). s=U(39)*3;
это строка '''
. Я также использовал %s
вместо %r
, чтобы избежать некоторых проблем с переводом строки или других символов с помощью обратной косой черты.
U=unichr;s=U(39)*3;_='''U=unichr;s=U(39)*3;_=%s;print(s+_%%_+s).replace('','')''';print(s+_%_+s).replace('','')
Итак, теперь замены. Первая замена .replace(U(9),U(96));
заключается в замене вкладок обратными галочками, которые мы видим в Программе B. Эта замена выполняется перед форматированием строки, поскольку вкладки должны оставаться вкладками в Программе А. Другие замены - просто избегать использования определенных символов во 2-й. линия программы B:
.replace(U(10),U(92)+'n') # Replace newlines with a backslash and 'n', for B to print A.
.replace(U(96),U(9)) # Replace backticks with tabs for the first part of B.
.replace(U(178),U(179)) # Replace '²' with '³', which will be undone with B's T stage
.replace(U(183),U(184)) # Replace '·' with '¸', which will be undone with B's T stage
.replace(U(182),U(183)) # Replace '¶' with '·', which will be undone with B's T stage
Эти последние три замены предполагают стадию транслитерации в программе B, чтобы предотвратить удаление или транслитерацию этих символов, когда они не должны быть.
Единственная другая часть кода - это код из Программы B, который по сути копируется символ за символом, за исключением изменений, вызванных заменами.
¹ Благодаря Мартину за его кончик о том , как выводить буквальное ¶
в сетчатке. Это сделало все намного проще.