Advertisement
Guest User

dalex

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