Кляйн Топололиглотс


43

Klein - это двумерный язык, который я разработал, который может быть встроен в 12 различных топологических поверхностей. Программу Klein можно запустить на разных поверхностях, изменив аргументы командной строки.

Топология определяет, куда направляется указатель инструкции, когда он выходит за пределы программы. При удалении от края ip будет переходить на край с соответствующим цветом и сохранит свое положение относительно стрелки, т.е. указатель сохранит свое расстояние от наконечника стрелки.

Например, топология 000, топология, используемая большинством двумерных языков, заставляет указатель инструкции переходить на другую сторону, если он перемещается за край.

задача

Задача довольно простая, напишите программу Klein, которая при запуске выдаст топологию, в которой она выполняется. Отдельные числа могут быть разделены пробелами. (например, 000и 0 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@

Попробуйте онлайн!

Тестовый водитель

объяснение

В Кляйне IP начинается в левом верхнем углу и идет вправо. Первым шагом, который я хотел, чтобы моя программа сделала, было отправить IP с верха программы, чтобы определить первый и третий бит. IP будет повторно вводить программу следующим образом в зависимости от топологии:

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

Я решил, что моя программа будет записывать третий бит топологии перед вторым битом, но поменять их местами (используя $) до конца. С этой целью я добавил код для вставки первого и третьего битов каждой топологии в точки входа IP, описанные выше.

./.....
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

Удобно, что это перегруппировало топологии по их второму биту, чтобы я мог перенести это в стек.

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

После этого мне просто нужно было поменять местами второй и третий бит и завершить программу.

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

Теперь, когда топологии с 1или 2как первый бит сработали, я мог бы сосредоточиться на создании топологий с 0правильным выводом. Первым шагом было их объединение, чтобы они могли быть разделены на две группы на основе их второго бита.

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

Сначала я сосредоточился на этих топологиях со 1вторым битом. Они представляли проблему, потому что для них IP был на линии, уже используемой топологиями в 2качестве их первого бита. Поскольку было бы сложно разместить более одной инструкции в этой строке (с помощью этой инструкции можно перебросить одну инструкцию !), и у меня не хватило места в целом, я решил перенаправить IP с этой строки и повторно использовать существующую 1инструкцию подтолкнуть второй бит.

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

Теперь все, что осталось сделать для топологий со 1вторым битом, это зафиксировать порядок второго и третьего бита и завершиться.

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

Наконец остались топологии с 0их вторым битом. В программе осталось не так много места, так как наибольшее неиспользуемое пространство находится в верхней строке, поэтому именно там я перенаправил IP для топологий со 0вторым битом.

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

Мне все еще нужно было нажать 0на второй бит и исправить порядок второго и третьего бита, а также завершить программу. К счастью, я был в состоянии повторно использовать существующую $инструкцию так 0и @инструкции могли поместиться в остальных помещениях.

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

В конце концов, шкурки могут быть удалены с концов строк, чтобы получить окончательную программу.


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
@WheatWizard, как ты сделал это тогда 0.o, и, возможно, тебе стоит подумать о создании визуального вида ETH, созданного для Cubix
Стивен

@StephenS Если вы запустите Klein с -dфлагом, он сделает именно это. К сожалению, это не работает в TIO.
Пшеничный волшебник

15

44 41 40 38 37 байт

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

Попробуйте онлайн!

Тестовый водитель.

Использует 6 на 6 кв. Самое короткое, что я мог бы получить с квадратом 8 на 8, это 38 байт, если кто-то хочет попробовать улучшить его.

Объяснение:

Один первый проходной код кодирует первые два числа для префиксов 0и 1. Ведь 2он кодирует третье число, а затем первое.

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

Затем мы передаем IP-адреса через третий край, чтобы определить окончательное число. Мы объединяем 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

Для 0и 1префиксами, они оба выходят за верхний край , чтобы решить , третий номер.

     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

Оба ребра меняют местами первое и третье число, нажимают второе и меняют местами третье, чтобы получить правильный порядок.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.