クイン...しかし、1つシフト


15

10進数の印刷可能なASCII文字コードを参照すると、32から126までの間に32が(スペース)である印刷可能な文字があることがわかります。あなたの課題は、32〜125(126を除く)の文字のみを使用してプログラムを作成し、実行時に独自のソースコードを印刷することです。ただし、ソースコードの各文字のASCIIコードは1つ増えます。

たとえば、ソースコードが

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

その出力は

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

以下は禁止されています。

  • 外部ファイルまたはストレージ(インターネットを含む)の読み取り/書き込み/使用
  • 独自のソースコードの読み取り/エコー
  • 2文字未満のソースコード(面白くない)。2以上でなければなりません。

少なくとも2週間待った後、任意の言語で最高の賛成票を獲得した回答が勝者となり、少ない文字数がタイブレーカーとなる人気コンテストになります。


126を許可しないのに32にしなければならないのはなぜですか?(だれがこれを行うのか理由/方法はわかりません。)
ジャスティン14年

これらの種類の質問は、エラーメッセージが「出力」と見なされることも禁止する必要があります(申し訳ありませんが@GariBN)。「出力」は、コードによって標準出力に意図的に出力されるものであり、言語実行可能ファイルによって決定される任意の副作用ではありません。
l0b0

3
~GolfScript を使用できないのは本当に残念です。意図的にそれをやったと思います。:-)
イルマリカロネン14年

1
「独自のソースコードの読み取り」を定義します。関数を文字列化することはできますか、それとも文字列を評価する必要がありますか?
ジョンドヴォルザーク14

1
この問題は人気コンテストとしては適切ではないようです。
l4m2

回答:


46

Python(27文字)

Pythonシェルでは、次のスクリプトが目的の結果を出力します。

TzoubyFssps;!jowbmje!tzouby

はい!以下を出力します:

SyntaxError: invalid syntax

6
ああ、これが来るとは思わなかった。:-D
固定小数点14年

9
実際には、結果は間違った方向にシフトされます
。P–エルブレスは、モニカを復活させる14

@Erburethこれは、他の多くの回答にも関連しています... =)
ガリBN 14年

最短ではありませんが、スマートな動き。xD
cjfaure 14年

2
トロロロロロロールを呼んでいます。
PyRulez 14

14

え?、5文字

Ntbg 

5番目の文字はの後のスペースであることに注意してくださいNtbg。これは、以前の回答の1つと同じトリックです。Ntbgは無効なパスなので、インタープリターは次のように出力しOuch!ます:

huh.exe Ntbg 

「ハァッ」とたくさんのクインが想像できます。今。逆クイン:!hcuOクイン:痛い!
MilkyWay90

8

PHP(351)

codegolfingの初心者なので、これを行うためのより良い方法があると確信していますが、私の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

GolfScript、15文字

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

出力:

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

オンラインでお試しください。

「rotating quine」チャレンジへのエントリーに使用したテクニックに基づいた、かなり簡単なソリューション。難しい点の1つは~、チャレンジルールで文字(ASCII 126)が許可されていないため、コードブロックの実行に使用できないことです。幸い、1*その同義語として使用できます。

説明:

コードブロック{`{)}%"/2+"}はによって複製され、.2番目のコピーは1*(技術的には1反復ループ)によって実行され、他のコピーをスタックに残します。コードブロック内で、コードブロックを`文字列化し、{)}%その文字(のASCIIコード)をループして、1つずつ増やします。最後に"/2+"、リテラル文字列/2+.1*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バイト

これは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

Python、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)を最後に配置してみてください。1つシフトされたタブは新しい行(\x0A)です。その後、短縮バージョンは76バイトで動作します。
mbomb007 16


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

C-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クイン

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

くそ、これについてはヒアドキュメントを使用できません。

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

Rubyには.succ文字でこれを行うネイティブメソッドがあり、改行なしの印刷は印刷ありよりも短いので、これは非常にうまく機能します。


0

C、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);}

Cの古典的なクインの別の変更...


0

> <>、16バイト

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

ここで試してみてください!

これは多かれ少なかれ> <>の標準的なクインです(g命令を使用しません)。唯一の違いは、独自のソースコードを読み取らず、各文字を1ずつ増やしてから出力することです。

出力

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

*> <>、15バイト(非競合)

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

ここで試してみてください!






弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.