Klein - это двумерный язык, который я разработал, который может быть встроен в 12 различных топологических поверхностей. Программу Klein можно запустить на разных поверхностях, изменив аргументы командной строки.
Топология определяет, куда направляется указатель инструкции, когда он выходит за пределы программы. При удалении от края ip будет переходить на край с соответствующим цветом и сохранит свое положение относительно стрелки, т.е. указатель сохранит свое расстояние от наконечника стрелки.
Например, топология 000
, топология, используемая большинством двумерных языков, заставляет указатель инструкции переходить на другую сторону, если он перемещается за край.
задача
Задача довольно простая, напишите программу Klein, которая при запуске выдаст топологию, в которой она выполняется. Отдельные числа могут быть разделены пробелами. (например, 000
и 0 0 0
оба допустимых выхода). Вы можете либо использовать, либо игнорировать -A
флаг командной строки, он не будет стоить вам байтов, если вы его используете.
Это код-гольф, поэтому самый короткий ответ будет победителем.
Вот онлайн-тестовый драйвер, который можно использовать для тестирования всех топологий одновременно. Для запуска в целочисленном режиме удалите -A
.
Ответы:
5248 байтовПопробуйте онлайн!
Тестовый водитель
объяснение
В Кляйне IP начинается в левом верхнем углу и идет вправо. Первым шагом, который я хотел, чтобы моя программа сделала, было отправить IP с верха программы, чтобы определить первый и третий бит. IP будет повторно вводить программу следующим образом в зависимости от топологии:
Я решил, что моя программа будет записывать третий бит топологии перед вторым битом, но поменять их местами (используя
$
) до конца. С этой целью я добавил код для вставки первого и третьего битов каждой топологии в точки входа IP, описанные выше.Затем я сосредоточился на топологиях с
1
или2
как их первый бит. Я решил объединить их и отправить их на сторону, не связанную с северной стороной, чтобы я мог определить их второй бит.Удобно, что это перегруппировало топологии по их второму биту, чтобы я мог перенести это в стек.
После этого мне просто нужно было поменять местами второй и третий бит и завершить программу.
Теперь, когда топологии с
1
или2
как первый бит сработали, я мог бы сосредоточиться на создании топологий с0
правильным выводом. Первым шагом было их объединение, чтобы они могли быть разделены на две группы на основе их второго бита.Сначала я сосредоточился на этих топологиях со
1
вторым битом. Они представляли проблему, потому что для них IP был на линии, уже используемой топологиями в2
качестве их первого бита. Поскольку было бы сложно разместить более одной инструкции в этой строке (с помощью этой инструкции можно перебросить одну инструкцию!
), и у меня не хватило места в целом, я решил перенаправить IP с этой строки и повторно использовать существующую1
инструкцию подтолкнуть второй бит.Теперь все, что осталось сделать для топологий со
1
вторым битом, это зафиксировать порядок второго и третьего бита и завершиться.Наконец остались топологии с
0
их вторым битом. В программе осталось не так много места, так как наибольшее неиспользуемое пространство находится в верхней строке, поэтому именно там я перенаправил IP для топологий со0
вторым битом.Мне все еще нужно было нажать
0
на второй бит и исправить порядок второго и третьего бита, а также завершить программу. К счастью, я был в состоянии повторно использовать существующую$
инструкцию так0
и@
инструкции могли поместиться в остальных помещениях.В конце концов, шкурки могут быть удалены с концов строк, чтобы получить окончательную программу.
источник
1168886776961605958545350 байтовПопробуйте онлайн!
источник
-d
флагом, он сделает именно это. К сожалению, это не работает в TIO.44 41 40 3837 байтПопробуйте онлайн!
Тестовый водитель.
Использует 6 на 6 кв. Самое короткое, что я мог бы получить с квадратом 8 на 8, это 38 байт, если кто-то хочет попробовать улучшить его.
Объяснение:
Один первый проходной код кодирует первые два числа для префиксов
0
и1
. Ведь2
он кодирует третье число, а затем первое.Затем мы передаем IP-адреса через третий край, чтобы определить окончательное число. Мы объединяем IP-адреса с одинаковым префиксом.
Для
0
и1
префиксами, они оба выходят за верхний край , чтобы решить , третий номер.Для
2
префикса IP выходят из углов от нижнего края.Оба ребра меняют местами первое и третье число, нажимают второе и меняют местами третье, чтобы получить правильный порядок.
источник