Алгоритмика плетения из резинок. Глава 3

начало http://www.proza.ru/2015/07/31/1688
назад http://www.proza.ru/2015/08/01/1391

Опишем алгоритм плетения браслета Лестница http://www.youtube.com/watch?v=kGFu7i9EHH4
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1,2),ст(1,3))
3.н(р2,ст(1,1),ст(2,1))
4.н(р2,ст(1,3),ст(2,3))
5.н(р3,ст(2,1),ст(3,1))
6.н(р3,ст(2,3),ст(3,3))
Теперь, когда увиделось повторение (в последовательности 3-6), попробуем записать его более компактно.
Вот так оно запишется:
Повт(н(р(и),ст(и,[1,3]),ст(и+1,[1,3]),и=1..2)
(здесь новым является то, что внутри цикла существует конструкция изменения, а именно [1,3]). И она обозначает, что значение номера столбца столбиков (как отправления, так и назначения) меняется периодически в ряду 1,3.
А также меняется, в процессе прохода цикла и номер цвета резинки. И здесь добавлю: если патронташ цветов резинок (в процессе выполнения цикла) исчерпан, то начинается (по умолчанию. То есть не предусмотрено иных решений. О которых должно быть сообщено в явном виде.) новый его, патронташа цветов, проход)

Перепишем алгоритм:
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1,2),ст(1,3))
3.повт(н(р(и),ст(и,[1,3]),ст(и+1,[1,3]),и=1..2)
4.н(р1,ст(12,1),ст(13,2)
5.н(р1,ст(13,2),ст(12,3))
6.н(р3,ст(2,1),ст(2,3))
7.н(р4,ст(3,1),ст(3,3))

Х.н(р(п-1),ст(11,1),ст(11,3))

Не правда ли, шаги 6,7-Х можно заменить на:
Повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)

Тогда перепишем алгоритм:
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1,2),ст(1,3))
3.повт(н(р(и),ст(и,[1,3]),ст(и+1,[1,3]),и=1..2)
4.н(р1,ст(12,1),ст(13,2)
5.н(р1,ст(13,2),ст(12,3))
6. Повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)
(данный браслет, оказывается, можно плести и на рогатке. Но ссылку пока не нашёл)
И продолжим его:
7.н(р0,ст(1,2),ст(2,2) (р0 – это цвет скелета, поэтому особый номер)(А3-)
8.н(р0,ст(2,2),ст(3,2)

Х. н(р0,ст(12,2),ст(13,2)
А покороче (7-Х)) так:
Повт(н(р0,ст(и,2),ст(и+1,2),и=1..12)

Переписываем алгоритм:
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1,2),ст(1,3))
3.повт(н(р(и),ст(и,[1,3]),ст(и+1,[1,3]),и=1..2)
4.н(р1,ст(12,1),ст(13,2)
5.н(р1,ст(13,2),ст(12,3))
6.Повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)
7.Повт(н(р0,ст(и,2),ст(и+1,2),и=1..12)
8.н(р0,ст(13,2;в(пр),ст(13,2))
9.м(п(п),ст(13,2),под(),ст(12.2))
10.м(п(п),ст(12,2),под(),ст(11,2))

Х.м(п(п),ст(2,2),под(),ст(1,2))
Отсюда сокращение, для шагов 9,10-Х:
Повт(м(п(п),ст(и,2),под(),ст(и-1,2)),и=12..2)
С учётом этого сокращения:
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1,2),ст(1,3))
3.повт(н(р(и),ст(и,[1,3]),ст(и+1,[1,3]),и=1..2)
4.н(р1,ст(12,1),ст(13,2)
5.н(р1,ст(13,2),ст(12,3))
6.Повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)
7.Повт(н(р0,ст(и,2),ст(и+1,2),и=1..12)
8.н(р0,ст(13,2;в(пр),ст(13,2))
9.повт(м(п(п),ст(и,2),под(),ст(и-1,2)),и=12..2)
2.08
10.Повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)
11.м(п(п),ст(13,2),под(),ст(12,3)
12.м(п(п),ст(13,2),под(),ст(12,1)
В одной записи шаги 11,12 запишутся так: м(п(п),ст(13,2),под(),ст(12,[3,1])
13.м(п(п),ст(12,3),под(),ст(11,3))
14.м(п(п),ст(11,3),под(),ст(10,3))

Х.м(п(п),ст(2,3),под(),ст(1,3))
Последовательность шагов 1,2-Х более компактно запшется так:
Повт(м(п(п),ст(и,3),под(),ст(и-1,3)),и=12-1..2)

Перепишем алгоритм заново с учётом сокращений:
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1,2),ст(1,3))
3.повт(н(р(и),ст(и,[1,3]),ст(и+1,[1,3]),и=1..2)
4.н(р1,ст(12,1),ст(13,2)
5.н(р1,ст(13,2),ст(12,3))
6.повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)
7.повт(н(р0,ст(и,2),ст(и+1,2),и=1..12)
8.н(р0,ст(13,2;в(пр),ст(13,2))
9.повт(м(п(п),ст(и,2),под(),ст(и-1,2)),и=12..2)
10.повт(н(р(и+1),ст(и,1),ст(и,3),и=2..11)
11.м(п(п),ст(13,2),под(),ст(12,[3,1])
12.повт(м(п(п),ст(и,3),под(),ст(и-1,3)),и=12-1..2)
 
И продолжим его описание:
13.м(п(п),ст(1,3),под(),ст(1,2))
14.повт(м(п(п),ст(и,1),под(),ст(и-1,1)),и=12-1..2)
15.м(п(п),ст(1,1),под(),ст(1,2))
16.н(р1,кр,ст(д))
17.из(кр, ст(1,2))
18.н(р(кр),ст(д))
19.ц(з,п(), ст(д
20.с(з,ст(д))
21.повт(с(п(),ст(и,к)), и=1..12, к=[1,3,2])
22.ц(з,у0,ст(1,2))
23.с(у0, ст(1,2))
Всё, изделие готово!
Обратите внимание: шаги 16-23 в точности соответствуют тем же шагам в алгоритме плетения браслета "звёздочка" (предыдущего изделия)

Опишем обещанный выше алгоритм плетения браслета Чешуя дракона http://www.youtube.com/watch?v=uLNGCtvUePg
(Поскольку браслет плетётся на 1-ом ряду станка, то указывать индекс ряда столбика не будем)
1.н(р1,ст(3),в(по),ст(4))
2.н(р1,ст(5),в(по),ст(6))

Х.н(р1,ст(9),в(по),ст(10))
Кратко шаги (1-Х) запишутся так:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)

Продолжаем описание:
2.н(р2,ст(4),в(по),ст(5))
3.н(р2,ст(6),в(по),ст(7))

Х.н(р2,ст(10),в(по),ст(11))
Кратко шаги (2-Х) запишутся так:
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)

В итоге получаем такое описание алгоритма:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)

Продолжаем:
3.м(п(п),ст(4),л,ст(4)) (новая операция: снять резинку в последней позиции на столбике 4 справа и надеть на столбик 4 слева.
Напоминаю: слева - это то направление, которое получается, когда мы идём против возрастания номера ряда. Справа, соответственно, когда по возрастанию.
Еще одно замечание: если бы в шагах 1 2 мы совершили поворот в(пр), то в текущем шаге (при применении сброса резинки справа налево) у нас получился бы неправильный результат. (у меня, когда я выполнял алгоритм, так оно и вышло. Потому что ошибся в направлении поворота.)  А, чтобы получился правильный, нужно применять сброс слева направо.
Это - пример зависимости результата от предыдущего шага.)
4.м(п(п),ст(5),л,ст(5))

Х.м(п(п),ст(10),л,ст(10))
Кратко шаги 3-Х запишутся так:
3.повт(м(п(п),ст(и),л,ст(и)),и=4..10)

В итоге получаем такое описание алгоритма:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..10)

Продолжаем:
4.н(р3,ст3,ст4)
5.н(р3,ст5,ст6)

Х.н(р3,ст9,ст10)
Кратко шаги 4-Х запишутся так:
4.повт(н(р3,ст(и),ст(и+1)),и=3+2..9)

В итоге получаем такое описание алгоритма:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..10)
4.повт(н(р3,ст(и),ст(и+1)),и=3+2..9)

Продолжаем:
5.м(п(п),ст3,л,ст3)
6.м(п(п),ст4,л,ст4)

Х. м(п(п),ст10,л,ст10)
Кратко шаги 5-х запиушутся так:
5.повт(м(п(п),ст(и),л,ст(и)),и=3..10)

В итоге получаем такое описание алгоритма:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..10)
4.повт(н(р3,ст(и),ст(и+1)),и=3+2..9)
5.повт(м(п(п),ст(и),л,ст(и)),и=3..10)

Продолжаем:
6.н(р4,ст4,ст5)
7.н(р4,ст6,ст7)

Х.н(р4,ст10,ст11)
Кратко шаги 6-х запишутся так:
6.повт(н(р4,ст(и),ст(и+1)),и=4+2,10)

В итоге получаем такое описание алгоритма:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..10)
4.повт(н(р3,ст(и),ст(и+1)),и=3+2..9)
5.повт(м(п(п),ст(и),л,ст(и)),и=3..10)
6.повт(н(р4,ст(и),ст(и+1)),и=4+2,10)

Продолжаем:
7.м(п(п),ст4,л,ст4)
8.м(п(п),ст5,л,ст5)

Х.м(п(п),ст11,л,ст11)
Кратко шаги 7-х запишутся так:
7.повт(м(п(п),ст(и),л,ст(и)),и=4..11)

В итоге получаем такое описание алгоритма:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..11)
4.повт(н(р3,ст(и),ст(и+1)),и=3+2..9)
5.повт(м(п(п),ст(и),л,ст(и)),и=3..10)
6.повт(н(р4,ст(и),ст(и+1)),и=4+2,10)
7.повт(м(п(п),ст(и),л,ст(и)),и=4..11)

Продолжаем:
8.повт(н(р5,ст(и),ст(и+1)),и=3+2..9)
9.повт(м(п(п),ст(и),л,ст(и)),и=3..10)
10.повт(н(р6,ст(и),ст(и+1)),и=4+2,10)
11.повт(м(п(п),ст(и),л,ст(и)),и=4..11)
Теперь видно, что последовательность шагов (8-11) очень похожа на последовательность (4-7) (в них варьируются только цвета резинок) Как бы их записать более компактно? Понятно, что 10-11 группируется так:
(где к=6,ин=4)
А последовательность (8-9) группируется так:
(где к=5,ин=3)
Обе вместе (8-11) они запишутся так:
Аналогично запишется и последовательность (4-7):
А обе вместе (4-11) запишутся так:

В итоге алгоритм выглядит следующим образом:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..11)
Выполняемые далее действия аналогичны телу только что записанного цикла, варьируется только цвет резинок
Таким образом, следующий шаг алгоритма запишется так:
Где дл – желаемая длина браслета (в резинках) (понятно, что, если дл > количесто цветов резинок, то цвета начинаем варьировать опять с 1-го и т.д.)
После того, как весь этот цикл выполнен, изделие можно завершить (замкнуть) и затем снять:
5.м(п(п),ст11,ст10)
6.м(п(п),ст3,ст4)
7.повт(м(п(п),ст(и),ст(и+1)),и=5+2..7)
Шаги (6-7) вместе запишутся так:
6.повт(м(п(п),ст(и),ст(и+1)),и=3+2..7)

Итак, сейчас алгоритм выглядит следующим образом:
1.повт(н(р1,ст(и),в(по),ст(и+1)),и=3+2..9)
2.повт(н(р2,ст(и),в(по),ст(и+1)),и=4+2..10)
3.повт(м(п(п),ст(и),л,ст(и)),и=4..11)
5.м(п(п),ст11,ст10)
6.повт(м(п(п),ст(и),ст(и+1)),и=3+2..7)
7.м(п(п),ст9,ст8)
8.ц(з([1-4]),п(),ст(4+2*(и-1))) (эта запись идентична записи повт(ц(з(и),п(),ст(4+2*(и-1))),и=1..4) (здесь новый элемент формализма – это указание номера застёжки (это необходимо, т.к их больше одной))
(кстати, цеплять застежки за резинки лучше всего по одной резинке)
9.с(з(1),у1) (у1 – это самые левая (сложенная вдвое) резинка 1-го ряда браслета)
10.с(з(4),у4) (у4 – это самые правая (сложенная вдвое) резинка 1-го ряда браслета)
11.с(з(2),у2) (у2 – это сложенная вдвое резинка 1-го ряда браслета, находящаяся напротив застежки з(2))
12.с(з(3),у3) (у – это сложенная вдвое резинка 1-го ряда браслета, находящаяся напротив застежки з(3))
(если мы не зацепим застежки за узел2 и узел3, изделие не распадётся, но просто будет иметь незавершенный вид (поскольку его ширина весьма велика))
13.повт(с(п(),ст(и)),и=4..10)
14.конец

вперёд http://www.proza.ru/2015/08/03/20


Рецензии