{
	Jednou mi moje švagrová předala příklad, který prý vymyslel samotný 
Einstein, ktrý o něm zároveň tvrdill, že ho 98 % lidí na světě nedokáže 
vyřešit. A tak jsem se do tohoto příkladu zabral a napadlo mě, že bych mohl 
využít svůj počítač k tomu, aby mi v tom výpočtu pomohl.

Posuďte to sami, zde je zadání příkladu:

Patříte mezi 2 procenta nejinteligentnějších lidí na světě?

V této úloze není žádný trik, jde o pouhou logiku.
Einstein tuto hádanku vytvořil v minulém století. Tvrdil, že 98% lidí na 
světě ji není schopno vyřešit.

1. Je 5 domů, každý jiné barvy.
2. V každém domě bydlí jedna osoba jiné národnosti.
3. Každý majitel domu upřednostňuje určitý nápoj, kouří určitou značku 
cigaret a chová určité zvíře.
4. Žádná z těchto osob nepije stejný nápoj, nekouří stejné cigarety ani 
nechová stejné zvíře jako některý z jejích sousedů.

Otázka zní:	Komu patří ryba?

Víte, že:
1 - Brit žije v červeném domě
2 - Švéd chová psa
3 - Dán pije rád čaj
4 - Němec kouří cigarety Rothmanns
5 - Nor bydlí v prvním domku
6 - majitel zeleného domku pije kávu
7 - kuřák cigaret Winfield pije rád pivo
8 - majitel žlutého domu kouří cigarety Dunhill
9 - osoba, která kouří Pall Mall, chová papouška
10 - muž, který bydlí v prostředním domě, pije mléko
11 - kuřák cigaret Malboro bydlí vedle toho, kdo chová kočku
12 - muž, který chová koně, bydlí vedle toho, který kouří Dunhill
13 - Nor bydlí vedle modrého domu
14 - kuřák cigaret Malboro má souseda, který pije vodu
15 - zelený dům stojí nalevo od bílého domu
       (bere se to podle lidí, takže při pohledu zvenku je to napravo)

Tolik tedy zadání. Pokud chcete, aby Vám program vypočítal výsledek, 
stiskněte tlačítko "Vypočítej".

Souhrn všech osob, zvířat a věcí:
	     1	   	2	    3        4	  	5
jméno:	     Brit	Švéd	    Dán      Němec	Nor
dům:	     červený	zelený	    žlutý    modrý     	bílý
nápoj:	     čaj	káva	    pivo     mléko	voda
cigarety:    Rothmanns  Winfield    Dunhill  Pall Mall  Malboro
zvíře:	     pes	papoušek    kočka    kůň	ryba
}

procedure TForm1.Button1Click(Sender: TObject);
var   B,C,D,E,
    F,  H,I,J,
    K,L,  N,O,
    P,Q,R,S,T,
    U,V,W,X,Y: Integer;
    Jmeno, Dum, Napoj, Cigarety, Zvire : String;
begin
//najde všechny kombinace pěti čísel s tím, že žádné číslo se neobjeví 2x
//tzn. že možných kombinací je 120

