:?
:
#/)
\ #
!"*@
"
Спробуйте в Інтернеті!
Це виводить результати в порядку, C, B, Aрозділеному каналами рядків.
Пояснення
Як завжди, короткий лабіринт:
- Лабіринт має два штабеля довільної точності цілих чисел, основний і AUX (iliary), які спочатку заповнені (неявне) нескінченну кількість нулів. Для цієї відповіді ми будемо використовувати лише основне .
- Вихідний код нагадує лабіринт, де вказівник інструкції (IP) слідує за коридорами, коли може (навіть за кутами). Код починається з першого дійсного символу в порядку читання, тобто у верхньому лівому куті в цьому випадку. Коли IP доходить до будь-якої форми з'єднання (тобто декількох суміжних комірок на додаток до тієї, з якої він увійшов), він вибере напрямок на основі верхньої частини основного стеку. Основні правила: поверніть ліворуч при негативі, продовжуйте рухатись вперед, коли нуль, поверніть праворуч, коли позитивно. І коли одне з них неможливо, тому що є стіна, то IP буде приймати протилежний бік. ІС також обертається, коли потрапляє в тупики.
Незважаючи на два відсутність ( "), які роблять макет дещо марнотратним, я цілком задоволений цим рішенням, оскільки його контрольний потік насправді досить тонкий.
IP починається у верхньому лівому куті :справа. Він негайно потрапить у тупик на ?і повернеться, так що програма насправді починається з цього лінійного фрагмента коду:
: Duplicate top of main stack. This will duplicate one of the implicit zeros
at the bottom. While this may seem like a no-op it actually increases
the stack depth to 1, because the duplicated zero is *explicit*.
? Read n and push it onto main.
: Duplicate.
: Duplicate.
Це означає, що зараз у нас є три екземпляри nна головному стеку, але його глибина 4. Це зручно, оскільки це означає, що ми можемо на глибину стека отримати поточний множник під час роботи над копіями вводу.
Тепер IP входить у петлю 3х3 (за годинниковою стрілкою). Зауважте, що #, що висуває глибину стека, завжди буде висуватися позитивне значення таким чином, що ми знаємо, що IP буде завжди повертати на схід у цій точці.
Тіло циклу таке:
# Push the stack depth, i.e. the current multiplier k.
/ Compute n / k (rounding down).
) Increment.
# Push the stack depth again (this is still k).
* Multiply. So we've now computed (n/k+1)*k, which is the number
we're looking for. Note that this number is always positive so
we're guaranteed that the IP turns west to continue the loop.
" No-op.
! Print result. If we've still got copies of n left, the top of the
stack is positive, so the IP turns north and does another round.
Otherwise, see below...
\ Print a linefeed.
Then we enter the next loop iteration.
Після того, як цикл пройшов (до !) три рази, всі копії nвикористовуються і виявляється нуль під ним. Через "нижню частину (яка інакше здається досить марною) ця позиція є стиком. Це означає, що з нулем на вершині стека, IP намагається йти прямо вперед (на захід), але, оскільки там є стіна, вона насправді робить поворот на 180 градусів і рухається назад на схід, ніби потрапила в глухий кут.
Як результат, зараз виконується наступний біт:
" No-op.
* Multiply two zeros on top of the stack, i.e. also a no-op.
The top of the stack is now still zero, so the IP keeps moving east.
@ Terminate the program.
C B A), якщо це чітко визначено у відповіді?