Klein Topololyglots

43

Klein adalah bahasa 2D yang saya rancang yang dapat disematkan pada 12 permukaan topologi yang berbeda. Program Klein dapat dijalankan pada permukaan yang berbeda dengan mengubah argumen baris perintah.

Topologi menentukan ke mana penunjuk instruksi berjalan ketika keluar dari tepi program. Ketika bergerak dari tepi IP akan melompat ke tepi dengan warna yang cocok, dan akan mempertahankan posisinya relatif terhadap panah, yaitu pointer akan menghemat jarak dari kepala panah.

Misalnya topologi 000, topologi yang digunakan oleh sebagian besar bahasa 2D, menyebabkan penunjuk instruksi membungkus ke sisi lain ketika jika bergerak dari tepi.

Tugas

Tugasnya cukup sederhana, tulis program Klein yang ketika dijalankan akan menampilkan topologi yang dijalankan. Angka-angka individual dapat dipisahkan oleh spasi. (misalnya 000dan 0 0 0keduanya keluaran yang diizinkan). Anda dapat memilih untuk menggunakan atau mengabaikan -Aflag baris perintah itu tidak akan dikenakan biaya byte jika Anda menggunakannya.

Ini adalah sehingga jawaban terpendek akan menjadi pemenangnya.

Berikut ini adalah test driver online yang dapat digunakan untuk menguji semua topologi sekaligus. Untuk menjalankan dalam mode integer hapus -A.

Wisaya Gandum
sumber
18
Memberi +1 untuk contoh hebat tantangan khusus bahasa yang bagus. :)
Martin Ender
1
@StephenS Tidak. Saya akan memberikannya secara gratis :)
Wheat Wizard
1
Gerakan IP menyakiti kepala saya
MickyT
2
Silakan perbaiki gambar ...
user202729
1
@JoKing Saya sudah tahu beberapa saat, dan telah bermaksud memperbaikinya. Saya menghapus gambar untuk saat ini dan mudah-mudahan saya akan meluangkan waktu untuk membuat yang baru pada akhirnya. Terima kasih.
Wheat Wizard

Jawaban:

35

52 48 byte

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

Cobalah online!

Driver Penguji

Penjelasan

Di Klein IP dimulai di sudut kiri atas ke kanan. Langkah pertama yang saya ingin program saya lakukan adalah mengirim IP dari bagian atas program untuk menentukan bit pertama dan ketiga. IP akan masuk kembali ke program sebagai berikut tergantung pada topologi:

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

Saya memutuskan bahwa program saya akan merekam bit ketiga dari topologi sebelum bit kedua tetapi menukar mereka (menggunakan $) sebelum akhir. Untuk itu saya menambahkan kode untuk mendorong bit pertama dan ketiga dari setiap topologi pada titik masuk IP yang dijelaskan di atas.

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

Selanjutnya saya fokus pada topologi dengan 1atau 2sebagai bit pertama mereka. Saya memutuskan untuk menggabungkan kembali dan mengirimkannya ke sisi yang tidak terhubung ke sisi utara sehingga saya dapat menentukan bit kedua.

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

Dengan mudah ini mengelompokkan kembali topologi dengan bit kedua mereka sehingga saya bisa mendorongnya ke stack.

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

Setelah itu saya hanya perlu menukar bit kedua dan ketiga dan menghentikan program.

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

Sekarang topologi dengan 1atau 2sebagai bit pertama mereka berfungsi, saya bisa fokus membuat topologi dengan 0memberikan hasil yang benar. Langkah pertama adalah mengkombinasikan mereka sehingga mereka dapat dipisahkan menjadi dua kelompok berdasarkan bit kedua mereka.

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

Saya pertama-tama fokus pada topologi-topologi itu dengan 1bit kedua. Ini menghadirkan tantangan karena bagi mereka IP berada pada jalur yang sudah digunakan oleh topologi 2sebagai bit pertama mereka. Karena akan sulit untuk memasukkan lebih dari satu instruksi pada baris tersebut (satu instruksi dapat dilompati menggunakan !instruksi) dan saya kehabisan ruang secara keseluruhan, saya memutuskan untuk mengarahkan IP dari baris itu dan menggunakan kembali 1instruksi yang ada untuk mendorong bit kedua.

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

Sekarang semua yang tersisa untuk dilakukan untuk topologi dengan 1bit kedua mereka adalah untuk memperbaiki urutan bit kedua dan ketiga dan mengakhiri.

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

Terakhir tetap topologi dengan 0bit kedua mereka. Tidak ada banyak ruang yang tersisa dalam program dengan ruang tidak terpakai terbesar berada di baris atas sehingga di sana saya mengarahkan ulang IP untuk topologi dengan 0bit kedua mereka.

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

Saya masih perlu untuk mendorong 0bit kedua dan memperbaiki urutan bit kedua dan ketiga serta menghentikan program. Untungnya, saya bisa menggunakan kembali $instruksi yang ada sehingga instruksi 0dan @bisa masuk dalam ruang yang tersisa.

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

Akhirnya nops dapat dilucuti dari ujung garis untuk mendapatkan program akhir.

0 '
sumber
15

116 88 86 77 69 61 60 59 58 54 53 50 byte

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

Cobalah online!

Wisaya Gandum
sumber
1
@WheatWizard, bagaimana Anda membuatnya menjadi 0.o dan mungkin Anda harus berpikir tentang membuat jenis visual seperti ETH yang dibuat untuk Cubix
Stephen
@StephenS Jika Anda menjalankan Klein dengan -dbendera itu akan melakukan hal itu. Sayangnya tidak berfungsi di TIO.
Wheat Wizard
15

44 41 40 38 37 byte

\\1.>2
/0./
@./$(\
$>0!>
11$/10
[email protected]

Cobalah online!

Driver uji.

Menggunakan kotak 6 x 6. Terpendek saya bisa dapatkan dengan 8 oleh 8 persegi adalah 38 byte jika ada yang ingin mencoba memperbaikinya.

Penjelasan:

Satu kode pass-through pertama mengkodekan dua angka pertama untuk awalan 0dan 1. Untuk 2, itu mengkodekan angka ketiga lalu yang pertama.

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

Kemudian kami melewati IP melalui tepi ketiga untuk menentukan angka akhir. Kami menggabungkan IP dengan awalan yang sama.

     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

Untuk 0dan 1awalan, keduanya keluar tepi atas untuk menentukan angka ketiga.

     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

Untuk 2awalan, IP keluar sudut dari tepi bawah.

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

Kedua sisi menukar nomor pertama dan ketiga, mendorong nomor kedua dan menukarnya dengan yang ketiga untuk mendapatkan urutan yang benar.

Jo King
sumber