Куайн ... но сдвинут на один


15

Обращаясь к печатным кодам символов ASCII в десятичном формате, мы знаем, что от 32 до 126 у нас есть печатные символы с 32 (пробел). Ваша задача - написать программу, использующую только символы от 32 до 125 (исключая 126), которая при исполнении печатает свой собственный исходный код, за исключением того, что каждый символ в исходном коде имеет свой код ASCII, увеличенный на единицу.

Например, если исходный код был

main(){printf("Hello World");}

его вывод будет

nbjo)*|qsjoug)#Ifmmp!Xpsme#*<~

Следующее запрещено:

  • Чтение / запись / использование любых внешних файлов или хранилищ (включая Интернет)
  • Чтение / отображение вашего собственного исходного кода
  • Исходные коды, содержащие не более 2 символов (они неинтересны). Должно быть больше или равно 2.

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


Почему бы не позволить 126, но он должен пойти на 32? (Я не знаю, почему / как кто-то мог бы это сделать.)
Джастин

Подобные вопросы также должны запрещать рассматривать сообщения об ошибках как «выходные данные» (извините, @GariBN). «Вывод» - это материал, преднамеренно напечатанный на стандартном выводе вашим кодом, а не произвольные побочные эффекты, определяемые исполняемым языком.
10

3
Невозможность использовать ~действительно отстой для GolfScript. Спорим, ты сделал это нарочно. :-)
Илмари Каронен

1
определить «чтение собственного исходного кода». Разрешено ли нам выполнять строковую функцию или вместо этого мы должны оценить строку?
Джон Дворжак

1
Эта проблема, кажется, не подходит для конкурса популярности.
14 м2, 18

Ответы:


46

Python (27 символов)

В оболочке Python следующий скрипт выведет желаемый результат:

TzoubyFssps;!jowbmje!tzouby

Да! это выводит:

SyntaxError: invalid syntax

6
О, чувак, не ожидал этого. :-D
Фиксированная точка

9
На самом деле результат смещен не в ту сторону: P
Эрбюрет говорит восстановить Монику

@Erbureth Это относится и ко многим другим ответам здесь ... =)
Гари Б.Н.

Умный ход, хотя и не самый короткий. xD
cjfaure

2
Я звоню Тролололололол.
PyRulez

14

да? , 5 символов

Ntbg 

Обратите внимание, что 5-й символ - это пробел послеNtbg . Это тот же трюк, что и в одном из моих предыдущих ответов . Ntbgневерный путь, поэтому интерпретатор выведет его. Ouch!Вы должны запустить его так:

huh.exe Ntbg 

Я могу представить себе много цитат с "Ха?" сейчас. Перевернутый Куайн:! HcuO Куайн: Ой!
MilkyWay90

8

PHP (351)

Я уверен, что есть лучший способ сделать это, так как я новичок в разработке кода, но вот мое решение PHP:

