ソースコードの逆を文字列として出力するプログラムを書いてください。ソースが
abcd
efg
(つまり、C 文字列"abcd\nefg"
)
次に、出力は次のようになります
gfe
dcba
(つまり、C 文字列"gfe\ndcba"
)
Brainf*ck などの難解な言語を使用するためのボーナス ポイント。
*EDIT:** 不要な \0 文字を削除しました.+
ソースコードの逆を文字列として出力するプログラムを書いてください。ソースが
abcd
efg
(つまり、C 文字列"abcd\nefg"
)
次に、出力は次のようになります
gfe
dcba
(つまり、C 文字列"gfe\ndcba"
)
Brainf*ck などの難解な言語を使用するためのボーナス ポイント。
*EDIT:** 不要な \0 文字を削除しました.+
HQ9+の難解な言語では、このコードは次のようになります。
Q
ここでその言語の通訳を見つけることができます。
ここから逆クイン。
eval s=%q(puts "eval s=%q(#{s})".reverse)
Powershell FTW (1 キャラクター):
1
コマンドラインまたはスクリプト内に直接配置します。
これは、 NeatQuine.pyから改作された 2 つのライナーです。
me = 'me = %(me)r\nprint (me %% locals())[::-1]'
print (me % locals())[::-1]
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--);}
(10文字)
cat $0|rev
これをスクリプト ファイルとして保存し、同じディレクトリで実行する必要があります。
別の解決策は、Python (またはその他のスクリプト言語) でゼロ バイトのソース コード ファイルを作成することです。代わりに何も出力しません。ルールには、0byte ファイルにすることはできないと言っているものは何もありません:)。
|.(,~,2#{:)'|.(,~,2#{:)'''
出力を生成します。
'''):{#2,~,(.|'):{#2,~,(.|
Python 2 (55 文字):
x='x=%s;print(x%%repr(x))[::-1]';print(x%repr(x))[::-1]
より良いゴルファーはこれをいくらか短縮できるかもしれないので、改善は大歓迎です.
編集 (43 文字):
x='x=%r;print(x%%x)[::-1]';print(x%x)[::-1]
また、印刷物の空白をキャッチしてくれた@stephan202にも感謝します
私はゴルフで負けるだろうが、その微妙さについての重要な教訓を私に教えてくれた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
ソース ファイルは空白行で終了する必要があることに注意してください。空白行は文字数にカウントされます。2 つの同一のコード行から奇数の文字数が得られたと他にどのように考えますか?
Javascript - IE/Chrome/FF
(function(){alert(("("+arguments.callee+")()").split("").reverse().join(""))})()
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);}
Python 対話型プロンプトで:
xatnys dilavni :rorrExatnyS
27文字。
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)
UNIXシェル:
z=\' a='z=\\$z a=$z$a$z\;eval echo \$a\|rev';eval echo $a|rev
私は自分自身を繰り返す傾向があります。これらのプログラムは「ゲーデル」と呼ばれるべきです。なぜなら、そのようなものの大部分の背後にあるアイデアは、最初の不完全性定理(Kurt Goedel's Collected)の証明でKurt Goedelによって最初に使用されたからです(現代では)作品I、p.175)。
もちろん、空のシェル スクリプトでは何も出力されませんが、次に考えられる最良の方法は次のとおりです。
a=\;printf\ \"a=%q%s\"\ \"\$a\"\ \"\$a\"\|rev;printf "a=%q%s" "$a" "$a"|rev
同じトリック。
残念ながら、これには非常に非標準的な関数を使用する必要があります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);}
a=";main=putStr.reverse$\"a=\"++show a++a";main=putStr.reverse$"a="++show a++a
標準的なトリック。
PHP 36 バイトテスト
<?echo strrev(join(file(__FILE__)));
ジャワ:
間違いなく可能な限り最短ではありませんが、なんと(1行):
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));}}
73文字。
#! /opt/perl/bin/perl
seek DATA,0,0;$/=\1;print reverse <DATA>;
__DATA__
__DATA__
は、最後に必要があります。DATA
$/
数値の参照に設定するreadline()
と、一度にその数のバイトが読み取られます。seek(DATA,0,0)
セクションの先頭ではなく、ファイルの先頭にポインタを設定する必要があります__DATA__
。#!
...)__DATA__
の後に改行が必要であるか、有効な Perl ではありません。Snip - 不正解を削除
そして今、自分自身を贖うために。
<?php echo strrev(file_get_contents(__FILE__)); ?>
JavaScript: 何文字必要ですか?
2 番目に単純な有効なプログラム (私の方法を使用): 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>
python (34 文字):
print(open(__file__).read()[::-1])
#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; }