Спіраль , оцінка: 61921 5127 4715 4655 4191
4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X * X X X X X X X X X X X X X X X X X X X X X X X X X
! > h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T
Перекладача можна знайти тут .
Пояснення:
P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X X
! h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
z y x w V u t s r q p o n m l k j i h g f e d c b a
Програма починається з 0
персонажа на четвертому рядку. Перший фрагмент коду, який запущено, - це 0;vg
. ;
приймає число як вхід і поміщає його в стек. v
поміщає в стек те, що знаходиться в регістрі (нуль). Він буде використовуватися як лічильник. g
є міткою, коли вона досягається, елемент керування переходить до іншої появи букви g
в коді.
Отже, ось де зараз знаходиться контроль:
X
v
g
Оскільки пробіл у всіх інших напрямках є, вказівник інструкції починає рухатися вгору.
v
поміщає нуль у стек і X
негайно вискакує зі стека. Оскільки висказане значення дорівнює нулю, покажчик інструкції рухається до X
(інакше це трактуватиметься як пробіл).
За замовчуванням потік управління знаходиться в режимі повороту вправо, тому тепер, коли він досягне стику, покажчик інструкції повертається праворуч. v
але знову натискає нуль у стек, *
збільшуючи регістр на одиницю.
v*v*v
X
v
g
Наступне v
місце, що знаходиться в реєстрі (номер 1), в стек, вказівник вказівки намагається повернути вправо, натиснувши на наступне X
. Щойно додане значення до стеку вискакується та поміщається в регістр. Оскільки він не є нульовим, X
він не вводиться, і IP *
замість цього переходить до наступного праворуч, знову збільшуючи значення в регістрі.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
Це відбувається знову і знову, поки ми не досягнемо кінця цієї частини і не починається лінія *
s. На сьогодні значення в реєстрі становить 6, що є літерою g
ASCII мінус буквою ASCII a
. Таким чином, з рядком 97 *
s ми збільшуємо значення в регістрі до 103, що відповідає букві, яку g
ми хочемо надрукувати. v
штовхає його в стек, і P
це ще одна мітка при натисканні на яку ми перескакуємо на іншу P
в першому рядку коду.
Тут .
з'являється значення зі стека і друкується як символ. Після цього X
з'являється сторонній нуль зі стека, а потім ~
порівнює два залишкових значення в стеку (значення є лічильником і вхідним значенням). Якщо значення однакові, оператор поміщає нуль у стек (інакше -1 або 1). Знову ж, управління намагається повернути праворуч. X
спливає значення порівняння зі стека, якщо воно дорівнює нулю X
, і після його !
введення закінчує програму.
P.X~ZZ*v+^
X
!
В іншому випадку IP продовжується до Z
знаку, який є міткою, яка в цьому випадку стрибає лише один крок вправо. Причиною цього є те, що стрибки встановлюють значення в регістрі назад до нуля. *
збільшує регістр і v
поміщає отриманий 1 в стек. +
вискакує два верхні елементи стека (1 і лічильник), додає їх і поміщує результат у стек (фактично це збільшує лічильник на один). ^
копіює результат із стека в реєстр, не виймаючи його зі стека.
#
зменшує значення в регістрі на одне, v
виштовхує зменшене значення в стек, IP намагається повернути вправо і X
виводить значення з стека. Якщо значення не дорівнює нулю, IP продовжує рухатися на схід, зменшуючи значення в регістрі, поки воно не досягне нуля, і IP входить у X
гілку.
#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X
h y t f V b n j u r d c m k i e s x l o w a z p q
Гілка веде до мітки, що відповідає значенню лічильника. Після натискання на мітку, елемент керування переходить до іншої появи мітки в розділі, де ми почали з міткою g
, починаючи ще одну ітерацію. Як і у випадку g
, значення в регістрі збільшується до значення ASCII листа, яке нам потрібно надрукувати. Потім символ друкується і лічильник збільшується, вибирається інша мітка. Це відбувається до тих пір, коли після останньої ітерації лічильник не дорівнює вводу, і програма припиниться.
Редагувати:
P.X~Zv+^
X *
! Z
Досягає того ж, що і
P.X~ZZ*v+^
X
!
але з меншим пробілом.
Редагувати 2:
vv****v+^v+^v+^v+^*v++P
Можна використовувати замість:
*****************************************************************vP