Kryptogram je špeciálna rovníca, ktorá pozostáva pseudo-čísel, v ktorých sú číslice vyjadrené pomocou znakov. Takto sa každá číslica stáva neznámou. Našou úlohou je zistiť všetky možné kombinácie číslic, pre ktoré rovnica platí.
Kryptogramatickou rovnicou môže byť napríklad rovnica v tvare:
ABB + ABB + ABB + CBA = BDAE
V rovnici písmená A, B, C, D, E predstavujú päť rôznych číslic, z ktorých môže byť kryptogram zostavený. Hodnoty A, B, C, D, E musia byť teda tiež rôzne, pričom platí: A != B != C != D != E
Žiadne číslo nesmie začínať nulou. Z toho vyplýva skutočnosť, že v horeuvedenej rovnici číslice A, B, C nesmú byť nuly.
Ak má kryptogram x-roznych číslic (neznámych), voláme ho kryptogram x-tého rádu. Horeuvedená rovnica teda predstavuje kryptogram 5-teho rádu, kedže má 5 neznámych.
Napíšme si funkciu, ktorá bude zisťovať rovnosť kryptogramu pre konkrétne hodnoty neznámych. Neznáme budú rovnici odovzdávané prostredníctvom poľa. Pre číslice A, B vypočítame hodnotu pozičného výrazu ABB podľa vzťahu 100 * A + 10 * B + 1 * C a pod.
bool kryptogram (int* pole) { if ( 100 * A + 10 * B + C + 100 * A + 10 * B + C + 100 * C + 10 * B + A == 1000 * B + 100 * D + 10 * A + E ) return true; else return false; }
Funkcia preberie konkrétne hodnoty premenných A, B, C, D, E v poli "pole". Pomocou makra v c++ definujeme, že výraz A zastupuje vo funkcií výraz pole[0], výraz B je ekvivalentný výrazu pole[1], atď:
#define A pole[0] #define B pole[1] ... #define Z pole[25]
Po zavolaní funkcie kryptogram budú konkrétne hodnoty v poli pole[] konvertované na premenné A, B, C ... Ak rovnosť platí, kryptogram vracia hodnotu true.
Ako teda nájsť všetky riešenia kryptogramu ? Jediným riešením je použitie hrubej sily v zmysle dostadzovania všetkých možných kombinácií číslic do kryptogramatickej funkcie. Pre statický počet rôznych číslic môžeme navrhnúť veľmi jednoduchý systém vnorených cyklov. Toto riešenie však je značne primitívne a viazané iba na konkrétny kryptogram. Ak pridáme ďalšie neznáme do kryptogramu - zmeníme jeho rád, treba ručne pridať aj ďalšie vnorené cykly.
Pre kryptogram 5-teho stupňa (neznáme A, B, C, D, E) by sme museli použiť 5 návzájom vnorených cyklov:
for (int A=0; B