明確にするために追加された改行:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
通常、Underloadの回答のようにスタックの最上部からではなく、STDINから読み取る必要があるという制限を自分に与えました。また、コードのほとんどを構成する適切な10進入力も使用しました。
説明:
プログラムをquine-wrapperでラップ(a(:^)*
し):^
ます。これは、クインラッパー内のすべてのコードがスタックの一番下にプログラムのソースコードを持つことを意味します。
数字を通常の教会の数字に変換するには、各数字をコードに置き換えて10倍してその数字を追加する手法を使用します。
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
ここには多くの繰り返しがあるので、それをサブプログラムにパッケージ化し、スタックの一番上から教会の数字を取得し、それを使用して「数字列」を作成します。
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
すぐにアクセスできるように、これを新しい環境に配置しました。
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
これで、の置換コードを作成できますR
。R
スタックの最上位要素を使用してルックアップテーブルを形成し、STDINの文字列をBetaloadコードに置き換えます。それはこのように動作します:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
ただし、作成したサブプログラムを使用して、コードセグメントを生成できます。
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
ときにR
実行され、そのビルドの教会の数字までサブプログラムのシリーズに入力を変換します。このサブプログラムが実行されると、スタックの次の要素(以前に配置された0)にその教会の数字が作成されます。これは、の後R^
に、スタックの一番上の値が教会の数字になることを意味します。それから^
もう一度答えを得るために、教会の数字をスタックの最後の要素(プログラムのソースコード)に適用します。
おもしろい事実:私は数か月間、この提出のためのMDを持っています。質問(私はもう見つけられないようです)を誤解した後、私はそれを保持していました。ここに投稿するには、ごみ箱から掘り下げる必要がありました。