:?
:
#/)
\ #
!"*@
"
Спробуйте в Інтернеті!
Це виводить результати в порядку, 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
), якщо це чітко визначено у відповіді?