Здравствуйте! Есть задача - написать оптимизированную по размеру исполняемого файла без ассемблерных вставок(можно использовать прерывания) программу для заполнения матрицы по спирали для случаев от 1 до 9. Задачу решил и написал самый оптимизированный алгоритм, который я смог из себя выдавить. Скажите, что ещё здесь можно оптимизировать или уже стоит приступать к замене ввода на безэховый и вывода через прерывания? Может от каких переменных избавиться? Или циклы оптимизировать можно?
program spiral; var m: array [1..9, 1..9] of word; //Сама матрица n: word; //Размерность матрицы i: word; //Индексы матрицы j: word; c: word; //Вводимое число l: word; //Длина стороны s: integer; //Флаг меняющийся между значениями -1 и 1 t: word; //Координата поворота p: ^word; //Указатель на координаты begin readln(n); l := n; t := n; s := 1; i := 1; p := @j; repeat p^ := p^ + s; c := c + 1; //Если достигнута точка поворота if p^ = t then begin //Меняем изменяемую координату if p = @j then begin p := @i; l := l - 1; end else begin p := @j; s := -s; end; //Узнаём координату следующего поворота t := p^ + s*(l); end; m[i,j] := c; until l = 0; //Обычный вывод for i:=1 to n do begin for j:=1 to n do write(m[i,j]:3); writeln; end; end.
Можно ещё попробовать директивами отключить эмуляцию сопроцессора и все проверки, включая I/O. Каждая из них может потенциально по графу зависимостей подтягивать куски библиотеки времени исполнения. Хотя, насколько я помню, в System.pas и Crt.pas большая часть была написана в отдельных файлах на ассемблере и подключена как OBJ. А OBJ, если уж тащится, то тащится целиком.
Буфер, если печатать моим способом, должен быть поменьше, string[15], чтоб только хватило напечатать число, потом пробел или перенос строки.
Вынесение m в локальные переменные процедуры вообще влияет на размер хоть как-то?
Сообщение отредактировано: OCTAGRAM -
--------------------
If you want to get to the top, you have to start at the bottom