Advertisement
HEX0x29A

Брут задачи Эйнштейна

Aug 16th, 2013
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 12.60 KB | None | 0 0
  1. unit UMain;
  2. (*
  3. 5 разных человек в 5 разных домах разного цвета, курят 5 разных марок сигарет, выращивают 5 разных видов животных, пьют 5 разных видов напитков.
  4.  
  5. Вопрос: Кто выращивает рыбок?
  6.  
  7. 1. Норвежец живет в первом доме.
  8. 2. Англичанин живет в красном доме
  9. 3. Зеленый дом находится слева от белого
  10. 4. Датчанин пьет чай
  11. 5. Тот, кто курит Rothmans, живет рядом с тем, кто выращивает кошек.
  12. 6. Тот, кто живет в желтом доме, курит Dunhill
  13. 7. Немец курит Marlboro
  14. 8. Тот, кто живет в центре, пьет молоко
  15. 9. Сосед того, кто курит Rothmans, пьет воду.
  16. 10. Тот, кто курит Pall Mall, выращивает птиц.
  17. 11. Швед выращивает собак
  18. 12. Норвежец живет рядом с синим домом
  19. 13. Тот, кто выращивает лошадей, живет в синем доме
  20. 14. Тот, кто курит Philip Morris, пьет пиво
  21. 15. В зеленом доме пьют кофе
  22.  
  23. Номер дома 1 2 3 4 5
  24. Цвет дома
  25. Напиток
  26. Животное
  27. Сигареты
  28. Национальность
  29. *)
  30. interface
  31.  
  32. uses
  33.   Windows, SysUtils, Classes, Forms, ComCtrls, ExtCtrls, Controls;
  34.  
  35. type
  36.   TFMain = class(TForm)
  37.     cResults: TListView;
  38.     cStart: TPanel;
  39.     procedure cStartClick(Sender: TObject);
  40.   private
  41.     procedure ClearResults;
  42.     procedure GenerateResults;
  43.     procedure ShowResults;
  44.     function  ThisValidResults: BOOL;
  45.   end;
  46.  
  47. var
  48.   FMain: TFMain;
  49.  
  50. implementation
  51.  
  52. {$R *.dfm}
  53.  
  54. type
  55.   THouse = packed record
  56.     iCountry    : BYTE;
  57.     iColor      : BYTE;
  58.     iAnimal     : BYTE;
  59.     iDrink      : BYTE;
  60.     iCigarettes : BYTE;
  61.   end;
  62. const
  63.   ID_EMPTY        = 0;
  64.   ID_NORWEGIAN    = 1;
  65.   ID_ENGLISHMAN   = 2;
  66.   ID_DANE         = 3;
  67.   ID_GERMAN       = 4;
  68.   ID_SWEDISH      = 5;
  69.   ID_RED          = 1;
  70.   ID_BLUE         = 2;
  71.   ID_YELLOW       = 3;
  72.   ID_GREEN        = 4;
  73.   ID_WHITE        = 5;
  74.   ID_CATS         = 1;
  75.   ID_HORSES       = 2;
  76.   ID_DOGS         = 3;
  77.   ID_BIRDS        = 4;
  78.   ID_FISH         = 5;
  79.   ID_TEA          = 1;
  80.   ID_COFFEE       = 2;
  81.   ID_MILK         = 3;
  82.   ID_BEER         = 4;
  83.   ID_WATER        = 5;
  84.   ID_PALLMALL     = 1;
  85.   ID_PHILIPMORRIS = 2;
  86.   ID_DUNHILL      = 3;
  87.   ID_MARLBORO     = 4;
  88.   ID_ROTHMANS     = 5;
  89.   aCountry    : packed array [1..5] of string =
  90.   ('Норвежец', 'Англичанин', 'Датчанин', 'Немец', 'Швед');
  91.   aColor      : packed array [1..5] of string =
  92.   ('Красный', 'Синий', 'Желтый', 'Зеленый', 'Белый');
  93.   aAnimal     : packed array [1..5] of string =
  94.   ('Кошки', 'Лошади', 'Собаки', 'Птицы', 'Рыбки');
  95.   aDrink      : packed array [1..5] of string =
  96.   ('Чай', 'Кофе', 'Молоко', 'Пиво', 'Вода');
  97.   aCigarettes : packed array [1..5] of string =
  98.   ('Pall Mall', 'Philip Morris', 'Dunhill', 'Marlboro', 'Rothmans');
  99. var
  100.   aResults    : packed array [1..5] of THouse;
  101.  
  102. procedure TFMain.ClearResults;
  103. var
  104.   i : BYTE;
  105. begin
  106.   cResults.Items.Clear;
  107.   for i := Low(aResults) to High(aResults) do
  108.     FillChar(aResults[i], SizeOf(THouse), $00);
  109.   aResults[1].iCountry := 1;
  110.   aResults[2].iColor   := 2;
  111.   aResults[2].iAnimal  := 2;
  112.   aResults[3].iDrink   := 3;
  113. end;
  114.  
  115. procedure TFMain.GenerateResults;
  116. label
  117.   _reload;
  118. const
  119.   ID_COUNTRY    = 1;
  120.   ID_COLOR      = 2;
  121.   ID_ANIMAL     = 3;
  122.   ID_DRINK      = 4;
  123.   ID_CIGARETTES = 5;
  124.  
  125.   function AlreadyExists(const ItemID, Value: BYTE): BOOL;
  126.   var
  127.     i : BYTE;
  128.   begin
  129.     Result := False;
  130.     for i := Low(aResults) to High(aResults) do
  131.     case ItemID of
  132.       ID_COUNTRY    : if aResults[i].iCountry = Value then begin
  133.                         Result := True;
  134.                         Break;
  135.                       end;
  136.       ID_COLOR      : if aResults[i].iColor = Value then begin
  137.                         Result := True;
  138.                         Break;
  139.                       end;
  140.       ID_ANIMAL     : if aResults[i].iAnimal = Value then begin
  141.                         Result := True;
  142.                         Break;
  143.                       end;
  144.       ID_DRINK      : if aResults[i].iDrink = Value then begin
  145.                         Result := True;
  146.                         Break;
  147.                       end;
  148.       ID_CIGARETTES : if aResults[i].iCigarettes = Value then begin
  149.                         Result := True;
  150.                         Break;
  151.                       end;
  152.     end;
  153.   end;
  154.  
  155. var
  156.   i     : BYTE;
  157.   Value : BYTE;
  158. begin
  159.   _reload:
  160.   ClearResults;
  161.   for i := Low(aResults) to High(aResults) do begin
  162.     if aResults[i].iCountry = ID_EMPTY then
  163.     repeat
  164.       Value := Random(5)+1;
  165.     until not AlreadyExists(ID_COUNTRY, Value);
  166.     if aResults[i].iCountry = ID_EMPTY then
  167.       aResults[i].iCountry := Value;
  168.   end;
  169.   for i := Low(aResults) to High(aResults) do begin
  170.     case aResults[i].iCountry of
  171.       ID_GERMAN     : aResults[i].iCigarettes := ID_MARLBORO;
  172.       ID_ENGLISHMAN : aResults[i].iColor      := ID_RED;
  173.       ID_DANE       : aResults[i].iDrink      := ID_TEA;
  174.       ID_SWEDISH    : aResults[i].iAnimal     := ID_DOGS;
  175.     end;
  176.   end;
  177.   for i := Low(aResults) to High(aResults) do begin
  178.     if aResults[i].iColor = ID_EMPTY then
  179.     repeat
  180.       Value := Random(5)+1;
  181.     until not AlreadyExists(ID_COLOR, Value);
  182.     if aResults[i].iColor = ID_EMPTY then
  183.       aResults[i].iColor := Value;
  184.   end;
  185.   for i := Low(aResults) to High(aResults) do begin
  186.     case aResults[i].iColor of
  187.       ID_YELLOW : begin
  188.                     if aResults[i].iCountry = ID_GERMAN then
  189.                       goto _reload;
  190.                     aResults[i].iCigarettes := ID_DUNHILL;
  191.                   end;
  192.       ID_GREEN  : begin
  193.                     if (i<>5)and(aResults[i+1].iColor <> ID_WHITE) then
  194.                       goto _reload;
  195.                     aResults[i].iDrink    := ID_COFFEE;
  196.                   end;
  197.     end;
  198.   end;
  199.   for i := Low(aResults) to High(aResults) do begin
  200.     if aResults[i].iCigarettes = ID_EMPTY then
  201.     repeat
  202.       Value := Random(5)+1;
  203.     until not AlreadyExists(ID_CIGARETTES, Value);
  204.     if aResults[i].iCigarettes = ID_EMPTY then
  205.       aResults[i].iCigarettes := Value;
  206.   end;
  207.   for i := Low(aResults) to High(aResults) do begin
  208.     case aResults[i].iCigarettes of
  209.       ID_PALLMALL      : aResults[i].iAnimal := ID_BIRDS;
  210.       ID_PHILIPMORRIS  : aResults[i].iDrink  := ID_BEER;
  211.     end;
  212.   end;
  213.   for i := Low(aResults) to High(aResults) do begin
  214.     if aResults[i].iDrink = ID_EMPTY then
  215.     repeat
  216.       Value := Random(5)+1;
  217.     until not AlreadyExists(ID_DRINK, Value);
  218.     if aResults[i].iDrink = ID_EMPTY then
  219.       aResults[i].iDrink := Value;
  220.   end;
  221.   for i := Low(aResults) to High(aResults) do begin
  222.     case aResults[i].iDrink of
  223.       ID_WATER : begin
  224.                    case i of
  225.                      1 : if aResults[i+1].iCigarettes <> ID_ROTHMANS then
  226.                            goto _reload;
  227.                      5 : if aResults[i-1].iCigarettes <> ID_ROTHMANS then
  228.                            goto _reload;
  229.                      else if (aResults[i-1].iCigarettes <> ID_ROTHMANS)or(aResults[i+1].iCigarettes <> ID_ROTHMANS) then
  230.                            goto _reload;
  231.                    end;
  232.                  end;
  233.     end;
  234.   end;
  235.   for i := Low(aResults) to High(aResults) do begin
  236.     if aResults[i].iAnimal = ID_EMPTY then
  237.     repeat
  238.       Value := Random(5)+1;
  239.     until not AlreadyExists(ID_ANIMAL, Value);
  240.     if aResults[i].iAnimal = ID_EMPTY then
  241.       aResults[i].iAnimal := Value;
  242.   end;
  243.   for i := Low(aResults) to High(aResults) do begin
  244.     case aResults[i].iAnimal of
  245.       ID_CATS : begin
  246.                    case i of
  247.                      1 : if aResults[i+1].iCigarettes <> ID_ROTHMANS then
  248.                            goto _reload;
  249.                      5 : if aResults[i-1].iCigarettes <> ID_ROTHMANS then
  250.                            goto _reload;
  251.                      else if (aResults[i-1].iCigarettes <> ID_ROTHMANS)or(aResults[i+1].iCigarettes <> ID_ROTHMANS) then
  252.                            goto _reload;
  253.                    end;
  254.                  end;
  255.     end;
  256.   end;
  257. end;
  258.  
  259. procedure TFMain.ShowResults;
  260. var
  261.   i : BYTE;
  262. begin
  263.   cResults.Items.Clear;
  264.   for i := Low(aResults) to High(aResults) do
  265.   with cResults.Items.Add do begin
  266.     Caption := IntToStr(i);
  267.     SubItems.Add(aColor[aResults[i].iColor]);
  268.     SubItems.Add(aCountry[aResults[i].iCountry]);
  269.     SubItems.Add(aCigarettes[aResults[i].iCigarettes]);
  270.     SubItems.Add(aDrink[aResults[i].iDrink]);
  271.     SubItems.Add(aAnimal[aResults[i].iAnimal]);
  272.   end;
  273. end;
  274.  
  275. function TFMain.ThisValidResults: BOOL;
  276. var
  277.   i        : BYTE;
  278.   abResult : packed array [1..15] of BOOL;
  279. begin
  280.   for i := Low(abResult) to High(abResult) do
  281.     abResult[i] := False;
  282.   for i := Low(aResults) to High(aResults) do begin
  283.     {1. Норвежец живет в первом доме.}
  284.     if (aResults[1].iCountry = ID_NORWEGIAN) then
  285.       abResult[1] := True;
  286.     {2. Англичанин живет в красном доме}
  287.     if (aResults[i].iColor = ID_RED)and(aResults[i].iCountry = ID_ENGLISHMAN) then
  288.       abResult[2] := True;
  289.     {3. Зеленый дом находится слева от белого}
  290.     if (i <> 5)and(aResults[i].iColor = ID_GREEN)and(aResults[i+1].iColor = ID_WHITE) then
  291.       abResult[3] := True;
  292.     {4. Датчанин пьет чай}
  293.     if (aResults[i].iDrink = ID_TEA)and(aResults[i].iCountry = ID_DANE) then
  294.       abResult[4] := True;
  295.     {5. Тот, кто курит Rothmans, живет рядом с тем, кто выращивает кошек.}
  296.     if (i in [1..4])and(aResults[i].iCigarettes = ID_ROTHMANS)and(aResults[i+1].iAnimal = ID_CATS) then
  297.       abResult[5] := True;
  298.     if (i in [2..5])and(aResults[i].iCigarettes = ID_ROTHMANS)and(aResults[i-1].iAnimal = ID_CATS) then
  299.       abResult[5] := True;
  300.     {6. Тот, кто живет в желтом доме, курит Dunhill}
  301.     if (aResults[i].iColor = ID_YELLOW)and(aResults[i].iCigarettes = ID_DUNHILL) then
  302.       abResult[6] := True;
  303.     {7. Немец курит Marlboro}
  304.     if (aResults[i].iCountry = ID_GERMAN)and(aResults[i].iCigarettes = ID_MARLBORO) then
  305.       abResult[7] := True;
  306.     {8. Тот, кто живет в центре, пьет молоко}
  307.     if (aResults[3].iDrink = ID_MILK) then
  308.       abResult[8] := True;
  309.     {9. Сосед того, кто курит Rothmans, пьет воду.}
  310.     if (i in [1..4])and(aResults[i].iCigarettes = ID_ROTHMANS)and(aResults[i+1].iDrink = ID_WATER) then
  311.       abResult[9] := True;
  312.     if (i in [2..5])and(aResults[i].iCigarettes = ID_ROTHMANS)and(aResults[i-1].iDrink = ID_WATER) then
  313.       abResult[9] := True;
  314.     {10. Тот, кто курит Pall Mall, выращивает птиц.}
  315.     if (aResults[i].iAnimal = ID_BIRDS)and(aResults[i].iCigarettes = ID_PALLMALL) then
  316.       abResult[10] := True;
  317.     {11. Швед выращивает собак}
  318.     if (aResults[i].iAnimal = ID_DOGS)and(aResults[i].iCountry = ID_SWEDISH) then
  319.       abResult[11] := True;
  320.     {12. Норвежец живет рядом с синим домом}
  321.     if (aResults[2].iColor = ID_BLUE) then
  322.       abResult[12] := True;
  323.     {13. Тот, кто выращивает лошадей, живет в синем доме}
  324.     if (aResults[2].iAnimal = ID_HORSES) then
  325.       abResult[13] := True;
  326.     {14. Тот, кто курит Philip Morris, пьет пиво}
  327.     if (aResults[i].iDrink = ID_BEER)and(aResults[i].iCigarettes = ID_PHILIPMORRIS) then
  328.       abResult[14] := True;
  329.     {15. В зеленом доме пьют кофе}
  330.     if (aResults[i].iColor = ID_GREEN)and(aResults[i].iDrink = ID_COFFEE) then
  331.       abResult[15] := True;
  332.   end;
  333.   Result := True;
  334.   for i := Low(abResult) to High(abResult) do
  335.     Result := Result and abResult[i];
  336. end;
  337.  
  338. procedure TFMain.cStartClick(Sender: TObject);
  339. var
  340.   i : BYTE;
  341. begin
  342.   repeat
  343.     GenerateResults;
  344.     ShowResults;
  345.     Application.ProcessMessages;
  346.   until ThisValidResults;
  347.   for i := Low(aResults) to High(aResults) do
  348.     if aResults[i].iAnimal = ID_FISH then begin
  349.       MessageBoxA(Handle, PAnsiChar(AnsiString(aCountry[i]+' выращивает рыбок.')), 'Finish', MB_ICONINFORMATION);
  350.       Break;
  351.     end;
  352. end;
  353.  
  354. initialization
  355.   Randomize;
  356.  
  357. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement