Код гольфа: Обратный quine

Напишите программу, которая выводит reverse своего исходного кода в виде строки. Если источник

abcd
efg

(т.е. строка C "abcd\nefg")

Тогда выход должен быть

gfe
dcba

(т.е. строка C "gfe\ndcba")

Бонусные баллы за использование эзотерических языков, таких как brainf * ck.


* EDIT: ** Удалены ненужные символы \0. +

Ответ 3

Powershell FTW (1 символ):

1

Поместите его непосредственно в командной строке или внутри script.

Ответ 4

Здесь двухстрочный, адаптированный из NeatQuine.py:

me = 'me = %(me)r\nprint (me %% locals())[::-1]'
print (me % locals())[::-1]

Ответ 5

C89

int sprintf(char*,char*,...);char*d=
"int sprintf(char*,char*,...);char*d=%c%c%s%c%c,b[999],*p=b+251;main(){for(sprintf(b+1,d,10,34,d,34,10,10,10);*p;)putchar(*p--);}%c"
,b[999],*p=b+251;main(){for(sprintf(b+1,d,10,34,d,34,10,10,10);*p;)putchar(*p--);}

Ответ 6

Bash script

(10 Charecters)

cat $0|rev

Это должно быть сохранено как файл script для работы и выполнения в том же каталоге.

Другим решением будет python (или любые другие языки сценариев) файл исходного кода с нулевым байтом! он ничего не будет печатать взамен. В правилах ничего не сказано, что он не может быть 0-байтным файлом:).

Ответ 7

J, 26 символов.

