Зеркальная тварь (или у меня болит голова)


32

Я читал « Напиши свой код задом наперед» - обратная квинета. И я подумал, что это может быть интереснее, если твой обратный код также исполняемый . Таким образом, этот вызов будет иметь все правила и требования другого, но также должен быть действительным источником после обращения (на том же или другом языке и при этом печатать свой источник в обратном направлении).

Применяются все правила и оценки по заданию обратного квина, так что все ответы на этот вопрос будут отвечать на этот вопрос (но также не оценка).

Редактировать:

По заказу все правила сейчас скопированы здесь.

Правила:

  • написать программу p, которая при выполнении выдает результат p ', где p' - это p назад, а p 'при выполнении выдает p.
  • Не используйте другие файлы (например reverse.txt)
  • Минимальная длина кода составляет два символа.
  • Ваша программа не может быть палиндромом.

Подсчет очков:

  • +50, если вы используете данные из интернета.
  • +25, если вы читаете свой собственный исходный код.
  • +1 очко за персонажа.
  • Самый низкий балл побеждает.

eval(eval(eval(eval(eval(eval(eval(eval(eval(p)))))))))
Эндрю Ларссон

Я просто говорю, что вы сможете выполнить выходные данные выполнения выходных данных выполнения выходных данных [...] выполнения выходных данных p (то же самое, что и любая квинна, за исключением обратной квинны).
Эндрю Ларссон

@AndrewLarsson Действительно, хотя доказательство концепции, которую я строю p, будет написано в c и p 'в perl.
hildred

О, это было бы круто!
Эндрю Ларссон

1
Да, видел это слишком поздно. Не дубликат
Йоханнес Кун

Ответы:


22

GolfScript, 46 символов

