Как реализовать Башню Ханоя в AEM Sightly
Я пытаюсь реализовать решение рекурсивного алгоритма Tower of Hanoi
проблема в зрении. Я знаю, что этот подход может не иметь много очевидных
практических приложений, я рассматриваю его как загадку. Я в конечном итоге что-то
например:
<sly data-sly-template.step="${@ n, src, aux, dst}" data-sly-unwrap>
<sly data-sly-test="${n > 0}" data-sly-unwrap>
<sly data-sly-call="${step @ n = (n-1), src = src, aux = dst, dst = aux}" data-sly-unwrap/>
${src} -> ${dst}<br/>
<sly data-sly-call="${step @ n = (n-1), src = aux, aux = src, dst = dst}" data-sly-unwrap/>
</sly>
</sly>
<sly data-sly-call="${step @ n = 3, src = 'A', aux = 'B', dst = 'C'}" data-sly-unwrap/>
Однако он не компилируется, поскольку Sightly не поддерживает арифметику
операторы типа -
. Мне не нужно считать от 3 до 0, мы можем сделать это
напротив, так как направление здесь не имеет значения. Мне просто нужно немного
вид счетчика со следующими характеристиками:
- мы можем увеличивать или уменьшать его,
- мы можем проверить, равен ли он нулю или некоторому постоянному числу.
Я думал об использовании строки. Пустая строка будет равна нулю, 'x' будет
1, 'xx' будет 2 и так далее. Мы можем проверить, соответствует ли строка
число (n == 'xxxx'
). Мы можем даже увеличить его, используя Sightly string
форматировщик:
${'x{0}' @ format = [n]}
Однако указанное выше выражение не может использоваться как параметр в
data-sly-call
или в data-sly-test
. Мы можем отображать его только
немедленно и без дальнейшей обработки.
Есть ли у вас какая-либо другая идея, есть ли какой-нибудь счетчик, который я могу использовать?
Ответы
Ответ 1
Использовать пустые вложенные массивы: []
равно 0, [[]]
равно 1, [[[]]]
равно 2 и т.д.
Если n
- число, то:
-
n[0]
уменьшает его (поскольку мы получаем внутренний массив),
-
[n]
увеличивает его (по мере того как мы завершаем n
новым массивом),
-
data-sly-test
будет принимать все n > 0 (по крайней мере, две открывающие скобки).
Рабочий код для n = 3 будет выглядеть так:
<sly data-sly-template.step="${@ n, src, aux, dst}" data-sly-unwrap>
<sly data-sly-test="${n}" data-sly-unwrap>
<sly data-sly-call="${step @ n = n[0], src = src, aux = dst, dst = aux}" data-sly-unwrap/>
${src} -> ${dst}<br/>
<sly data-sly-call="${step @ n = n[0], src = aux, aux = src, dst = dst}" data-sly-unwrap/>
</sly>
</sly>
<sly data-sly-call="${step @ n = [[[[]]]], src = 'A', aux = 'B', dst = 'C'}" data-sly-unwrap/>
Интересно, что такое построение целых чисел очень похоже на теоретическое определение натуральных чисел . Похоже, что Maths полезен в веб-разработке в конце концов!