//kombinace národností s tím, že NOR (jmeno5) je vždy na prvním místě
//pravidlo 5
//po této úpravě je jen 24 možností
  for B := Ord('1') to Ord('5') do
    for C := Ord('1') to Ord('5') do
      for D := Ord('1') to Ord('5') do
        for E := Ord('1') to Ord('5') do
          if (Pos('1', '5'+Chr(B)+Chr(C)+Chr(D)+Chr(E)) > 0) and
             (Pos('2', '5'+Chr(B)+Chr(C)+Chr(D)+Chr(E)) > 0) and
             (Pos('3', '5'+Chr(B)+Chr(C)+Chr(D)+Chr(E)) > 0) and
             (Pos('4', '5'+Chr(B)+Chr(C)+Chr(D)+Chr(E)) > 0) and
             (Pos('5', '5'+Chr(B)+Chr(C)+Chr(D)+Chr(E)) > 0) then
 //kombinace domů
 //pravidlo 13 Nor bydlí vedle modrého domu spolu s pravidlem 5 znamená
 //že druhý dům musí být modrý (dum4 vždy na druhém místě)
 //po této úpravě je jen 24 možností
 begin
 for F := Ord('1') to Ord('5') do
     for H := Ord('1') to Ord('5') do
       for I := Ord('1') to Ord('5') do
         for J := Ord('1') to Ord('5') do
           if (Pos('1', Chr(F)+  '4' +Chr(H)+Chr(I)+Chr(J)) > 0) and
              (Pos('2', Chr(F)+  '4' +Chr(H)+Chr(I)+Chr(J)) > 0) and
              (Pos('3', Chr(F)+  '4' +Chr(H)+Chr(I)+Chr(J)) > 0) and
              (Pos('4', Chr(F)+  '4' +Chr(H)+Chr(I)+Chr(J)) > 0) and
              (Pos('5', Chr(F)+  '4' +Chr(H)+Chr(I)+Chr(J)) > 0) then
  begin
  //zde již může dojít k filtraci pravidel obsahující jméno a dům
  Jmeno    :=  '5'  +Chr(B)+Chr(C)+Chr(D)+Chr(E);
  Dum      := Chr(F)+  '4' +Chr(H)+Chr(I)+Chr(J);
  //Brit žije v červeném domě (jmeno1 a dum1 musí být po sebou)
  if Pos('1',Jmeno) = Pos('1',Dum) then
  //zelený dům stojí nalevo od bílého domu (dum2 je vetsi nez dum5) 54x
  if Pos('2', Dum) > Pos('5', Dum) then

  //kombinace nápojů
  //pravidlo 10	muž, který bydlí v prostředním domě, pije mléko znamená
  //napoj4 musí být na třetím místě
  //po této úpravě je jen 24 možností
  for K := Ord('1') to Ord('5') do
    for L := Ord('1') to Ord('5') do
        for N := Ord('1') to Ord('5') do
          for O := Ord('1') to Ord('5') do
            if (Pos('1', Chr(K)+Chr(L)+  '4' +Chr(N)+Chr(O)) > 0) and
               (Pos('2', Chr(K)+Chr(L)+  '4' +Chr(N)+Chr(O)) > 0) and
               (Pos('3', Chr(K)+Chr(L)+  '4' +Chr(N)+Chr(O)) > 0) and
               (Pos('4', Chr(K)+Chr(L)+  '4' +Chr(N)+Chr(O)) > 0) and
               (Pos('5', Chr(K)+Chr(L)+  '4' +Chr(N)+Chr(O)) > 0) then

   begin
   //zde již může dojít k filtraci pravidel obsahující jméno, dům a nápoj
   Napoj    := Chr(K)+Chr(L)+  '4' +Chr(N)+Chr(O);
   //Dán pije rád čaj (jmeno3 a napoj1 pod sebou)
   if Pos('3', Jmeno) = Pos('1', Napoj) then
   //majitel zeleného domku pije kávu (napoj2 dum2 pod sebou)
   if Pos('2', Napoj) = Pos('2', Dum) then

   //kombinace cigaret
   for P := Ord('1') to Ord('5') do
     for Q := Ord('1') to Ord('5') do
       for R := Ord('1') to Ord('5') do
         for S := Ord('1') to Ord('5') do
           for T := Ord('1') to Ord('5') do
             if (Pos('1', Chr(P)+Chr(Q)+Chr(R)+Chr(S)+Chr(T)) > 0) and
                (Pos('2', Chr(p)+Chr(Q)+Chr(R)+Chr(S)+Chr(T)) > 0) and
                (Pos('3', Chr(P)+Chr(Q)+Chr(R)+Chr(S)+Chr(T)) > 0) and
                (Pos('4', Chr(P)+Chr(Q)+Chr(R)+Chr(S)+Chr(T)) > 0) and
                (Pos('5', Chr(P)+Chr(Q)+Chr(R)+Chr(S)+Chr(T)) > 0) then

   begin
   //zde již může dojít k filtraci pravidel obsahující jméno, dům, nápoj a cigarety
   Cigarety := Chr(P)+Chr(Q)+Chr(R)+Chr(S)+Chr(T);
   //Němec kouří cigarety Rothmanns (jmeno4 a cigarety1 pod sebou)
   if Pos('4', Jmeno) = Pos('1', Cigarety) then
   //kuřák cigaret Winfield pije rád pivo (napoj3 a cigarety2 pod sebou)
   if Pos('3', Napoj) = Pos('2', Cigarety) then
   //majitel žlutého domu kouří cigarety Dunhill (dum3 a cigarety3 pod sebou)
   if Pos('3', Dum) = Pos('3', Cigarety) then //68x 3 min 20 s
   //kuřák Malboro má souseda s vodou (napoj5 a cigarety5 vedle sebe)
   if (Pos('5', Napoj)+1 = Pos('5', Cigarety))
   or (Pos('5', Napoj)   = Pos('5', Cigarety)+1) then //24x 3 min 25 s

   //kombinace zvířat
   for U := Ord('1') to Ord('5') do
     for V := Ord('1') to Ord('5') do
       for W := Ord('1') to Ord('5') do
         for X := Ord('1') to Ord('5') do
           for Y := Ord('1') to Ord('5') do
             if (Pos('1', Chr(U)+Chr(V)+Chr(W)+Chr(X)+Chr(Y)) > 0) and
                (Pos('2', Chr(U)+Chr(V)+Chr(W)+Chr(X)+Chr(Y)) > 0) and
                (Pos('3', Chr(U)+Chr(V)+Chr(W)+Chr(X)+Chr(Y)) > 0) and
                (Pos('4', Chr(U)+Chr(V)+Chr(W)+Chr(X)+Chr(Y)) > 0) and
                (Pos('5', Chr(U)+Chr(V)+Chr(W)+Chr(X)+Chr(Y)) > 0) then

   begin //kombinace zvířat, cigaret, nápojů, domů a národností
   Pozice := Pozice + 1;
   Zvire    := Chr(U)+Chr(V)+Chr(W)+Chr(X)+Chr(Y);
   //zbývající zkoušecí procedury obsahující zvíře
           //Švéd chová psa (jmeno2 a zvire1 pod sebou)
           if Pos('2', Jmeno) = Pos('1', Zvire) then
           //kouří Pall Mall, chová papouška (cigarety4 a zvire2 pod sebou)
           if Pos('4', Cigarety) = Pos('2', Zvire) then
           //kuřák Malboro bydlí vedle kočky (cigarety5 a zvire3 vedle sebe)
           if (Pos('5', Cigarety)+1 = Pos('3', Zvire))
           or (Pos('5', Cigarety)   = Pos('3', Zvire)+1) then
           //chová koně, bydlí vedle Dunhill (zvire4 a cigarety3 vedle sebe)
           if (Pos('4', Zvire)+1 = Pos('3', Cigarety))
           or (Pos('4', Zvire)   = Pos('3', Cigarety)+1) then

   //vypíše pouze ty kombinace, které vyhoví všem podmínkám
   RichEdit1.Lines.Add(Jmeno+Dum+Napoj+Cigarety+zvire);
         
           //celkem pro celou úlohu 24 883 200 000 možností
						//120*120*120*120*120
           //po přihlédnutí k pravidlům č. 5, 10 a 13 je jen 199 065 600 možností
                                                //24*24*24*120*120
           //s včasnou selekcí pravidla 1 a 15 je 18662400 možností
                                                //1296*120*120
           //s včasnou selekcí pravidla 3 a 6 je 576000 možností
                                                //4800*120
           //s včasnou selekcí pravidla 4 a 7 a 8 a 14 je 1440 možností
                                                //1440
           //po těchto úsporných opatřeních výpočet trvá asi 2 vteřiny
           
   
    end; //kombinace zvířat, cigaret, nápojů, domů a národnosti
   end; //kombinace cigaret, nápojů, domů a národnosti
  end; //kombinace nápojů, domů a národnosti
 end; //kombinace domů a národnosti
end; //kombinace domů

end;