ROT-47にROT-47…を実装


23

課題:ROT-47を、それ自体とROT-47バージョンの両方として機能するコードに実装します。

得点:

スコアは、両方のバージョンの合計バイト(すべての文字)で割った、プログラムの両方のバージョンの合計使用されるROT-47適格バイトの割合として計算されます

使用し、ROT-47適格バイトがないROT-47暗号によって変換されるだろう任意の文字で、コメントの一部またはコンパイラ/インタプリタでは無視されます。たとえば、brainfuckプログラム内の文字ではない+-<>[],.文字は使用済みバイトとは見なされず、Cプログラム内の文字を含む//またはその前後の文字は/* */使用済みバイトとは見なされません。APLのすべての特殊記号は、ホワイトスペースプログラムのすべての文字と同様に、使用されているとは見なされません(申し訳ありません)。

最も多くの賛成票を獲得したプログラムは、関係を壊します。同点の場合は、最短のプログラムが勝ちます。

スコアリングの例:

C:62/64 = 96.875%

このプログラムにはスペースがあります。明らかに、このプログラムはコンパイルさえできないため、有効なエントリではありませんが、スコアリングの仕組みを示したかったのです。

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

4
そして、どの言語で>2:?WXLAC:?E7WQw6==@ (@C=5PQXjNコンパイルしますか?
Hosch250 14

@ hosch250笑、ちょうどダムの例だったこと
durron597

1
「ROT-47適格」とは、「ASCII範囲33〜126」を意味しますか?つまり、Cプログラムにスペース、改行、またはタブがある場合、それらはROT-47の対象としてカウントされますか?プログラムが多くの言語で機能するためにいくつかのスペースが不可欠であるという事実についてはどうでしょうか?それらはR47に適していないので、プログラムがそれらなしで壊れても使用済みとしてカウントされませんか?
ジョナサンヴァンマトレ14

@JonathanVanMatreスペースや改行、タブはカウントされません。そうしないと、スコア付けが複雑すぎると感じるからです。ホワイトスペースが100%のスコアを獲得できるようにしたくないのは、それが目的に反するからです。
durron597 14

2
:ここに私の狂気のスコアリングルールに反対されたすべての人、してくださいコメント/答えるためにmeta.codegolf.stackexchange.com/questions/1167/...
durron597

回答:


28

ルビー、100%(74文字)

STDINの入力、STDOUTの出力。

Vj=s=gets;puts(s.tr'!-~','P-~!-O');Vj;'lDl86EDjAFEDWD]ECVP\OV[V!\OP\~VXj;'

2行目はROT-47'dの最初の行です。したがって、プログラム全体をROT-47すると、次のようになります。

';lDl86EDjAFEDWD]ECVP\OV[V!\OP\~VXj';jV=s=gets;puts(s.tr'!-~','P-~!-O');jV

ここでの私の戦略は、次の事実に基づいています。

  • Vある'ときROT-47'd

  • jある;ときROT-47'd

  • したがって、にVj=...Vj;変わります';l...';。これは基本的にノーオペレーションです。

    • これで、ROT-47'dの場合、通常は何もせず、何もしない任意のコードを作成できます。これは、Vj=...Vj;できる限りのコードの実行をサポートできるためVj=0;{INSERT ANY CODE};Vj;であり'...';、ROT-47'dになったときになります。Vそのコードで使用しないように注意する必要があります。
  • 同様のロジックを逆に使用して、後半を生成できます(jV代わりにVj


大丈夫あなたは正しいです、私はそれを指定したことはありませんし、遡及的にはしません。ただし、スペースはまだ有効な文字としてカウントされません。これは136/140であると思います。
durron597 14

1
@ durron597修正; もうスペースはありません。
ドアノブ

行をセミコロンで終了する必要がない
ダンルビー

16

C-54.6%

Y;BW;XL;jNj;AW(){XL^Y;};main(int i,char**v){char*x=v[1];while(*x){if(*x>32&&*x<128)*x=(*x+15)%94+32;putchar(*x++);}}//Y^Nj>2:?W:?E :[492CYYGXL492CYIlG,`.jH9:=6WYIXL:7WYImbaUUYIk`agXYIlWYIZ`dXThcZbajAFE492CWYIZZXjNN

ROT-47が翻訳されると、

*jq(j){j;};jp(WXL){/*jNj>2:?W:?E :[492CYYGXL492CYIlG,`.jH9:=6WYIXL:7WYImbaUUYIk`agXYIlWYIZ`dXThcZbajAFE492CWYIZZXjNN^^*/};main(int i,char**v){char*x=v[1];while(*x){if(*x>32&&*x<128)*x=(*x+15)%94+32;putchar(*x++);}}

両方のプログラムがコンパイルされ、最初の引数がROT-47-translateされます。

$ ./a "hello world"
96==@ H@C=5

これをideoneで動作させるのに苦労しました。しかし、スコアが50%を超えていることに非常に感銘を受けました!
durron597 14

@ durron597それは、引数を介して入力を受け付けてideoneのない仕事ではなく、標準入力します
mniip

1
自己翻訳だけでなく、引数にROT-47を実装することに賛成票を投じてください。それは仕様にあるべきだった。
ジョナサンヴァンマトレ14年

10

GolfScript、120/120バイト= 100%

{:&&32>&&+254<*{7+7+94%33+}*}%LiUUbamUUZadckYLfZfZhcTbbZNYNT

または、ROT-47の場合:

LiUUbamUUZadckYLfZfZhcTbbZNYNT{:&&32>&&+254<*{7+7+94%33+}*}%

コメントや文字列の乱用はありません。未定義のコマンドLiUUbamUUZadckYLfZfZhcTbbZNYNT(ROT-47の残りのコードと同じ)は何もしませんが、それでもインタープリターによって実行されるので、使用されたと見なされます。

これは、GolfScriptでは実際に非常に簡単な課題でした。主な困難は、1ROT-47によってGolfScriptコマンドにマッピングされる数字を避けることでした`。コマンドは.-,\[/]^も避けなければならなかったが、タスクは何の配列の構築を必要としないので、それは、この場合にはかなり簡単でした。

ボーナス:

以下は、GolfScript 期間2クイン(つまり、最初のプログラムを再度印刷する2番目のプログラムを印刷するプログラム)です。2つのプログラムは、互いにROT-47変換されています。

{`'0$~'+.{7+7+94%33+}%@!{0$@@;}*}0$~L1V_SOVZ]LfZfZhcTbbZNToPL_SoojNYN_SO

