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

Мир Когнито
назад http://www.proza.ru/2015/07/31/1688

Опишем алгоритм плетения браслета «Звёздочка» http://www.youtube.com/watch?v=fx4z4hpEZi0
Это изделение плетётся на станке, поэтому при решении этой задачи явно появятся новые элементы формализма для записи алгоритма плетения.
Расположим станок выпуклыми сторонами столбиков на нас (это задаст систему отсчёта координат)
Теперь пронумеруем ряды столбиков слева направо  (1,2,3 и т.д, если в станке больше рядов), а столбики в ряду – от нас: 1,2,3 и т.д. В итоге обозначение столбика будет выглядеть так ст(1,2) (то есть столбик в позиции 1 на 2-ом ряду. Номер ряда ставим на 2-ом месте. Это удобно, потому что если используется 1-рядный станок, номер ряда можно не указывать: ст(5))
Начало
1.н(р1,ст(1,2),ст(1,1))
2.н(р1,ст(1-2,1))
3.н(р1,ст(2-3,1))
4.н(р1,ст(3-4,1))

х.н(р1,ст(п-2,п-1,1))
(здесь ст(п,1) означает последний столбик 1-го ряда, ст(п-1,1) – соответственно предпоследний столбик 1-го ряда и т.д.)
И еще здесь возникает вопрос: а нельзя ли запись последовательности шагов (2-х) сделать более компактно? Иба на это даёт надежду то, что эта последовательность напоминает собой выполнение цикла. Так и поступим, вместо последовательности (2-х) запишем:
повт(н(р1,ст(н,н+1,1)),н=1..п-2)
(что означает: повторяй надеть резинку 1-го цвета (иногда нужно надеть резинку произвольного цвета. Тогда резинку обозначим просто р) на столбики под номерами н и н+1 1-го ряда от н=1 до н=п-2
(увеличивая номер столбика всякий раз на 1. Поскольку это значение увеличения установлено как «по умолчанию», в явном виде его можно не указывать не. При другом значении увеличения (например, 2) будем писать так: н=1+2..п))

Перепишем описание алгоритма заново, учитывая новый элемент системы обозначений (=формализма):
1.н(р1,ст(1,2),ст(1,1))
2.повт(н(р1,ст(н,н+1,1)),н=1..п-2)
3.н(р1,ст(п-1,1),ст(п,2))
4.н(р1,ст(1,2),ст(1,3))
5.повт(н(р1,ст(н,н+1,3)),н=1..п-2)

И продолжим описание алгоритма:
6.н(р1,ст(п-1,3),ст(п,2))
7.н(р2,ст(2,2),ст(2,3))
8.н(р2,ст(2,2),ст(1,3))
9.н(р2,ст(2,2),ст(1,2))
10.н(р2,ст(2,2),ст(1,1))
11.н(р2,ст(2,2),ст(2,1))
12.н(р2,ст(2,2),ст(3,2))
13.н(р3,ст(4,2),ст(4,3))
14.н(р3,ст(4,2),ст(3,3))
15.н(р3,ст(4,2),ст(3,2))
16.н(р3,ст(4,2),ст(3,1))
17.н(р3,ст(4,2),ст(4,1))
18.н(р3,ст(4,2),ст(5,2))

Остановимся и призадумаемся: а нельзя ли более компактно записать последовательность шагов (14-16)? (Ведь во всех этих шагах есть повторяющийся элемент р3,ст(4,2)) Что ж, извольте:
н(р3,ст(4,2),ст[(4,3),(3,3),(3,2),(3,1),(4,1),(5,2)])
(таким образом мы готовим создание звёздочки)
В данной записи конструкция ст[(4,3),(3,3),(3,2),(3,1),(4,1),(5,2)] означает, что в ряду повторений оператора параметры столбца (назначения) меняются в последовательности (4,3),(3,3),(3,2),(3,1),(4,1),(5,2)

Очевидно, что похоже запишется и последовательность шагов (7-12):
н(р2,ст(2,2),ст[(2,3),(1,3),(1,2),(1,1),(2,1),(3,2)])
(таким образом мы готовим создание предыдущей звёздочки)
Но нет ли между этими записями чего-то общего? Конечно, есть, а именно это общая схема последовательности столбиков назначения (та, что в квадратных скобках) Запишем её так:
н(р(к), ст(и,2),ст([и,и-1,и-1,и-1,и,и+1],[3,3,2,1,1,2]))
(в этой записи новое то, что последовательности значений параметров столбца назначения здесь приведены отдельно для позиции в ряду и номера ряда. Это удобно в том числе и в том случае, если в ряду повторений оператора зименяется значение только одного параметра.)
Эта запись и будет телом цикла, которым мы опишем последующие шаги:
Повт(н(р(к), ст(и,2),ст([и,и-1,и-1,и-1,и,и+1],[3,3,2,1,1,2])),к=2..7, и=2+2..12)
(таким образом мы готовим создание всех звёздочек)

