Необходимая формула: Сортировать массив в массив - "snaked" - PullRequest
2 голосов
/ 17 марта 2010

После того, как вы, ребята, так изящно помогли мне в прошлый раз, вот еще один хитрый сортировщик массивов для вас.

У меня есть следующий массив:

a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

Я использую это для некоторых визуальных вещей и визуализирую это так:

1   2  3  4

5   6  7  8

9  10 11 12

13 14 15 16

Теперь я хочу отсортировать массив, чтобы потом иметь «змею»:

// rearrange the array according to this schema
1   2  3 4

12 13 14 5

11 16 15 6

10  9  8 7

// the original array should look like this
a = [1,2,3,4,12,13,14,5,11,16,15,6,10,9,8,7]

Теперь я ищу умную формулу / умный цикл, чтобы сделать это

ticker = 0;
rows = 4; // can be n
cols = 4; // can be n
originalArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
newArray = [];

while(ticker &#60 originalArray.length)
{
    //do the magic here
    ticker++;
}

Еще раз спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Мне было скучно, поэтому я сделал для вас версию на Python с 9 строками кода внутри цикла.

ticker = 0
rows = 4
cols = 4
originalArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
newArray = [None] * (rows * cols)
row = 0
col = 0
dir_x = 1
dir_y = 0
taken = {}

while (ticker < len(originalArray)):
    newArray[row * cols + col] = originalArray[ticker]
    taken[row * cols + col] = True

    if col + dir_x >= cols or row + dir_y >= rows or col + dir_x < 0:
        dir_x, dir_y = -dir_y, dir_x
    elif ((row + dir_y) * cols + col + dir_x) in taken:
        dir_x, dir_y = -dir_y, dir_x

    row += dir_y
    col += dir_x    
    ticker += 1

print newArray
0 голосов
/ 18 марта 2010

Вы можете напрямую войти в змеиную катушку, если вы помните, что

1 + 2 + 3 + ... + n = n*(n+1)/2
m^2 + m - k = 0  =>  m - (-1+sqrt(1+4*k))/2

и посмотрите на рисунок катушек. (Я пока оставлю это как подсказку - вы также можете использовать это n^2 = (n-1)^2 + (2*n+1) с обратным индексированием или множеством других вещей для решения проблемы.)

При переводе в код это не намного короче, чем решение Туомаса, если все, что вам нужно, это заполнить матрицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...