このプログラムは、ROT-47エンコードされた自身を出力し、別のGolfScriptプログラムを生成します。

L1V_SOVZ]LfZfZhcTbbZNToPL_SoojNYN_SO{`'0$~'+.{7+7+94%33+}%@!{0$@@;}*}0$~

次に、エンコードされたROT-47自体も出力し、以前のプログラムを再び生成します。したがって、このプログラムも回転するクインです。


あなたの分母は間違っています:「両方のバージョンの合計バイト(すべての文字)で割った」。60/120 = 50%
ジョナサンヴァンマトレ14年

@JonathanVanMatre:両方のバージョンのすべてのバイトが使用される(=インタープリターによって実行される)ため、120/120 =それでも100%になります。
イルマリカロネン14年

golfscriptを知らないので、得点がわかりません。たとえば、Abrainfuckでは分子でカウントされますが、分母ではカウントされません。これは同じものですか?
durron597 14年

@ durron597:LiUUbamUUZadckYLfZfZhcTbbZNYNTGolfScriptの有効な識別子であり、コマンドとして実行されます。ただし、組み込みコマンドの 1つではなく、プログラムによって意味が割り当てられることもないため、デフォルトでは何もしません。
イルマリカロネン14年

6

python、96.1%(?)

あなたの定義によれば、文字列は使用済みコードとしてカウントされますか?

V=input();print("".join([chr(33+(ord(V[i])+14)%94)for i in range(len(V))]));V
'l:?AFEWXjAC:?EWQQ];@:?W,49CWbbZW@C5WD,:.XZ`cXThcX7@C : :? C2?86W=6?WDXX.XXj'

1
振り返ってみると、彼らは持つべきではないが、それは今までのところ手遅れ
durron597
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.