Перепишем алгоритм заново, учитывая нововведения в формализме:
1.н(р1,ст(1,2),ст(1,1))
2.повт(н(р1,ст(и,и+1,1)),и=1..п-2) (А1-)
3.н(р1,ст(п-1,1),ст(п,2))
4.н(р1,ст(1,2),ст(1,3))
5. повт(н(р1,ст(и,и+1,3)),и=1..п-2)

(-А1: Похоже, для счётчиков циклов надо зарезервировать отдельные буквы (и ни в коем случае не п и н. Потому что п – номер последнего столбца, н – нижняя позиция(а почему не последняя?)) Например, и и к. Тогда получится так:
2.повт(н(р1,ст(и,и+1,1)),и=1..п-2) (вместо повт(н(р1,ст(н,н+1,1)),н=1..п-2))
5.повт(н(р1,ст(и,и+1,3)),и=1..п-2) (вместо повт(н(р1,ст(н,н+1,3)),н=1..п-2))
)

6.н(р1,ст(п-1,3),ст(п,2))
7.повт(н(р(к), ст(и,2),ст([и,и-1,и-1,и-1,и,и+1],[3,3,2,1,1,2])),к=2..7, и=2+2..12)
(здесь новое в формализме то, что получился цикл по двум параметрам: к и и.
Причём важно, что сначала идёт цикл по к (цветам резинок)(то есть это внешний цикл), а внутри него – цикл но номерам позиции столбика в ряду. Ибо при другом порядке параметров циклов результат получился бы совсем другой.)

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

