## Torres gêmeas de Hanoi Lineares

Esta é uma mistura entre os problemas "Split", Intercalado e linear. Temos duas pilhas de discos, em três varas. Devemos trocar a posição das pilhas respeitando as restrições clássicas de movimento (um disco por vez, disco grande não pode ficar sobre disco pequeno) e a restrição do movimento linear (proibido mudança diretamente da vara mais à esquerda para a vara mais à direita).

Você vai usar três funções recursivas:

- moveDouble(k,from, to): move uma pilha intercalada de k pares de discos, sem mudar as posições relativas dos discos de mesmo tamanho. Como no problema de hanoi "Split", uma pilha intercalada alterna discos brancos e pretos de cada tamanho. Esta função não é completamente nova: você escreveu uma versão com 4 varas (mas usando apenas 3 delas) para a primeira versão do problema de hanoi "split".
- gather(k): da situação inicial do caso "separado", constroi na vara #2 uma pilha intercalada de k pares de discos. Você pode parametrizar sua função de forma que ela possa ser usada para obter o disco de qualquer vara passado como parâmetro, mas na prática, sua função vai apenas ser usada para obter na última vara.
- scatter(k): de uma situação onde k pares de discos são intercalados na vara #0, separe eles movendo os discos brancos para a vara #1 e os pretos para a vara #2.

Em `gather()`, a chamada recursiva vem antes das duas chamadas a `moveDouble()` enquanto em `scatter()`, as chamadas para `moveDouble()` vem depois da chamada recursiva. A função principal que você deve escrever não é recursiva, mas simplesmente obtem quase todos os discos, move os discos restantes diretamente, e então espalha ("scatters") de volta os discos menores.

A linearidade naturalmente induz alguma complexidade extra pois você tem que decompor cada movimento entre as varas 0 e 2. Eu ainda estou confiante na sua capacidade de vencer este desafio :)

Observe que foi provado que o algoritmo requerido é ótimo para este problema, então você não precisa "fiddle" a performance desta vez.