Advertisement
Guest User

Enterprise FizzBuzz - Pascal

a guest
Mar 21st, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.65 KB | None | 0 0
  1. program TestConsole;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   Spring.Collections,
  9.   System.Math,
  10.   System.Classes,
  11.   System.SyncObjs,
  12.   System.SysUtils;
  13.  
  14. type
  15.   mlMainLoop = class(TObject)
  16.     strict private
  17.     const
  18.       DEFAULT_OUTPUT_STRING = '';
  19.     var
  20.       fUserInput: string;
  21.       fConsoleOutput: string;
  22.       fCurrentMainLoopIteration: Integer;
  23.     procedure IncrementIterationCounter;
  24.  
  25.     public
  26.     procedure Init;
  27.     procedure ExecuteBody;
  28.   end;
  29.  
  30.   IFizzBuzzable = interface
  31.     ['{194D5B44-11B6-44F7-B255-ECCF686285CE}']
  32.     function IsFizz: Boolean;
  33.     function IsBuzz: Boolean;
  34.     function IsFizzBuzz: Boolean;
  35.   end;
  36.  
  37.   IPrintable = interface
  38.     ['{60FC51C9-FDF3-4804-9822-D7C69B98B843}']
  39.     function PrintStr: string;
  40.   end;
  41.  
  42.   IFizzBuzzableManager = interface
  43.     ['{3F2E9739-55A7-4AB0-A0F5-71005140BFCD}']
  44.     procedure NewFizzBuzzable(const aValue: Cardinal);
  45.     function Count: Cardinal;
  46.     function GetPrintable(const aValue: Cardinal): IPrintable;
  47.   end;
  48.  
  49.   TFizzBuzzable = class(TInterfacedObject, IFizzBuzzable, IPrintable)
  50.   strict private
  51.     fValue: Cardinal;
  52.   public
  53.     constructor Create(const aValue: Cardinal);
  54.     function IsFizz: Boolean;
  55.     function IsBuzz: Boolean;
  56.     function IsFizzBuzz: Boolean;
  57.     function PrintStr: string;
  58.   end;
  59.  
  60.   TFizzBuzzableManager = class(TInterfacedObject, IFizzBuzzableManager)
  61.   strict private
  62.     fFizzBuzzables: Spring.Collections.IDictionary<Cardinal, IFizzBuzzable>;
  63.   public
  64.     procedure AfterConstruction; override;
  65.     procedure NewFizzBuzzable(const aValue: Cardinal);
  66.     function Count: Cardinal;
  67.     function GetPrintable(const aValue: Cardinal): IPrintable;
  68.   end;
  69.  
  70.   TFizzBuzzer = class
  71.   strict private
  72.     fCount:               Cardinal;
  73.     fFizzBuzzableManager: IFizzBuzzableManager;
  74.   public
  75.     constructor Create(const aCount: Cardinal);
  76.     function FizzBuzz: string;
  77.   end;
  78.  
  79.   const
  80.     C_FIZZ = 'Fizz';
  81.     C_BUZZ = 'Buzz';
  82.  
  83. var
  84.   fmlMainLoop: mlMainLoop;
  85.  
  86. procedure mlMainLoop.Init;
  87. begin
  88.   fCurrentMainLoopIteration := 0;
  89.   fUserInput := '';
  90.   fConsoleOutput := DEFAULT_OUTPUT_STRING;
  91. end;
  92.  
  93. procedure mlMainLoop.ExecuteBody;
  94.  
  95. var
  96.   vFizzBuzzer: TFizzBuzzer;
  97.  
  98. begin
  99.   Readln(fUserInput);
  100.  
  101.   vFizzBuzzer := TFizzBuzzer.Create(StrToInt(fUserInput));
  102.   try
  103.     fConsoleOutput := vFizzBuzzer.FizzBuzz();
  104.   finally
  105.     vFizzBuzzer.Free();
  106.   end;
  107.  
  108.   Writeln(fConsoleOutput);
  109.   IncrementIterationCounter;
  110. end;
  111.  
  112. procedure mlMainLoop.IncrementIterationCounter;
  113. begin
  114.   fCurrentMainLoopIteration := fCurrentMainLoopIteration + 1;
  115. end;
  116.  
  117. { TFizzBuzzable }
  118.  
  119. constructor TFizzBuzzable.Create(const aValue: Cardinal);
  120. begin
  121.   fValue := aValue;
  122. end;
  123.  
  124. function TFizzBuzzable.IsBuzz: Boolean;
  125. begin
  126.   Result := (fValue mod 5) = 0;
  127. end;
  128.  
  129. function TFizzBuzzable.IsFizz: Boolean;
  130. begin
  131.   Result := (fValue mod 3) = 0;
  132. end;
  133.  
  134. function TFizzBuzzable.IsFizzBuzz: Boolean;
  135. begin
  136.   Result := IsBuzz and IsFizz;
  137. end;
  138.  
  139. function TFizzBuzzable.PrintStr: string;
  140. begin
  141.   if IsFizzBuzz then
  142.     Result := C_FIZZ + C_BUZZ
  143.   else
  144.   if IsFizz then
  145.     Result := C_FIZZ
  146.   else
  147.   if IsBuzz then
  148.     Result := C_BUZZ
  149.   else
  150.     Result := Format('%d', [fValue]);
  151. end;
  152.  
  153. { TFizzBuzzableManager }
  154.  
  155. procedure TFizzBuzzableManager.AfterConstruction;
  156. begin
  157.   inherited;
  158.   fFizzBuzzables := Spring.Collections.TCollections.CreateDictionary<Cardinal, IFizzBuzzable>();
  159. end;
  160.  
  161. function TFizzBuzzableManager.Count: Cardinal;
  162. begin
  163.   Result := fFizzBuzzables.Count;
  164. end;
  165.  
  166. function TFizzBuzzableManager.GetPrintable(const aValue: Cardinal): IPrintable;
  167. begin
  168.   Result := nil;
  169.   if fFizzBuzzables.Keys.Contains(aValue) then
  170.     Supports(fFizzBuzzables[aValue], IPrintable, Result);
  171. end;
  172.  
  173. procedure TFizzBuzzableManager.NewFizzBuzzable(const aValue: Cardinal);
  174. begin
  175.   fFizzBuzzables.AddOrSetValue(aValue, TFizzBuzzable.Create(aValue));
  176. end;
  177.  
  178. { TFizzBuzzer }
  179.  
  180. constructor TFizzBuzzer.Create(const aCount: Cardinal);
  181. var
  182.   I: Integer;
  183. begin
  184.   fCount := aCount;
  185.   fFizzBuzzableManager := TFizzBuzzableManager.Create();
  186.   for I := 1 to aCount do
  187.     fFizzBuzzableManager.NewFizzBuzzable(I);
  188. end;
  189.  
  190. function TFizzBuzzer.FizzBuzz: string;
  191. var
  192.   I: Cardinal;
  193. begin
  194.   Result := EmptyStr;
  195.   for I := 1 to fFizzBuzzableManager.Count() do
  196.     Result := Format('%s%s%s', [Result, sLineBreak,
  197.       fFizzBuzzableManager.GetPrintable(I).PrintStr()]);
  198. end;
  199.  
  200. begin
  201.   fmlMainLoop := mlMainLoop.Create;
  202.   fmlMainLoop.Init;
  203.   while True do
  204.   begin
  205.     try
  206.       fmlMainLoop.ExecuteBody;
  207.     except
  208.       on E: Exception do
  209.         Writeln(E.ClassName, ': ', E.Message);
  210.     end;
  211.   end;
  212.   fmlMainLoop.Free;
  213. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement