Klein Topololyglots


43

Klein to zaprojektowany przeze mnie język 2D, który można osadzić na 12 różnych powierzchniach topologicznych. Program Klein można uruchomić na różnych powierzchniach, zmieniając argumenty wiersza poleceń.

Topologia określa, dokąd idzie wskaźnik instrukcji, gdy wychodzi poza krawędź programu. Podczas oddalania się od krawędzi ip przeskoczy na krawędź o tym samym kolorze i utrzyma swoją pozycję względem strzałki, tzn. Wskaźnik zachowa swoją odległość od główki strzały.

Na przykład topologia 000, topologia używana przez większość języków 2D, powoduje, że wskaźnik instrukcji zawija się na drugą stronę, gdy zsunie się z krawędzi.

Zadanie

Zadanie jest dość proste, napisz program Kleina, który po uruchomieniu wyświetli topologię, w której jest uruchomiony. Poszczególne liczby mogą być oddzielone spacjami. (np. 000i 0 0 0oba są dopuszczalnymi danymi wyjściowymi). Możesz użyć albo zignorować -Aflagę wiersza poleceń, jeśli nie użyjesz bajtów.

To jest więc zwycięzcą będzie najkrótsza odpowiedź.

Oto sterownik testowy online, którego można użyć do przetestowania wszystkich topologii jednocześnie. Aby uruchomić w trybie liczb całkowitych, usuń -A.


18
+1 za świetny przykład dobrego wyzwania konkretnego języka. :)
Martin Ender

1
@StephenS Nie. Dam ci to za darmo :)
Wheat Wizard

1
Ruchy IP ranią mnie w głowę
MickyT

2
Napraw obraz ...
user202729

1
@JoKing Znam od dłuższego czasu i chciałem to naprawić. Na razie usunąłem obraz i mam nadzieję, że w końcu poświęcę trochę czasu, aby zrobić nowy. Dzięki.
Wheat Wizard

Odpowiedzi:


35

52 48 bajtów

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

Wypróbuj online!

Kierowca testowy

Wyjaśnienie

W Klein IP zaczyna się w lewym górnym rogu, w prawo. Pierwszym krokiem, który chciałem, aby mój program zrobił, było wysłanie adresu IP z góry programu w celu ustalenia pierwszego i trzeciego bitu. Adres IP ponownie wprowadziłby program w następujący sposób, w zależności od topologii:

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

Zdecydowałem, że mój program zapisze trzeci bit topologii przed drugim bitem, ale zamieni je (używając $) przed końcem. W tym celu dodałem kod do wypychania pierwszego i trzeciego bitu każdej topologii w punktach wejścia IP opisanych powyżej.

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

Następnie skupiłem się na topologiach z 1lub 2jako ich pierwszym kawałku. Postanowiłem zrekombinować je i odesłać po stronie niepołączonej z stroną północną, abym mógł ustalić ich drugi bit.

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

Dogodnie to przegrupowało topologie według ich drugiego bitu, dzięki czemu mogłem przesunąć to na stos.

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

Potem musiałem tylko zamienić drugi i trzeci bit i zakończyć program.

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

Teraz, gdy topologie z 1lub po uruchomieniu 2ich pierwszego bitu działały, mogłem skupić się na tworzeniu topologii z 0poprawnym wynikiem. Pierwszym krokiem było ich ponowne połączenie, tak aby można je było podzielić na dwie grupy na podstawie drugiego bitu.

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

Najpierw skupiłem się na tych topologiach 1jako drugim fragmencie. Stanowiło to wyzwanie, ponieważ dla nich IP był na linii już używanej przez topologie 2jako pierwszy bit. Ponieważ byłoby trudniej dopasować więcej niż jedną instrukcję w tej linii (pojedynczą instrukcję można przeskoczyć za pomocą !instrukcji) i brakowało mi miejsca jako całości, postanowiłem przekierować adres IP z tej linii i ponownie użyć istniejącej 1instrukcji wcisnąć drugi bit.

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

Teraz jedyne, co pozostało do zrobienia dla topologii, 1ponieważ ich drugim bitem było ustalenie kolejności drugiego i trzeciego bitu i zakończenie.

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

Wreszcie pozostały topologie 0jako ich drugi bit. W programie nie pozostało wiele miejsca, a największe nieużywane miejsce znajduje się w górnym wierszu, więc to właśnie tam przekierowałem adres IP dla topologii z 0ich drugim bitem.

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

Nadal musiałem naciskać 0na drugi bit i naprawić kolejność drugiego i trzeciego bitu, a także zakończyć program. Na szczęście mogłem ponownie wykorzystać istniejącą $instrukcję, aby instrukcje 0i @zmieściły się w pozostałych miejscach.

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

Wreszcie nopsy mogą zostać usunięte z końców linii, aby uzyskać końcowy program.


15

116 88 86 77 69 61 60 59 58 54 53 50 bajtów

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

Wypróbuj online!


1
@WheatWizard, w jaki sposób udało ci się to osiągnąć wtedy 0.o i może powinieneś pomyśleć o stworzeniu wizualnego rodzaju ETH dla Cubix
Stephen

@StephenS Jeśli uruchomisz Kleina z -dflagą, zrobi to dokładnie to samo. Niestety nie działa w TIO.
Wheat Wizard

15

44 41 40 38 37 bajtów

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

Wypróbuj online!

Kierowca testowy.

Wykorzystuje kwadrat 6 na 6. Najkrótszy jaki mogłem uzyskać z kwadratem 8 na 8 to 38 bajtów, jeśli ktoś chce spróbować go poprawić.

Wyjaśnienie:

Jeden pierwszy kod przekazuje pierwsze dwie cyfry dla prefiksów 0i 1. Ponieważ 2koduje trzeci numer, a następnie pierwszy.

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

Następnie przekazujemy adresy IP przez trzecią krawędź, aby ustalić ostateczną liczbę. Łączymy adresy IP z tym samym prefiksem.

     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

W przypadku prefiksów 0i 1obaj wychodzą z górnej krawędzi, aby zdecydować o trzeciej liczbie.

     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

W przypadku 2prefiksu adresy IP wychodzą z rogów od dolnej krawędzi.

     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

Obie krawędzie zamieniają pierwszy i trzeci numer, naciskają drugi numer i zamieniają go z trzecim, aby uzyskać prawidłową kolejność.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.