Najneskorší termín odovzdania: 7.4.2019 (nedeľa) o 21:00
Odovzdávané súbory: NajdiSlovo.java
, Vyskrtavacka.java
, Rebus.java
, Tabulka.java
Doplňujúce požiadavky:
Každý objekt v Jave má metódu hashCode
, ktorá vráti číselný otlačok obsahu objektu. Platí, že objekty s rovnakým obsahom majú rovnaký hash kód.
Z reťazca sa vytratili medzery, no našťastie máme uložený jeho hash kód. Vaša úloha je nasledovná: Do zadaného reťazca bez medzier doplňte medzery tak, aby výsledný reťazec mal rovnaký hash kód ako pôvodný reťazec s medzerami. Medzi každú dvojicu susedných znakov môžete doplniť nanajvýš jednu medzeru (inými slovami v pôvodnom slove medzery neboli na začiatku ani na konci a žiadne 2 medzery neboli susedné).
Vytvorte triedu NajdiSlovo
a v nej metódu najdiRiesenie
, ktorá pre zadaný reťazec bez medzier a hash kód (parametre konštruktora) nájde taký reťazec, ktorý vznikne doplnením medzier do zadaného reťazca a jeho hash kód bude rovnaký, ako bol zadaný. Ak taký reťazec neexistuje, metóda nech vráti null
.
Poznámka: Svoju implementáciu môžete otestovať aj takto:
Uvažujme ľubovoľné prirodzené číslo a jeho zápis v desiatkovej sústave. Predpokladajme, že tento zápis neobsahuje cifru 0. Vyškrtávaním cifier (aspoň jednej ale nie všetkých cifier) v tomto zápise vieme dostať zápisy rôznych iných čísel. Napr. z čísla 313 vieme vyškrtávaním cifier dostať čísla 1 (313), 3 (313 alebo 313), 13 (313), 31 (313), 33 (313). Vytvorte triedu Vyskrtavacka
a v nej metódu generuj
, ktorá vráti množinu všetkých (rôznych) čísel, ktoré vieme dostať vyškrtávaním cifier z desiatkového zápisu zadaného čísla cislo (parameter konštruktora).
Poznámka: Tým, že vyškrtávame aspoň jednu cifru ale nie všetky, vo výslednej množine budú čísla väčšie alebo rovné ako 1 a zároveň ostro menšie ako cislo.
Igor našiel v jednom časopise takýto matematický rébus:
Vložte medzi niektoré cifry čísla 123456789
znamienko +
alebo -
tak, aby výsledok vytvoreného výrazu bol 100.
Igor ako skúsený riešiteľ rébusov rýchlo našiel riešenie: 100 = 123 - 45 - 67 + 89
. Vtedy si ale Igor položil ďalšiu otázku. Koľko rôznych riešení má táto úloha?
Vytvorte pre Igora program, ktorý bude zisťovať, počet rôznych riešení rébusu. Program bude čítať vstup z textového súboru s názvom rebusy.txt
:
123456789 100 123456789 99 12344321 325 111222333 22
Formát súboru je taký, že každý riadok predstavuje jeden rébus ako dve medzerou oddelené čísla. Prvé číslo (nanajvýš 15-ciferné) predstavuje postupnosť cifier a druhé číslo predstavuje požadovaný výsledok po vložení znamienok +
a -
do tejto postupnosti.
Program nech vytvorí výstupný súbor PoctyRieseni.txt
, ktorý bude obsahovať pre každý rébus celkový počet jeho riešení - pre i-ty rébus bude počet jeho riešení zapísaný v i-tom riadku.
11 17 3 60
Nedávno ma zaujala jedna časť TV show zo série Penn&Teller s názvom Úžasná Allison:
Nie, nezaujal ma trik, vďaka ktorému sa je možné "dozvedieť sa" myslené a neskôr napísané číslo, ale prezentácia tohto triku. Myslené číslo sa neodhalí ihneď, ale Allison toto číslo skryje do 16 čísel v tabuľke 4x4 (viac vo videu). Určite sa vám po prezretí videa v hlave vynoria otázky (ak nie, tak sa tak aspoň chvíľu tvárme):
Úloha: Analyzujte možnosti vyplnenia tabuľky v tomto triku. Ako rozumné sa zdá začať s vytvorením programu, ktorý pre zadané číslo X nájde jedno (alebo viaceré?) vyplnenia tabuľky kladnými nenulovými číslami, že príslušné štvorice čísel majú súčet presne X. Uvažujeme tieto štvorice:
Je to menej štvoríc a aj iné štvorice ako bolo v show - kvôli zjednodušeniu. Pri iných videách sa dá vidieť, že Allison tiež od niektorých štvoríc upustila: https://www.youtube.com/channel/UCUSEn9drforS2TNfeSK5RVA/videos
Odovzdajte:
Tabulka.java
s triedou Tabulka
:
Tabulka
implementujte čo najefektívnejšiu metódu vytvorPreCislo
, ktorá pre zadané celé číslo medzi 25 a 99 vráti 2D pole s rozmermi 4x4 vyplnené kladnými nenulovými celými číslami pričom:
x
a
null
.
Tabulka
je kontrolovaná evaluátorom. Pri efektívnej implementácii môžete využiť výsledky analýzy (ak analýza nejaké užitočné vlastnosti, použite ich pri implementácii tejto triedy).
Riešenia, ktoré nebudú obsahovať všetky 3 požadované časti, nebudú hodnotené (ak "akékoľvek podporné zdrojové kódy" tvorí len trieda Tabulka
, nemusíte v rámci tejto druhej časti odovzdávať nič ďalšie).