Клейн Топололіглот


43

Klein - це 2D мова, яку я розробив, і яку можна вбудувати на 12 різних топологічних поверхнях. Програму Klein можна запускати на різних поверхнях, змінюючи аргументи командного рядка.

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

Наприклад, топологія 000, що використовується більшістю 2D-мов, призводить до того, що вказівник інструкції перегортається на іншу сторону, якщо вона рухається від краю.

Завдання

Завдання досить проста: написати програму Klein, яка при запуску видасть топологію, в якій вона запускається. Окремі числа можуть бути розділені пробілами. (наприклад, 000і 0 0 0обидва допустимі результати). Ви можете вибрати або використовувати або проігнорувати -Aпрапор командного рядка, якщо він не буде коштувати вам байтів.

Це тому найкоротша відповідь буде переможцем.

Ось онлайн тест-драйвер, за допомогою якого можна протестувати всі топології одразу. Щоб запустити в цілому режимі, видаліть -A.


18
+1 - чудовий приклад хорошого мовного завдання. :)
Мартін Ендер

1
@StephenS Ні. Я дам його безкоштовно :)
Пшеничний майстер

1
Рухи ІР
болять

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
Stephen

@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-адреси з тим самим префіксом.

     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.