В этой главе разбирается множество небольших, но поучительных программ. Все они
рисуют на экране терминала различные фигуры. Терминал не совсем подходит для
рисования фигур, поэтому точки, из которых состоят фигуры, будут получаться при
выводе на экран символов звёздочки *
(по-английски
asterisk, не путать с пятиконечной
звездой ★
— star).
Все программы будут называться asterisks-*.pl, где вместо
звёздочки (!) будет описание формы фигуры, и, возможно, указание на способ
реализации алгоритма.
Все программы должны получить в командной строке целое неотрицательное число , отвечающее за размер фигуры. Если число не задано при запуске программы, она прекращает работу, выдав перед этим сообщение об ошибке:
%
./asterisks-something.pl
Нужно неотрицательное число!
Самая простая программа asterisks-solid-square.pl рисует сплошной квадрат размера . Пусть он будет не совсем квадратным (значки экранного шрифта, скорее всего, вытянуты по вертикали). Главное, что ширина и высота квадрата, выраженные в звёздочках, одинаковы:
%
./asterisks-solid-square.pl 0
%
./asterisks-solid-square.pl 1
*
%
./asterisks-solid-square.pl 2
** **
%
./asterisks-solid-square.pl 3
*** *** ***
%
./asterisks-solid-square.pl 8
******** ******** ******** ******** ******** ******** ******** ********
Немного усложним задачу. Пусть в квадрате чередуются звёздочки и пробелы в шахматном порядке. Для определённости потребуем, чтобы звёздочка всегда находилась в левом верхнем углу квадрата. Назовём программу asterisks-chessboard.pl (chessboard — шахматная доска):
%
./asterisks-chessboard.pl 1
*
%
./asterisks-chessboard.pl 2
* *
%
./asterisks-chessboard.pl 3
* * * * *
%
./asterisks-chessboard.pl 8
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
%
./asterisks-hollow-square.pl 1
*
%
./asterisks-hollow-square.pl 2
** **
%
./asterisks-hollow-square.pl 3
*** * * ***
%
./asterisks-hollow-square.pl 8
******** * * * * * * * * * * * * ********
%
./asterisks-nested-squares.pl 7
******* * * * *** * * * * * * *** * * * *******
%
./asterisks-nested-squares.pl 16
**************** * * * ************ * * * * * * * ******** * * * * * * * * * * * **** * * * * * * * * * * * * * * * * * * * * * * **** * * * * * * * * * * * ******** * * * * * * * ************ * * * ****************