{ 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;