Klein Topololyglots


43

Klein , 12 farklı topolojik yüzeye gömülebilen bir 2D dili. Bir Klein programı, komut satırı argümanlarını değiştirerek farklı yüzeylerde çalıştırılabilir.

Topoloji, programın kenarından çıktığında komut göstergesinin nereye gideceğini belirler. Kenardan uzaklaşırken ip, eşleşen rengiyle bir kenara atlayacaktır ve oka göre konumunu koruyacaktır, yani işaretçi ok başından mesafesini koruyacaktır.

Örneğin 000, çoğu 2D dilinin kullandığı topoloji olan topoloji, kenardan hareket ederse komut göstergesinin diğer tarafa sarılmasına neden olur.

Görev

Görev oldukça basittir; çalıştırıldığında çalıştırıldığı topolojinin çıktısını alacağı bir Klein programı yazın. Bireysel sayılar boşluklarla ayrılabilir. (örneğin 000ve 0 0 0her ikisi de izin verilen çıktıdır). -AKomut satırı bayrağını kullanmayı veya görmezden gelmeyi seçebilirsiniz, eğer kullanırsanız bayt mal olmaz.

Bu yani en kısa cevap kazanacak.

Burada tek seferde topolojilerinin tüm sınamak için kullanılabilecek bir çevrimiçi test pilotu. Tamsayı modunda çalıştırmak için -A.


18
Dile özgü iyi bir mücadeleye harika bir örnek için +1. :)
Martin Ender

1
@StephenS Hayır. Size bedavaya vereceğim :)
Buğday Sihirbazı

1
IP hareketleri başımı
ağrıtıyor

2
Lütfen resmi düzeltin ...
user202729

1
@JoKing Bir süredir tanıyorum ve düzeltmek istediğim bir şeydi. Şimdilik görüntüyü kaldırdım ve umarım sonunda yeni bir tane oluşturmak için zaman ayıracağım. Teşekkürler.
Buğday Sihirbazı,

Yanıtlar:


35

52 48 bayt

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

Çevrimiçi deneyin!

Test Sürücüsü

açıklama

Klein'da IP sol üst köşeden başlayarak sağa doğru ilerliyor. Programımın yapmasını istediğim ilk adım, ilk ve üçüncü bitleri belirlemek için IP'yi programın üst kısmından göndermek oldu. IP, topolojiye bağlı olarak programı aşağıdaki şekilde yeniden girecektir:

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

Programımın, ikinci bitten önce topolojinin üçüncü bitini kaydetmesine karar verdim, ancak $sonundan önce bunları kullanarak değiştirdim . Bu amaçla, her topolojinin birinci ve üçüncü bitlerini IP'nin yukarıda açıklanan giriş noktalarına itmesi için kod ekledim.

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

Daha sonra , ilk bitle 1veya 2ilk topoğrafya olarak topolojilere odaklandım . Onları yeniden birleştirmeye ve kuzey tarafına bağlı olmayan tarafa göndermeye karar verdim, böylece ikinci bitlerini belirleyebildim.

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

Bu, topolojileri ikinci bitleriyle yeniden birleştirdi, böylece onu yığına itebildim.

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

Ondan sonra sadece ikinci ve üçüncü bitleri değiştirmem ve programın sonlandırılması gerekiyordu.

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

Şimdi, ilk biti ile 1ya 2da ilk biti olarak topolojiler işe yaradığında, topolojileri 0doğru çıktılarla vermeye odaklanabiliyorum . İlk adım, ikinci bitlerine göre iki gruba ayrılabilmeleri için onları yeniden birleştirmekti.

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

İlk önce bu topolojilere 1ikinci biti olarak odaklandım . Bunlar bir zorluk sundu çünkü onlar için IP, topolojiler tarafından zaten 2ilk biti olarak kullanılan bir çizgideydi . Bu hatta birden fazla talimatın yerleştirilmesi zor olacağından (talimat kullanılarak tek bir komut atlanabilir !) ve bir bütün olarak alan üzerinde azalıyordum, IP'yi bu satırdan yönlendirmeye ve mevcut bir 1talimatı yeniden kullanmaya karar verdim ikinci biti itmek için.

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

Şimdi topolojiler 1için ikinci biti ile kalan tek şey ikinci ve üçüncü biti sırasını düzeltmek ve sonlandırmaktı.

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

Son 0olarak, ikinci bit olarak topolojiler kaldı . Programda çok fazla alan kalmadı ve en büyük kullanılmayan alan üst satırdaydı, bu yüzden de topolojiler için IP'yi 0ikinci bitleri ile birlikte yönlendirdim .

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

0İkinci biti zorlamaya ve ikinci ve üçüncü biti sırasını düzeltmeye ve programı sonlandırmaya ihtiyacım vardı. Neyse ki varolan yeniden başardı $böylece talimat 0ve @yönergeler kalan alanlarda sığabilir.

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

Son olarak, uçlar, son programı elde etmek için çizgilerin uçlarından sıyrılabilir.



15

44 41 40 38 37 bayt

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

Çevrimiçi deneyin!

Test sürücüsü.

6'ya 6 kare kullanır. 8 x 8 kareyle alabileceğim en kısa süre, biri geliştirmeyi denemek isterse 38 byte .

Açıklama:

İlk geçiş kodundan biri önekler için ilk iki sayıyı kodlar 0ve 1. Çünkü 2, üçüncü sayıyı ilk önce kodlar.

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

Sonra son sayıya karar vermek için IP'leri üçüncü kenardan geçiririz. IP'leri aynı önekle birleştiririz.

     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

İçin 0ve 1önekleri, ikisi de üçüncü numarayı karar üst kenarına çıkıyor.

     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

İçin 2önek, IP'ler alt kenarından köşeleri çıkıyor.

     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

Her iki kenar da birinci ve üçüncü numarayı değiştirir, ikinci numaraya basar ve doğru sırayı almak için üçüncü ile değiştirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.