Как реализовать Башню Ханоя в 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 полезен в веб-разработке в конце концов!