function q(){$q=chr(39);$a=array('function q(){$q=chr(39);$a=array(',');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}

Выход:

gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(-(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~

6

TI-BASIC, 10

Для вашего калькулятора TI-83/84!

DQQ9RXMS@W

Выходы:

ERR:SYNTAX

6

GolfScript, 15 символов

{`{)}%"/2+"}.1*

Выход:

|a|*~&#03,#~/2+

Попробуйте онлайн.

Довольно простое решение, основанное на технике, которую я использовал для вступления в испытание «вращающейся лозы» . Одна хитрая деталь в том, что символ ~(ASCII 126) запрещен правилами вызова, поэтому я не могу использовать его для выполнения своего блока кода. К счастью, 1*может использоваться как синоним этого.

Объяснение:

Кодовый блок {`{)}%"/2+"}дублируется ., и вторая копия выполняется 1*(технически, одноэтапный цикл), оставляя другую копию в стеке. Внутри блока кода, он структурирует блок `кода и {)}%зацикливает (коды ASCII) его символы, увеличивая каждый на один. Наконец, "/2+"помещает буквенную строку /2+(которая .1*сдвинута на единицу) в стек. В конце программы интерпретатор GolfScript автоматически печатает все в стеке.

Ps. Да, я знаю, что это скорее а не строгий , но что еще я собираюсь делать с GolfScript - ASCII art? ;-)


3

JavaScript, 117 символов

Я знаю, что это не код гольф, но я все равно играл в гольф.

function f(){alert((f+';f()').split('').map(function(x){return String.fromCharCode(x.charCodeAt()+1)}).join(''))};f()

(Я не читаю свой собственный исходный код; я просто использую функцию Functionобъекта toString.)


2

Java - 1331 байт, 618 байт и 504 байт

Вот это в Java. Самое классное, что он довольно разборчивый и гибкий. Вы можете поэкспериментировать, чтобы изменить SHIFTпеременную на 0, и это будет квин. Вы можете изменить его на любое значение, которое вы хотите, включая отрицательные значения, и это соответственно сместит код.

public class Quinex {

    private static final int SHIFT = 1;

    private static String next(String now, boolean mangles) {
        String sb = "";
        for (char c : now.toCharArray()) {
            if (!mangles && c == 87) {
                sb += next(String.valueOf(SHIFT), true);
            } else {
                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);
            }
        }
        return sb;
    }

    public static void main(String... args) {
        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));
    }

    private static final String TEXT = "public class Quinex {^^    private static final int SHIFT = W;^^    private static String next(String now, boolean mangles) {^        String sb = @@;^        for (char c : now.toCharArray()) {^            if (!mangles && c == 87) {^                sb += next(String.valueOf(SHIFT), true);^            } else {^                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);^            }^        }^        return sb;^    }^^    public static void main(String... args) {^        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));^    }^^    private static final String TEXT = @";
}

Однако единственным недостатком в предыдущем классе являются разрывы строк, которые не разрешены в спецификации вопроса (находятся вне диапазона от 32 до 125). Поэтому я привожу здесь версию для игры в гольф, в которой нет разрывов строк (и нет причуд для их обработки). Вы можете отредактировать значение Sпеременной, чтобы изменить смещение. Это имеет 618 байт:

class Q{static String g(String p,int m){int S=1;String u="";for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){int S=W;String u=@@;for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

Конечно, если мы отбросим точную настройку смещения и жестко закодируем значение сдвига, мы можем сделать полностью гольф-версию с 504 байтами:

class Q{static String g(String p,int m){String u="";for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){String u=@@;for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

1

Perl 5, 284 символа включают перевод строки

Отсутствие возможности использовать ~ сделало это немного сложнее.

#!/usr/bin/perl
$_=<<X;
#!/usr/bin/perl
Y
\$a=\$_;
s/\\\\/\\\\\\\\/g;
s/\\\$/\\\\\\\$/g;
\$b=\$_;
\$_=\$a;
s/Y/\\\$\\_\\=\\<\\<X\\;\\n\${b}X/;
s/(.)/chr(ord(\$1)+1)/ge;
print;
X
$a=$_;
s/\\/\\\\/g;
s/\$/\\\$/g;
$b=$_;
$_=$a;
s/Y/\$\_\=\<\<X\;\n${b}X/;
s/(.)/chr(ord($1)+1)/ge;
print;

1

Питон, 99

s='import sys;sys.stdout.write("".join(chr(ord(c)+1)for c in a%(s,a)))';a='s=%r;a=%r;exec s';exec s

Выход:

t>(jnqpsu!tzt<tzt/tuepvu/xsjuf)##/kpjo)dis)pse)d*,2*gps!d!jo!b&)t-b***(<b>(t>&s<b>&s<fyfd!t(<fyfd!t

Это можно сократить до 75 символов , но после вывода будет напечатан символ новой строки, что технически нарушает правила:

s='print"".join(chr(ord(c)+1)for c in a%(s,a))';a='s=%r;a=%r;exec s';exec s

1
Почему бы вам просто не поставить табуляцию ( \x09) в конце, так как табуляция, сдвинутая на единицу, - это новая строка ( \x0A). Тогда ваша сокращенная версия будет работать с 76 байтами.
mbomb007


0

Луа - 192

Довольно просто,

s=[[print((('s=['..'['..s..']'..']'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))]]print((('s=['..'['..s..']'..'];'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))

0

С - 156

char*f="char*f=%c%s%c,q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}",q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}

Просто классический C quine с необходимыми модификациями

PS, видимо sprintf(f,...,f,...)это сегфо.


0

JavaScript (276)

Без использования .toString():

function q(){x=String.fromCharCode;y=x(39);a=['function q(){x=String.fromCharCode;y=x(39);a=[','];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}'];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}

0

Руби, 63

Черт, не могу использовать heredoc на этом.

s="s=%p;(s%%s).chars{|c|$><<c.succ}";(s%s).chars{|c|$><<c.succ}

В Ruby есть собственный метод, .succкоторый делает это для персонажа, и печать без новой строки короче, чем печать с помощью, так что это получается довольно аккуратно.


0

С, 153

main(a){char b[999];sprintf(b,a="main(a){char b[999];printf(a=%c%s%c,34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}",34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}

Еще одна модификация классического Quine в ...


0

> <>, 16 байт

" r:2+l?!;1+o50.

Попробуй это здесь!

Это более или менее просто стандартная квинета в> <> (без использования g инструкции). Единственные отличия в том, что он не читает свой собственный исходный код и увеличивает каждый символ на 1 перед его выводом.

Выходы

#!s;3,m@"<2,p61/

*> <> , 15 байт (не конкурирующих)

" r:2+Ol?!;1+ou

Попробуй это здесь!






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