42 FreeBASIC. Квадратная спираль
Вспомнил одну задачу с первого курса. В ней текст длиной 121 символ нужно было вписат в квадрат размером 11х11. Таким образом зашифровать.
Решив, а потом дома изрядно поколдовав на компе из 80х я сделал решение очень красивым, но в памяти от него остался лишь след. Попробую заново его изобрести))
Давайте сначала нарисуем квадратную спираль,
это практически то же самое, но более наглядно. А потом уже решим задачу упомянутую выше.
Нарисовав её на листике уже можно найти закономерность: одну вправо, потом вниз, две влево потом вверх, три снова вправо и вниз, четыре и т.д.
1 - напрвление меняется по кругу, через 4 шага
2 - длина увеличивается через два шага
Осталось переложить это на FreeBASIC
ScreenRes 800,600
Центр экрана получается 400,300. Длина линии пусть будет 10
Рисуем вправо - line(400, 300)-(410, 300)
Теперь вниз - line -(410, 310)
если первую точку не указываем - рисует от последней поставленной точки.
Теперь шаг нужно увеличить - не 10, а 20
Возвращаемся влево - line -(390, 310)
и вверх line -(390, 290)
Снова увеличиваем темп - шаг=30
Вправо line -(390+30, 290)
вниз -line -(390+30, 290+30)
В последних строкам мне было лень считать - пусть считает компьютер))
Но что это за решение? Двоечника? Троечника? Так до вечера можно спираль рисовать)))
Оператор line
ведь может рисовать не только в абсолютных координатах рисовать(от левого верхнего угла экрана), но и в относительных - относительно последней поставленной точки.
ставим точку pset (400,300)
Рисуем вправо - line -STEP (10, 0)
Теперь вниз - line -STEP (0, 10)
Теперь шаг нужно увеличить - не 10, а 20
Возвращаемся влево - line -(-20, 0)
и вверх line -(0, -20)
Снова увеличиваем темп - шаг=30
Вправо line -STEP (30, 0)
вниз -line -STEP (0, 30)
Возвращаемся влево - line -STEP (-40, 0)
и вверх line -STEP (0, -40)
и т.д. уже штамповать(клонировать строки кода) легче, но до 500 копипастить ещё много
А такое решение уже тройка? четвёрка?
Ну как же без цикла?
line -STEP (i, 0)
line -STEP (0, i)
line -STEP (-(i+10), 0)
line -STEP (0, -(i+10))
next i
Отлично!?
Так результат тот же, но это я бы уже назвал - отлично))
screenres 800,600
dim i as integer
const k as integer=10
pset (400,300)
for i=k to 500 step 2*k
line -STEP (i, 0)
line -STEP (0, i)
line -STEP (-(i+k), 0)
line -STEP (0, -(i+k))
next i
sleep
Но я бы ещё намудрил в цикле - чтоб один line
был)) вместо четырёх...