`:_64/"32}
,` (3 :=-{
"`{"; _v2$ ;`3
"`".:@ ; ".5(`3.
< "" `^`;>
Чергова співпраця з @ MartinBüttner і з більш божевільної сторони спектру Лабіринту - вперше у нас є усі четверо ^>v<
в одній програмі.Спробуйте в Інтернеті!
Пояснення
Загальний алгоритм, який працює в циклі, такий:
1. Read a char
2. If EOF:
3. Move all digits from auxiliary stack to main
4. Output all digits on main stack
5. Halt
Otherwise:
6. If char is a letter (c >= 64):
7. If random turns left:
8. Output char XOR 32
Otherwise:
9. Output char
Otherwise:
10. Shift char to auxiliary stack
11. If char is space (c-32 == 0):
12. Pull char back from auxiliary stack
13. Output underscore
Otherwise:
14. Continue loop
Щоб пояснення було компактним, ось приблизно, як кожна частина програми відповідає вищевказаному псевдокоду:
Ось цікаві частини.
Отримання випадковості в Лабіринті
У Лабіринті існує лише один спосіб отримати випадковість, і це коли ІР намагається йти вперед, але 1) немає ні шляху вперед, ні назад і 2) шляхи доступні ліворуч і праворуч. У цьому випадку IP випадковим чином вибирає між лівим і правим маршрутами.
Це можливо лише за допомогою ^>v<
операторів, які спливають n
і зміщують рядок / стовпчик n
на 1. Наприклад, програма ( Спробуйте це в Інтернеті! )
" 1
""v!@
2
!@
виводить або 1, або 2 випадковим чином, оскільки v
зміщує стовпчик зі зміщенням 0 (тобто стовпець, на якому включено IP) на 1, поступаючись
"
""1!@
v
2!@
IP-адреса спрямована вправо і намагається йти вперед (вершина стека дорівнює нулю), але не може. Він також не може рухатись назад, тому вибирає випадковим чином ліворуч або праворуч.
Гольф-хитрощі
Програма починається з першого символу в порядку читання, який ви помітите, це насправді крок 6. Однак, вискакуючи з порожнього стека Лабіринту, виходить 0, тому кроки 10 і 14 відбуваються, переміщуючи нуль у допоміжний стек, що ефективно не-оп.
Основний стек фактично порожній після кожної ітерації, що дозволяє нам розіграти макет коду, використовуючи >
та <
неявні нулі внизу. >
Обертає нижній рядок навколо так , що IP переміщається від нижнього правого кута до нижнього лівого, і <
зрушує рядок назад. Потім IP-адреса радісно рухається вгору по лівій колонці, щоб продовжити цикл.
Цифри в "Лабіринті" поп n
і натискання 10*n + <digit>
. Крім того, символи приймаються за модулем 256 перед виведенням. Якщо скласти ці два разом, ми можемо вивести 95 (підкреслення), виконавши `33
32 (пробіл), що працює -3233 % 256 = 95
. Навіть незважаючи на те, що є інші способи перетворити 32 на 95 ( ;95
що є найпростішим), робота з негативним числом дозволяє нам трохи ущільнити код лівими витками.