Advertisement
Guest User

dalex

a guest
Jul 2nd, 2011
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.16 KB | None | 0 0
  1. var
  2.     best, size, i, k, n: longint;
  3.     vec: array [1..100] of longint;
  4.     prog: array [1..100] of string;
  5.     reg: array [1..255] of char;
  6.     letter: char;
  7.     va, vd, vk: array[1..100] of longint;
  8.     found: boolean;
  9.  
  10. procedure push(x: longint);
  11. begin
  12.     inc(size);
  13.     vec[size] := x;
  14.     reg[x] := letter;
  15.     letter := char(ord(letter) + 1);
  16. end;
  17.  
  18. function peek: longint;
  19. begin
  20.     peek := vec[size];
  21. end;
  22.  
  23. procedure pop;
  24. begin
  25.     letter := char(ord(letter) - 1);
  26.     reg[vec[size]] := chr(0);
  27.     dec(size);
  28. end;
  29.  
  30. function get_command(a, k, d, p: longint): string;
  31. var ca, cd, ck, cp: char;
  32. begin
  33.     ca := reg[a];
  34.     cp := reg[p];
  35.     if d > 0 then begin
  36.         cd := reg[d];
  37.         if k > 1 then begin
  38.             ck := chr(k + ord('0'));
  39.             get_command := 'lea e' + cp + 'x, [e' + cd + 'x + ' + ck + '*e' + ca + 'x]';
  40.         end else begin
  41.             get_command := 'lea e' + cp + 'x, [e' + cd + 'x + e' + ca + 'x]';
  42.         end;
  43.     end else begin
  44.         if k > 1 then begin
  45.             ck := chr(k + ord('0'));
  46.             get_command := 'lea e' + cp + 'x, [' + ck + '*e' + ca + 'x]';
  47.         end;
  48.     end;
  49. end;
  50.  
  51. procedure save_program;
  52. var a, d, k, p: longint;
  53. begin
  54.     for i := 1 to best do begin
  55.         a := va[i];
  56.         d := vd[i];
  57.         k := vk[i];
  58.         p := a * k + d;
  59.         prog[i] := get_command(a, k, d, p);
  60.     end;
  61. end;
  62.  
  63. procedure rec;
  64. var i, ai, di, ki, a, d, k, p: longint;
  65. begin
  66.     if found then exit;
  67.     if size - 1 > best then exit;
  68.     if peek = n then begin
  69.         best := size - 1;
  70.         save_program;
  71.         found := true;
  72.         exit;
  73.     end;
  74.     for di := size downto 0 do begin
  75.         if di = 0 then d := 0 else d := vec[di];
  76.         for ai := size downto 1 do begin
  77.             a := vec[ai];
  78.             for ki := 3 downto 0 do begin
  79.                 k := 1 shl ki;
  80.                 if (k = 1) and (d = 0) then continue;
  81.                 p := a * k + d;
  82.                 if (p <= peek) or (p > n) then continue;
  83.                 push(p);
  84.                 va[size - 1] := a;
  85.                 vd[size - 1] := d;
  86.                 vk[size - 1] := k;
  87.                 rec;
  88.                 pop;
  89.             end;
  90.         end;
  91.     end;
  92. end;
  93.  
  94. begin
  95.     read(n);
  96.     for best := 0 to 100 do begin
  97.         size := 0;
  98.         letter := 'a';
  99.         for i := 1 to 255 do reg[i] := chr(0);
  100.         push(1);
  101.         found := false;
  102.         rec;
  103.         if found then begin
  104.             writeln(best);
  105.             for i := 1 to best do begin
  106.                 writeln(prog[i]);
  107.             end;
  108.             break;
  109.         end;
  110.     end;
  111. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement