クライントポロリグロット


43

Kleinは私が設計した2D言語で、12の異なるトポロジサーフェスに埋め込むことができます。Kleinプログラムは、コマンドライン引数を変更することにより、異なるサーフェスで実行できます。

トポロジは、プログラムの端から出たときに命令ポインタがどこに移動するかを決定します。エッジから移動すると、IPは一致する色のエッジにジャンプし、矢印に対する位置を維持します。つまり、ポインターは矢印の頭からの距離を保持します。

たとえば000、ほとんどの2D言語で使用されるトポロジであるトポロジでは、エッジから外れると、命令ポインタが反対側に回り込みます。

仕事

タスクは非常に簡単で、実行時に実行されるトポロジを出力するKleinプログラムを記述します。個々の数字はスペースで区切ることができます。(たとえば0000 0 0両方とも許容される出力です)。-Aコマンドラインフラグを使用するか無視するかを選択できます。コマンドラインフラグを使用しても、バイト数はかかりません。

これはので、最短の答えが勝者になります。

これは、すべてのトポロジを一度にテストするために使用できるオンラインテストドライバーです。整数モードで実行するには、を削除し-Aます。


18
+1は、言語固有の優れた課題の優れた例です。:)
マーティン・エンダー

1
@StephenSいいえ。無料で提供します:)
小麦ウィザード

1
IPの動きが頭を痛めています
-MickyT

2
画像を修正してください
...-user202729

1
@JoKing私はしばらく知っていて、それを修正することを意味してきました。私は今のところ画像を削除しましたが、最終的には時間をかけて新しい画像を作成できることを願っています。ありがとう。
小麦ウィザード

回答:


35

52 48バイト

./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@

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

テストドライバー

説明

Kleinでは、IPは左上隅から右に向かって始まります。プログラムで最初にしたかったのは、プログラムの先頭からIPを送信して、1番目と3番目のビットを決定することでした。トポロジに応じて、IPは次のよ​​うにプログラムに再入力します。

             ^
            I|P
            ./.....
201, 211 -->.......<-- 100, 110
            .......
            .......
            .......
200, 210 -->.......<-- 101, 111
            .......
             ^   ^
             |   |
            000 001
            010 011

私のプログラムは、トポロジーの3番目のビットを2番目のビットの前に記録し$、終了する前に(を使用して)スワップすることにしました。そのために、上記のIPのエントリポイントで各トポロジの最初と3番目のビットをプッシュするコードを追加しました。

./.....
21...01
.......
.......
.......
20...11
.0...0.

次に、最初のビットとして、1または2最初のビットとしてトポロジに焦点を当てました。私はそれらを再結合し、北側に接続されていない側でそれらを送信することにしました。

                      ./.....
                      21\./01
                      ..>....--> 200, 201, 210, 211
                      .......
100, 101, 110, 111 <--....<..
                      20/.\11
                      .0...0.
                        ^ ^
                        | |
                        / \
                      110 100
                      111 101
                      210 200
                      211 201

都合の良いことに、これはトポロジーを2番目のビットで再グループ化したので、それをスタックにプッシュできました。

./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.

その後、2番目と3番目のビットを交換して、プログラムを終了する必要がありました。

./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.

最初のビットを1使用2した、または最初のビットとして機能するトポロジが0できたので、正しい出力を提供するトポロジの作成に集中できました。最初のステップは、2番目のビットに基づいて2つのグループに分離できるように、それらを再結合することでした。

                      ./.$...
                      21\./01
                      ..>....<-- 010, 011
                      @......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
                      20//\11
                      .01$00.

最初に1、2番目のビットとしてこれらのトポロジに焦点を当てました。これらは、2最初のビットとしてトポロジですでに使用されている回線上にIPがあったため、課題を提示しました。その行に複数の命令を収めるのは難しい(命令を使用して単一の命令をジャンプできる!)ため、全体としてスペースが不足しているため、その行からIPをリダイレクトし、既存の1命令を再利用することにしました2番目のビットをプッシュします。

./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.

12番目のビットが2番目と3番目のビットの順序を修正して終了することであるため、トポロジの処理は残りました。

       ^
       |
 ./.$..$
 21\./01
 ..>..!\
 @......
 .<..<<.
 20//\11
 @01$00@
 ^     ^
 |     |
011   010

最後に0、2番目のビットとしてトポロジが残りました。プログラムに残っているスペースはほとんどなく、一番上の行に最大の未使用スペースがあったため、02番目のビットとしてトポロジーのIPをリダイレクトしました。

./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@

それでも0、2番目のビットをプッシュして、2番目と3番目のビットの順序を修正し、プログラムを終了する必要がありました。幸い、私は既存の再利用することができた$ので、命令を0し、@命令は残りのスペースに合うことができます。

./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@

最後に、最後のプログラムを取得するために、行末からnopsを取り除くことができます。


15

116 88 86 77 69 61 60 59 58 54 53 50バイト

\2..@2
/1\<$00
/>!..>!
0//
@0$10@1
011\.<0
\.<@>1@

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


1
あなたは0.oそれを作ったし、多分あなたのように視覚的な種類の作成について考えるべきか@WheatWizard ETHはCubixのために作られた
スティーブン

@StephenS -dフラグを指定してKleinを実行すると、まさにそれが実行されます。残念ながら、TIOでは機能しません。
小麦ウィザード

15

44 41 40 38 37バイト

\\1.>2
/0./
@./$(\
$>0!>
11$/10
$.@.1

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

テストドライバー。

6 x 6の正方形を使用します。誰かがそれを改善しようとするならば、私が8×8の正方形で得ることができる最短は38バイトです。

説明:

コードの最初のパススルーでは、プレフィックス0との最初の2つの数字がエンコードされ1ます。の場合2、3番目の数値をエンコードしてから最初の数値をエンコードします。

     201  200
     211  210
       |  |
       v  v
   -> \\1.>2
 IP<- /../..  <- 000, 001
      ...$..
      .>0...
      .1..10  <- 010, 011
      ....1.
       ^  ^
       |  |
     100  110
     101  111

次に、IPを3番目のエッジに通して、最終番号を決定します。IPを同じプレフィックスで結合します。

     201  200
     211  210
       |  |
       v  v
   -> \\1.>2  -> 0,2 or 1,2
 IP<- /../..  <- 000, 001
      ...$..
      .>0!>.  -> 1
      .1./10  <- 010, 011
      ....1.
       ^ |^
       | v|
       | 0|
     100  110
     101  111

以下の場合01接頭辞、それらの両方は、第三の数を決定するために、トップの端を出てきます。

     201  200
     211  210
       |  |
       |10|
       vvvv
   -> \\1.>2  -> 2
 IP<- /0./..  <- 000, 001
      @./$..
      .>0!>.  -> 1
      .1./10  <- 010, 011
      ....1.
       ^ |^
       | v|
       | 0|
     100  110
     101  111

以下のために2接頭辞、IPアドレスは、下端からコーナーを出てきます。

     201  200
     211  210
       |  |
       |10|
       vvvv
   -> \\1.>2  -> 2
 IP<- /0./..  <- 000, 001
      @./$(\
      $>0!>.  -> 1
      11$/10  <- 010, 011
      $.@.1.
      ^^ |^^
      || v||
      1| 0|0
     100  110
     101  111

両方のエッジが最初と3番目の数字を交換し、2番目の数字をプッシュし、3番目の数字と交換して正しい順序を取得します。

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