Pull to refresh

Змейка здорового человека

Reading time1 min
Views3.7K

Если вы, как и я, устрашились фундаментального двухчастного трактата коллеги@Orazbek_B, возможно вас заинтересует это крохотное эссе. Сперва – код на питоне:

n, m = 5, 8  # высота и ширина матрицы

def draw(title, f):
    print(f"\n{title:-^{m * 3 - 1}}")
    res = [""] * (n * m)
    for i, j in enumerate(sorted(range(n * m), key=lambda i: f(i // m, i % m))):
        res[j] = f"{i:>02}"
    for i in range(0, n * m, m):
        print(*res[i:i + m])

draw("horizontal", lambda y, x: (y, -x if y % 2 else x))
draw("diagonal"  , lambda y, x: (y + x, x if (y + x) % 2 else -x))

Результатом выполнения этого кода будут две аккуратные змейки:

------horizontal-------

00 01 02 03 04 05 06 07

15 14 13 12 11 10 09 08

16 17 18 19 20 21 22 23

31 30 29 28 27 26 25 24

32 33 34 35 36 37 38 39

-------diagonal--------

00 02 03 09 10 19 20 29

01 04 08 11 18 21 28 30

05 07 12 17 22 27 31 36

06 13 16 23 26 32 35 37

14 15 24 25 33 34 38 39


В алгоритме ничего сложного: каждой его ячейке ставим в соответствие такой ключ, чтобы, будучи отсортированы по ключам, ячейки заполнялись бы в нужном порядке.

Наши матрицы не злобные, они мягкие и пушистые. Бонус: они не обязательно квадратные. Можно отрисовать и спиральку, хоть прямоугольную, хоть ромбическую, хоть округлую, можно залить не прямоугольник, а фигуру произвольной формы – было бы желание.

Извинити, что так коротенько: о чём говорить, когда говорить не о чем 😀

Tags:
Hubs:
Total votes 18: ↑7 and ↓11-4
Comments7

Articles