|.(,~,2#{:)'|.(,~,2#{:)'''

Производит вывод:

'''):{#2,~,(.|'):{#2,~,(.|

Ответ 8

Я собираюсь проиграть в гольфе, но он научил меня важному уроку о тонкостях reverse(). Perl в слишком много (142) символов:

#!/usr/bin/perl
$_='#!/usr/bin/perlc%$_=c%s%c%;print sprintf~~reverse,10,39,~~reverse,39,10;c%';print sprintf~~reverse,10,39,~~reverse,39,10;

Это доказывает, что комбинация sprintf()/reverse() не подходит для решения этой проблемы. Лучшее решение для Perl, несомненно, будет использовать eval().


Огромное улучшение: 45 символов:

print~~reverse <<''x2
print~~reverse <<''x2

Обратите внимание, что исходный файл должен заканчиваться пустой строкой. Пустая строка подсчитывается в счетчике символов - как, по-вашему, у нас получилось нечетное количество символов из двух одинаковых строк кода?

Ответ 9

Python 2 (55 char):

x='x=%s;print(x%%repr(x))[::-1]';print(x%repr(x))[::-1]

Лучший игрок в гольф может немного сократить это, поэтому любые улучшения приветствуются.

Изменить (43 char):

x='x=%r;print(x%%x)[::-1]';print(x%x)[::-1]

также благодаря @stephan202 для поиска пробелов на печатях

Ответ 10

F # (659 символов)

open System;let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in let q=char 34 in let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in let Quine s=String.Format("let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)",[|box q;box(Q s);box q;box q;box q|]) in let s="open System;let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in let q=char 34 in let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in let Quine s=String.Format(\"let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)\",[|box q;box(Q s);box q;box q;box q|]) in " in printf "%s%s" (R(Quine s)) (R s)

Вставка разрывов строк (которые разбивают программу, но делают ее более читаемой):

open System;
let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in 
let q=char 34 in 
let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in 
let Quine s=String.Format("let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)",
    [|box q;box(Q s);box q;box q;box q|]) in 
let s="open System;
       let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in 
       let q=char 34 in 
       let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in 
       let Quine s=String.Format(\"let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)\",
           [|box q;box(Q s);box q;box q;box q|]) in " in
printf "%s%s" (R(Quine s)) (R s)

Ответ 11

В C, 217 символов:

a="};)01(rahctup;)--p*(rahctup);p*;43=p*(rof;)a(ftnirp;))a,b=p(tacrts(nelrts=+p{)p*rahc(niam;}7393422{=]99[b;";b[99]={2243937};main(char*p){p+=strlen(strcat(p=b,a));printf(a);for(*p=34;*p;)putchar(*p--);putchar(10);}

Ответ 12

Javascript - IE/Chrome/FF

(function(){alert(("("+arguments.callee+")()").split("").reverse().join(""))})()

Ответ 13

В интерактивном приглашении Python:

xatnys dilavni :rorrExatnyS

27 символов.

Ответ 14

C89, 119 символов

К сожалению, для этого требуется использование нестандартной функции strrev():

main(){char*a="};)43,)b(verrts,43,a(ftnirp;)a(pudrts=b*,%c%s%c=a*rahc{)(niam",*b=strdup(a);printf(a,34,strrev(b),34);}

Ответ 15

Bash, 75 символов

Ну, конечно, пустая оболочка script ничего не выдаст, но следующая лучшая вещь, о которой я могу думать:

a=\;printf\ \"a=%q%s\"\ \"\$a\"\ \"\$a\"\|rev;printf "a=%q%s" "$a" "$a"|rev

Тот же самый трюк.

Ответ 16

UNIX shell:

z=\' a='z=\\$z a=$z$a$z\;eval echo \$a\|rev';eval echo $a|rev

Я, как правило, повторяю свое: эти программы следует называть "Goedels", потому что идея большинства таких вещей впервые использовалась (в современную эпоху) Курт Гедель в доказательстве его первой теоремы о неполноте ( Курт Годель Собрание сочинений I, с .175).

Ответ 17

Perl

73 символа.

#! /opt/perl/bin/perl
seek DATA,0,0;$/=\1;print reverse <DATA>;
__DATA__
​
  • У вас должен быть __DATA__ в конце, чтобы файл-дескриптор DATA начал открываться.
  • Настройка $/ на ссылку числа, заставляет readline() читать это количество байтов за раз.
  • seek(DATA,0,0) требуется установить указатель на начало файла, а не в начале раздела __DATA__.
  • Может удалить или сократить строку shebang (#!...)
  • __DATA__ требует после него строки новой строки или недействителен Perl.

Ответ 18

Haskell, 79 символов

a=";main=putStr.reverse$\"a=\"++show a++a";main=putStr.reverse$"a="++show a++a

Стандартный трюк.

Ответ 19

Java:

Определенно не кратчайший, но какой черт (одна строка):

public class R{public static void main(String[] a){StringBuffer s = new StringBuffer("public class R{public static void main(String[] a){StringBuffer s = new StringBuffer();s.reverse();System.out.print(s.substring(0,152));System.out.write(34);System.out.print(s);System.out.write(34);System.out.println(s.substring(152));}}");s.reverse();System.out.print(s.substring(0,152));System.out.write(34);System.out.print(s);System.out.write(34);System.out.println(s.substring(152));}}

Ответ 20

PHP 36 bytest

<?echo strrev(join(file(__FILE__)));

Ответ 21

C89 (155 байт)

#define q(k)r(char*s){if(*s)r(s+1);putchar(*s);}main(){r(#k"\nq("#k")\n");}
q(#define q(k)r(char*s){if(*s)r(s+1);putchar(*s);}main(){r(#k"\nq("#k")\n");})

Ответ 22

PHP

Снятый неверный ответ

И теперь, чтобы искупить себя,

<?php echo strrev(file_get_contents(__FILE__)); ?>

Ответ 23

python (34 символа):

print(open(__file__).read()[::-1])

Ответ 24

JavaScript: сколько символов вы хотите?
ВТОРАЯ ПРОСТАЯ ДЕЙСТВИТЕЛЬНАЯ ПРОГРАММА (используя мой метод): 240 символов! (включая пробелы, но не новые строки)

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<script>
var string = "<!DOCTYPE HTML>\n<html>\n" + document.documentElement.innerHTML + "\n</html>";
var string2 = string.split("").reverse().join("");
document.write(string2);
</script>
</body>
</html>

Ответ 25

C/С++:

#include<stdio.h>
int main() {
    char c;
    freopen("thisfilename.c","r",stdin); //or thisfilename.cpp
    while(scanf("%c",&c)!=-1)
        printf("%c",c);
return 0; }