Здравствуйте! Есть задача - написать оптимизированную по размеру исполняемого файла без ассемблерных вставок(можно использовать прерывания) программу для заполнения матрицы по спирали для случаев от 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.
Как ни странно - я смог ужать программу ещё сильнее... ну точнее её экзешник на выходе. со всеми оптимизациями компилятора выходит 2080 байт. Но всё ещё нужно преодолеть порог в 2000 байт. Есть идеи, глядя на этот новый код?
program spiral; uses dos; var m: array [1..9, 1..9] of word; n: word; i: word; j: word; c: word; l: word; s: integer; t: word; p: ^word; r: registers; begin with r do begin ah := 8; msdos®; n := r.al - 48; ah := 2; end; l := n; t := n; s := 1; i := 1; p := @j; repeat p^ := p^ + s; c := c + 1; if c = t then begin if p = @j then begin p := @i; l := l - 1; end else begin p := @j; s := -s; end; t := c + l; end; m[i,j] := c; until l = 0; for i:=1 to n do begin for j:=1 to n do with r do begin dl := m[i,j] div 10 + 48; msdos®; dl := m[i,j] mod 10 + 48; msdos®; dl := 32; msdos®; end; with r do begin dl := 13; msdos®; dl := 10; msdos®; end; end; end.