А поскольку дальше предстоит, понятно, шаг:
16.м(п(3),ст(11,2),под(1-2),ст(10,2)),
то возникает желание и этот шаг (и ему подобный шаг 10.м(п(3),ст(13,2),под(1-2),ст(12,2))) вписать в вышестоящий цикл. Но как это сделать, если в этом шаге стоит п(3) вместо п(5), как на последующих шагах? А вот так:
(так мы провязываем последнюю звёздочку)
(здесь новый элемент формализма – это конструкция вида п([3,5*5]). Которая означает, что в ряду повторений оператора значение номера позиции сначала 3, а потом 5 раз повторяется значение 5.
Аналогичный смысл имеет и конструкция под([(1-2,5*1-4]))

(то есть все номера позиций столбцов на 2 меньше. Так мы провязываем предпоследнюю звёздочку.)

Общее в этих последних 2-х записях следующее:
Это и есть тело цикла провязывания звёздочек. А сам этот цикл запишется так:

Перепишем алгоритм с учётом последних нововведений в формализме:
1.н(р1,ст(1,2),ст(1,1))
2.повт(н(р1,ст(и,и+1,1)),и=1..п-2) (А1-)
3.н(р1,ст(п-1,1),ст(п,2))
4.н(р1,ст(1,2),ст(1,3))
5. повт(н(р1,ст(и,и+1,3)),и=1..п-2)
6.н(р1,ст(п-1,3),ст(п,2))
7.повт(н(р(к), ст(и,2),ст([и,и-1,и-1,и-1,и,и+1],[3,3,2,1,1,2])),к=2..7, и=2+2..12)
8.н(р1,ст(п,2),в(пр),ст(п,2))
9.повт(н(р1,ст(и,2),в(пр),ст(и,2)),и=(п-1)-2..2)

И продолжим его описывать:
11.м(п(3),ст(13,2),под(1-2),ст(12,3))
12.м(п(п),ст(12,3),под(1-2),ст(11,3))
13.м(п(п),ст(11,3),под(1-2),ст(10,3))

Х.м(п(п),ст(2,3),под(1-2),ст(1,3))

Понятно, что последовательность шагов (12-Х) более компактно запишется так:
Повт(м(п(п),ст(и,3),под(1-2),ст(и-1,3)), и=12..2)
А вместе с шагом 11 так:
Повт(м(п([3,11*п]),ст(и,3),под(1-2),ст(и-1,3)), и=13..2)
(здесь нововведение – применение конструкции п([3,11*п]) в цикле. Но смысл этой конструкции в данном случае, думаю, понятен без объяснений)

Перепишем алгоритм с учётом применения записи цикла:
1.н(р1,ст(1,2),ст(1,1))
2.повт(н(р1,ст(и,и+1,1)),и=1..п-2) (А1-)
3.н(р1,ст(п-1,1),ст(п,2))
4.н(р1,ст(1,2),ст(1,3))
5. повт(н(р1,ст(и,и+1,3)),и=1..п-2)
6.н(р1,ст(п-1,3),ст(п,2))
7.повт(н(р(к), ст(и,2),ст([и,и-1,и-1,и-1,и,и+1],[3,3,2,1,1,2])),к=2..7, и=2+2..12)
8.н(р1,ст(п,2),в(пр),ст(п,2))
9.повт(н(р1,ст(и,2),в(пр),ст(и,2)),и=(п-1)-2..2)
11.повт(м(п([3,11*п]),ст(и,3),под(1-2),ст(и-1,3)), и=13..2)
Потом, понятное дело:
12.м(п(п),ст(1,3),под(1-4),ст(1,2)) (не будем объединять с предыдущей записью, ибо можно, но слишком непрозрачно получится)
Что же дальше?
13.м(п(п),ст(13,2),под(1-(п-1)),ст(12,1))
(для упрощения конструкцию под(1-(п-1)) можно записать и так: под().(ибо для случая снятия с п(п) последняя конструкция именно так и будет пониматься: под(1-(п-1)) В случае же снятия, например с п(4) данная конструкция означает под(1-3), то есть под всеми предыдущими позициями.) Если же крючок вводится под начиная с позиции, например, 2, то запись будет такова: под(2-).)
Далее, понятное дело, так:
14.повт(м(п(п),ст(и,1),под(1-(п-1)),ст(и-1,1)),и=12..1)
Объединив в шагом 13, получим:
повт(м(п(п),ст(и,[2,12*1]),под(1-(п-1)),ст(и-1,1)),и=13..1)

В итоге так:
1.н(р1,ст(1,2),ст(1,1))
2.повт(н(р1,ст(и,и+1,1)),и=1..п-2) (А1-)
3.н(р1,ст(п-1,1),ст(п,2))
4.н(р1,ст(1,2),ст(1,3))
5. повт(н(р1,ст(и,и+1,3)),и=1..п-2)
6.н(р1,ст(п-1,3),ст(п,2))
7.повт(н(р(к), ст(и,2),ст([и,и-1,и-1,и-1,и,и+1],[3,3,2,1,1,2])),к=2..7, и=2+2..12)
8.н(р1,ст(п,2),в(пр),ст(п,2))
9.повт(н(р1,ст(и,2),в(пр),ст(и,2)),и=(п-1)-2..2)
11.повт(м(п([3,11*п]),ст(и,3),под(1-2),ст(и-1,3)), и=13..2)
12.м(п(п),ст(1,3),под(1-4),ст(1,2))
14.м(п(п),ст(1,1),под(1-(п-1)),ст(1,2))
15.в(кр,под(),ст(1,2)) (новая операция: вводим крючок под все позиции столбика1 из 2-го ряда)
16.н(р1,кр,ст(д)) (новая операция: надеваем резинку 1-го цвета на крючок и дополнителный столбик (например, палец кисти))
17.из(кр, ст(1,2)) (новая операция: извлекаем крючок из столбика(1,2). Естественно, вместе с надетой на него резинкой)
18.н(р(кр),ст(д)) (новая операция: надеваем резинку на крючке на дополнительный столбик)
19.ц(з,п(), ст(д)) (зацепить застежку за резинки всех позиций на дополнительном столбике)
20.с(з,ст(д)) (снять застежку с дополнительного столбика. Естественно, вместе с надетыми на неё резинками.)
21.повт(с(п(),ст(и,к)), и=1..12, к=1..3) (снять резинки на всех позициях заданного столбика, проходя по позицям от 1 до 12 в ряду, а внутри каждой позиции – по рядам 1-3)
22.ц(з,у0,ст(1,2)) (узел0, понятно, находится на ст(1,2))
23.с(у0, ст(1,2))
Всё, изделие готово!
Достижение дня: нам удалось довольно компактно (за 23 оператора) записать алгоритм плетения изделия, в котором реально около 150 операций.

Далее в этой работе будут представлены формальные записи алгоритмов плетения изделий:
браслет «Лестница» http://www.youtube.com/watch?v=eL51wK3Vb8s ,
браслет «Чешуя дракона» http://www.youtube.com/watch?v=uLNGCtvUePg

вперёд http://www.proza.ru/2015/08/02/593