0{`".~#"+.-1%+\.!@@}.~##~.}@@!.\+%1-.+"#~."`{1

Ну, это некрасиво, но это работает. Выходные данные равны обратному коду, а также являются допустимой программой GolfScript, которая снова выводит исходный код.

Хорошо, позвольте мне объяснить, как я это построил. Сначала я начал с квайна {".~"}.~и изменил его, как в этом ответе, чтобы изменить себя. Чтобы сделать вывод исполняемой сущностью сам по себе, я сделал копию кода перед тем, как его перевернуть, и добавил #в конце кода, чтобы обратная версия в конце стала просто комментарием. Таким образом, мы получаем палиндромную квинну:

{`".~#"+.-1%}.~##~.}%1-.+"#~."`{

Однако по правилам палиндромы запрещены, поэтому мне нужно было как-то нарушить симметрию. Я подумал, что самым простым способом было бы включить 0в код код (который сам по себе является формулой в GolfScript) и перевернуть его с 1помощью! после создания перевернутое копию. Большая часть остающейся сложности - просто уродливые манипуляции со стеком, чтобы получить все в правильном порядке.


Это также сценарий игры в гольф при обращении или это другой язык?
Hildred

Да, это GolfScript в обе стороны. Действительно, за исключением 0и 1в начале и в конце, остальная часть кода является палиндромом.
Ильмари Каронен

9
Вау. Хорошо, я не чувствую себя достаточно умным для этого SE :(
Cruncher

21

Perl и C 6478 1955

#!/usr/bin/perl -i//
$_=<<'rahc';eval $_; #//
print scalar reverse "#!/usr/bin/perl -i//\n\$_=<<'rahc';eval \$_; #//\n${_}rahc\n" #//
__END__
__END__ enifed#
};)"{ = ][cn\rahcn\n\"(p
};)'n\'( rahctup) 1 == 21%b ( fi
;)d(p;)]1-b[c,",d%",)d(foezis,d( ftnirpns{)b--;b;)c(foezis=b( rof
;)c(p;]9[d rahc;b tni{)(niam diov
}};)]1-b[c(rahctup )]1-b[c(fi{)b--;b;)c(nelrts=b(rof;b tni{)c*rahc(p diov
>h.gnirts< edulcni#
>h.oidts< edulcni#
;}
,0
,53,33,74,711,511,411,74,89,501,011,74,211
,101,411,801,23,54,501,74,74,01,63,59,16
,06,06,93,411,79,401,99,93,95,101,811,79
,801,23,63,59,95,23,53,74,74,01,211,411
,501,011,611,23,511,99,79,801,79,411,23,411
,101,811,101,411,511,101,23,43,53,33,74,711
,511,411,74,89,501,011,74,211,101,411,801,23
,54,501,74,74,29,011,29,63,59,16,06,06
,93,411,79,401,99,93,95,101,811,79,801,23
,29,63,59,95,23,53,74,74,29,011,63,321
,59,521,411,79,401,99,29,011,43,23,53,74
,74,01,59,59,96,87,86,59,59,01,59,59
,96,87,86,59,59,23,101,011,501,201,101,001
,53,01,521,95,14,43,321,23,16,23,39,19
,99,011,29,411,79,401,99,011,29,011,29,43
,04,211,01,521,95,14,93,011,29,93,04,23
,411,79,401,99,611,711,211,14,23,94,23,16
,16,23,05,94,73,89,23,04,23,201,501,01
,95,14,001,04,211,95,14,39,94,54,89,19
,99,44,43,44,001,73,43,44,14,001,04,201
,111,101,221,501,511,44,001,04,23,201,611,011
,501,411,211,011,511,321,14,89,54,54,95,89
,95,14,99,04,201,111,101,221,501,511,16,89
,04,23,411,111,201,01,95,14,99,04,211,95
,39,75,19,001,23,411,79,401,99,95,89,23
,611,011,501,321,14,04,011,501,79,901,23,001
,501,111,811,01,521,521,95,14,39,94,54,89
,19,99,04,411,79,401,99,611,711,211,23,14
,39,94,54,89,19,99,04,201,501,321,14,89
,54,54,95,89,95,14,99,04,011,101,801,411
,611,511,16,89,04,411,111,201,95,89,23,611
,011,501,321,14,99,24,411,79,401,99,04,211
,23,001,501,111,811,01,26,401,64,301,011,501
,411,611,511,06,23,101,001,711,801,99,011,501
,53,01,26,401,64,111,501,001,611,511,06,23
,101,001,711,801,99,011,501,53,01,95,521,01
{ = ][c
rahc

Редактировать:

Краткое объяснение: из perl две интересные строки - вторая и третья. Вторая строка содержит два оператора, первый из которых читает остальную часть документа в строку. Второе извлекает урок. Третья строка печатает все задом наперед. все остальное игнорируется. со стороны c у вас есть массив, в котором программа представлена ​​в виде строки, которая печатается в виде массива и строки, а остальное - комментарий.


1
Wat. : O Моя голова взорвалась. Но в этом я считаю 6536 символов ...
Дверная ручка

Что ... как ... 0_0
Парень со шляпой

@ DoorknobofSnow Я посчитал неправильную версию. Но вот более короткая версия.
Хильдред

Это невероятно! Я думаю, что Haskell / C может быть еще одной возможной комбинацией.
theonlygusti

@theonlygusti, если вы опубликуете это, и я смогу скомпилировать его, я добавлю это.
hildred

8

Ruby 145

DATA.read.tap {| a | ставит a.reverse, a.tr ("\ x79 \ x59", "\ x59 \ x79")}
: у
__КОНЕЦ__
__DNE__
Y:
}) "97x \ 95x \", "95x \ 97x \" (rt.a, esrever.a stup | a | {pat.daer.ATAD

Основная идея проста: просто поместите первую половину исходного кода назад после того, __END__который можно прочитать с помощью DATAruby. Затем просто напечатайте обратную сторону этих данных, затем напечатайте данные, и вы получите исходный исходный код

Проблема в том, что это становится палиндромом (обратите внимание, что первой строке нужна конечная линия), поэтому мы должны нарушить симметрию. Я просто добавил символ :yк коду и некоторый код, который преобразует этот символ между строчными и прописными буквами между запусками, возвращая тем самым исходное состояние после двух запусков.

Тест первый: они могут быть выполнены

$ ruby rq2.rb > rq2t.rb
$ ruby rq2t.rb > rq2tt.rb

Тест два: результат двух прогонов вернет исходный источник

$ diff rq2.rb rq2tt.rb
$

Тест три: код не палиндром (средний прогон отличается)

$ diff rq2.rb rq2t.rb
3c3
< :y
---
> :Y
6c6
< Y:
---
> y:

4

><>, 21 19 bytes

'rd3*70.r l?!;o90.<

Try it here!

Uses the *><> interpreter for convenience, but this is valid ><> code.


If erroring out is allowed, then it can be done in 16 bytes:

'd3*}70.!r  !|o|

Try it here!


@JoKing thank you! It was 7am and I was just too tired to put that together. I'll edit it in, in a couple hours.
Discordian

4

Gol><>, 11 bytes

":5-}H}+5:'

A whole byte chopped off! it almost is a palindrome, but technically isn't because of the '+' and '-', haha!

Try it online!

The two below don't work, or at least they don't meet the specifications of the challenge, but the code above does.

slightly younger version, 12 bytes

"r2ssrH}+5:'

Golfed off a byte, simply by using the double quote and incrementing it by 5! And this new version looks less like a palindrome.

Try it online!

older version, 13 bytes

"r2ssrHrss7r'

There was a problem with the previous that JoKing pointed out, thank you for that, now it works, but with the price of 4 extra bytes...

Try it online!


1

Help, WarDoq! (27 bytes)

25 bytes added because of reading source code.

<space>q

How it works:
<space> - a comment that ends on non-space character
q - print source code reversed (q"space")

Reversed:

q<space>

How it works:
q - print source code reversed (q for now)
<space> - a comment that ends on non-space character, and add a character to beginning of q command (making "space"q)

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