Na vstupu je string, který obsahuje libovolný text v českém jazyce. Cílem úlohy je naprogramovat funkci, která zjistí, zda je vstup palindrom.
Quote
Palindrom je slovo, věta, číslo nebo melodie (obecně jakákoliv sekvence symbolů), která má tu vlastnost, že ji lze číst v libovolném směru (zprava doleva nebo zleva doprava) a má vždy stejný význam1.
Detaily
Pokud je vstup prázdný, je nevalidní.
Palindrom je validní i když nejsou v druhém směru stejné mezery, interpunkce, a velké/malé znaky.
Uvažuj pouze běžnou interpunkci - ".", "!", "?", ",", ":"
To stejné platí pro diakritiku.
Příklad správného chování
const isPalindrome = (input: string): boolean => { // Zde doplň tělo funkce} // Examples:isPalindrome("Anna"); // trueisPalindrome("Jelenovi pivo nelej!"); // trueisPalindrome("Nepochopen"); // trueisPalindrome("Tohle není palindrom"); // falseisPalindrome("Milá památka. Malovaný sešit, den hyne, partu mámí tiše řeka, taj, mat nemám. Dán si své víno vypil, nesl chrpu, mák. Je den hájů, keř, péče, mé díly, hůl. Pán nemá kuráž, máti volám co nemám rád. I lovec musí lhát. Je lov, má klec i lev. I ten dále já masák nalézám u dubu. Taj? Málo v lese, vílo, do podolí vesel volám: Já tu budu. Má zelánka sama je. Lad? Neti, velice lkám. Volej: Táhli sumce voli, dar. Máme noc. Málo vítám žár u kamen. Na pluhy, lide, meče překuj, a hned! Ej, kam uprchl sen? Lípy voní ve vsi. Snad mámen tam já také řešiti mám utrápený hned. Tiše syna volám: Akta má pálím."); // true - toto vymyslel pan Stanislav Tvrdík a je to český rekord - nejdelší český palindrom
Nápověda - záludnost
Pozor na písmeno Ch.
Nápověda - postup
Začni těmi nejjednoduššími testy, třeba slovo “aha” a od toho se odpíchni.
Kroky, které potřebuješ udělat, se nazývají normalizace.
String nejdříve normalizujeme a potom ho porovnáme se stejným stringem, akorát otočeným.
Musíš vymyslet:
Jak normalizovat string - vyndat z něj bordel, co nás nezajímá
Jak ho otočit
Nápověda - postup 2
Když naprogramuješ následující kroky, budeš mít normalizaci hotovou:
Převeď celý text na malá písmena.
Pořeš písmeno Ch, je to záludnost češtiny.
Odstraň všechny znaky, co tě nezajímají (mezery, interpunkce).
Odstraň diakritiku.
Řešení
Potřeba je si uvědomit, že písmeno čeština má písmeno Ch. Když naivně otočíme string, tak nám vyleze hC.
const charactersToRemoveRegex = /[.,?!:\s]/g;const diacriticRegex = /\p{Diacritic}/gu;const reverseString = (input: string): string => { return input.split("").reverse().join("");};const normalizeString = (input: string): string => { // 1. Převést celý vstup do malých písmen const lowercase = input.toLocaleLowerCase(); // 2. Písmeno Ch nahradíme jenom písmenem H - nemá to na ČESKÝ palindrom vliv const normalizedCzechLetters = lowercase.replaceAll("ch", "h"); // 3. Odstranit všechny znaky, které nás nezajímají const replaced = normalizedCzechLetters.replaceAll( charactersToRemoveRegex, "", ); // 4. Odstranit diakritiku const strippedDiacritics = replaced.normalize("NFD").replace( diacriticRegex, "", ); return strippedDiacritics;};export const isPalindrome = (input: string): boolean => { const normalized = normalizeString(input); if (!normalized) return false; return normalized === reverseString(normalized);};
Rozšíření úlohy
Český palindrom není validní anglický palindrom. Rozšiř funkci tak, aby brala jako argument locale (prozatím dvě hodnoty "cs" a "en") a na základě toho proveď kontrolu.
Footnotes
Silně nedoporučuju citovat Wikipedii. Tady to je OK, ale v maturitní práci je to zločin. ↩