thoga31

Guesses

Jul 1st, 2014
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.43 KB | None | 0 0
  1. {$mode objfpc}
  2. program guesses;
  3. uses crt, sysutils;
  4.  
  5. type TSetChar = set of char;
  6.  
  7.  
  8. function GetKey(const LIST_OF_KEYS : TSetChar; const PROMPT : string = '') : char;
  9. begin
  10.    repeat
  11.       Write(PROMPT);
  12.       GetKey := crt.ReadKey;
  13.    until GetKey in LIST_OF_KEYS;
  14.    WriteLn(GetKey);
  15. end;
  16.  
  17.  
  18. // We cannot use DIV or MOD. The student doesn't know bitwise operations (SHR and SHL).
  19. function GetMid(lower, upper : longint) : longint;
  20. var diff : longint;
  21.     rest : longint;
  22. begin
  23.    diff := upper - lower;
  24.    rest := diff;
  25.    while rest > 1 do begin
  26.       Inc(lower);
  27.       Dec(rest, 2);
  28.    end;
  29.    GetMid := lower;
  30. end;
  31.  
  32.  
  33. function Guess(lower, upper : longint; var tries : byte) : longint;
  34. var mid : longint;
  35. begin
  36.    Inc(tries);
  37.    if lower = upper then
  38.       guess := lower
  39.    else begin
  40.       mid := GetMid(lower, upper);
  41.       case GetKey(['+','-','='], 'N=' + IntToStr(mid) + ' --> greater = "+", lesser = "-", equal = "=" ?') of
  42.          '+' : Guess := Guess(mid+1, upper, tries);
  43.          '-' : Guess := Guess(lower, mid-1, tries);
  44.          '=' : Guess := mid;
  45.       end;
  46.    end;
  47. end;
  48.  
  49.  
  50. (* BLOCO PRINCIPAL *)
  51. const LOWERLIM = 1;
  52.       UPPERLIM = 1000;
  53.  
  54. var tries : byte = 0;
  55.     g : longint;
  56.  
  57. begin
  58.    WriteLn('Think in a number between ', LOWERLIM, ' and ', UPPERLIM, ', including those two.');
  59.    g := Guess(LOWERLIM, UPPERLIM, tries);
  60.    WriteLn('Your number = ', g, ' (in ', tries, ' tries)');
  61. end.
Advertisement
Add Comment
Please, Sign In to add comment