Квіне… але зміщений одним


15

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

Наприклад, якщо був вихідний код

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

його вихід був би

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

Заборонено:

  • Читання / запис / використання будь-яких зовнішніх файлів або пам’яті (включаючи Інтернет)
  • Читання / повторення власного вихідного коду
  • Вихідні коди менше ніж 2 символи (вони не забавляють). Повинен бути більшим або рівним 2.

Зробити це змаганням популярності, де, почекавши щонайменше два тижні, відповідь будь-якою мовою, що має найвищі показники, виграє, коли менший підрахунок символів стає тай-брейк.


Чому б не дозволити 126, але це має перейти до 32? (Я не знаю, чому / як би хто це робив.)
Джастін

Такі питання також повинні забороняти вважати повідомлення про помилки "вихідними" (вибачте @GariBN). "Вихід" - це речі, свідомо надруковані на стандартному виході за допомогою вашого коду, а не довільні побічні ефекти, визначені мовою, що виконується.
l0b0

3
Неможливість використання ~дійсно гасить для GolfScript. Ставка, ви це зробили навмисно. :-)
Ільмарі Каронен

1
визначити "читання власного вихідного коду". Чи дозволяється нам строфікувати функцію, або нам доведеться замість неї виконувати рядок?
Джон Дворак

1
Ця проблема здається не такою підходящою як конкурс на популярність.
l4m2

Відповіді:


46

Пітон (27 символів)

У оболонці Python наступний сценарій видасть бажаний результат:

TzoubyFssps;!jowbmje!tzouby

Так! він виводить:

SyntaxError: invalid syntax

6
О людино, не бачив, щоб це наступало. :-D
Фіксована точка

9
Насправді результат зміщений неправильно: П
Ербурет каже, що повернеться Моніка

@Erbureth Це актуально також і для багатьох інших відповідей тут ... =)
Gari BN

Розумний хід, хоча це не найкоротший. xD
cjfaure

2
Я телефоную на троллололололол.
PyRulez

14

так? , 5 символів

Ntbg 

Зауважте, що 5-й символ - це пробіл післяNtbg . Це та сама хитрість, як і в одній з моїх попередніх відповідей . Ntbg- це недійсний шлях, тому інтерпретатор виведе. Ouch!Ви повинні запустити його так:

huh.exe Ntbg 

Я можу уявити багато лайків з "А?" зараз. Зворотна Quine:! HcuO Quine: Ой!
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 автоматично виводить все на стек.

Пс. Так, я знаю, що це а не суворий , але що я ще буду робити з мистецтвом GolfScript - ASCII? ;-)


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 байти

Ось воно в яві. Класна річ, що вона досить розбірлива і гнучка. Ви можете експериментувати, щоб змінити SHIFTзмінну на 0, і це буде quine. Ви можете змінити його на будь-яке значення, яке ви хочете, включаючи негативні значення, і воно змістить код відповідно.

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

Перл 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,...), це segfault.


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

Дарн, не можу використовувати гередок на цьому.

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 в c ...


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.