/** * Je nutné napsat asynchronní funkci, * která bude "spát" zadaný počet milisekund, * a poté úspěšně dokončí */ function sleep(duration) { } // Příklad const startTime = Date.now(); console.log("Začínám spát..."); sleep(2000).then(() => { console.log("Probudil se po 2 sekundách!"); console.log("Uplynulý čas: ", Date.now() - startTime); }); sleep(1000).then(() => { console.log("Probudil se po 1 sekundě!"); console.log("Uplynulý čas: ", Date.now() - startTime); });
Frontend
/** * Implementujte metodu times pro číselný objekt. * Funkce by měla přijmout callback a volat jej * stanovený početkrát s indexem aktuální iterace. */ Number.prototype.times = function (callback) { const n = Number(this); for (let i = 0; i < n; i++) { callback(i); } } // Příklady console.clear(); (3).times(console.log) // 0 // 1 // 2
Jak optimalizovat algoritmus průniku?
Rozšiřte Array.prototype metodou, která seskupí prvky pole podle klíče vypočítaného předanou funkcí, a vrátí objekt, kde každému klíči odpovídá pole prvků. Vysvětlete, co se stane, pokud funkce výpočtu klíče vrátí něco, co není řetězec nebo číslo.
/* Jsou zde tři části kódu. Je třeba napsat výsledek každého console.log. */ var n = 1; function f(n) { n = 3; } f(n); console.log(n); // ?? // ---------------- var obj = { a: 1 }; function f1(o) { o.a = 5; } f1(obj); console.log(obj); // ?? // ---------------- var obj = { a: 1 }; function f2(o) { o = { hello: 1 }; } f2(obj);
/** * Je třeba napsat funkci strjoin, * která spojí řetězce pomocí oddělovače. */ function strjoin() { // kód zde } console.log(strjoin('a', 'b', 'c')) // 'a.b.c' console.log(strjoin('a', 'b', 'c', 'd', 'e', 'f')) // 'a-b-c-d-e-f'
/* Dvě seřazené seznamy s intervaly přítomnosti uživatelů online během dne jsou dány. Začátek intervalu je striktně menší než konec. Je třeba vypočítat intervaly, kdy byli oba uživatelé online. Intervaly jsou uvedeny v hodinách, přičemž mohou být od 0 do 24. */ průnik( [[8, 12], [17, 22]], [[5, 11], [14, 18], [20, 23]] )// [[8, 11], [17, 18], [20, 22]] průnik( [[9, 15], [18, 21]], [[10, 14], [21, 22]] )// [[10, 14]] function průnik(uživatel1, uživatel2) { // napište svůj kód sem }
Přepište funkci strjoin bez použití rest parametrů, místo nich použijte objekt arguments.
Jak se změní asymptotická složitost a spotřeba paměti v úloze camelCase → snake_case, pokud je výsledek sestaven spojováním řetězců místo pole znaků?
Jak dlouho pracujete ve společnosti?
// Dostáváte řetězec složený z latinských písmen, mezer a interpunkce. // Řetězec se nazývá pangram, pokud obsahuje alespoň jednou každé z 26 písmen. Určete, zda je řetězec pangram. const LETTERS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']; function isPangram(text) { // váš kód zde } console.log(isPangram(`A pangram or holoalphabetic sentence is a using every letter of a given alphabet at least once.`)); // => console.log(isPangram('Waltz, bad nymph, for quick jigs vex.'))
V prototypu reklamní sítě je prodej reklamních míst organizován následovně: kupující předem uvádějí svou cenu, a na každé reklamní místo odpovídají, zda jsou ochotni ho koupit nebo ne. Je třeba implementovat funkci, která před prodejem reklamního místa bude čekat na souhlas nebo odmítnutí od kupujících s nejvyšší nabídkou, a poté prodá reklamní místo kupujícímu s nejvyšší nabídkou z těch, kteří souhlasili. Odpověď z funkce musí být co nejrychlejší. Je třeba vrátit index kupujícího. Příklady: Kupující nabízejí ceny 1, 5, 10 Kupující s nabídkou 10 odpověděl odmítnutím Kupující s nabídkou 1 odpověděl souhlasem // Ještě čekáme, protože může odpovědět kupující s cenou 5 Kupující s nabídkou 5 odpověděl souhlasem // Vybereme kupujícího s nabídkou 5 ------------ Kupující nabízejí ceny 1, 5, 10 Kupující s nabídkou 10 odpověděl odmítnutím Kupující s nabídkou 5 odpověděl souhlasem // Nečekáme na odpověď od kupujícího s nabídkou 1 - jeho určitě nevybereme ------------ Kupující nabízejí ceny 1, 2 Kupující s nabídkou 1 odpověděl odmítnutím Kupující s nabídkou 2 odpověděl odmítnutím // Nevybereme žádného kupujícího type Buyer = { price: number, accepts: () => Promise<boolean>, } async function bestBuyer(buyers) { const sorted = buyers.map((buyer, index) => ({buyer, index})) .sort((a, b) => a.buyer.price - b.buyer.price); const promise = sorted.map(({buyer}) => buyer.accepts()); for (let i = 0; i < sorted.length; i++) { const accepted = await promise[i]; if (accepted) { return sorted[i].index; } } if (await buyers[0].accepts()) { return 0; } return -1; }
// Je nutné implementovat metodu groupBy, která rozšiřuje standardní metody polí. // Metoda by měla vracet seskupenou verzi pole - objekt, // ve kterém je každý klíč výsledkem provedení předané funkce fn(arr[i]), // a každá hodnota je pole obsahující všechny prvky původního pole s tímto klíčem. // kód zde // Příklad 1 const array1 = [ { id: 1 }, { id: 1 }, { id: 2 } ]; const fn = (item) => item.id; console.log(array1.groupBy(fn)); // { // 1: [{ id: 1 }, { id : 1 }], // 2: [{ id: 2 }] // } // Příklad 2 const array2 = [1, 2, 3]; console.log(array2.groupBy(String)); // { // "1": [1], // "2": [2], // "3": [3] // } // Příklad 3 const array3 = [3.3, 0.5, 1.4]; console.log(array3.groupBy(Math.round)); // { // 3: [3.3], // 1: [0.5, 1.4] // }
// a každá hodnota je pole obsahující všechny prvky původního pole s tímto klíčem. // kód zde // Příklad 1 const array1 = [ { id: 1 }, { id: 1 }, { id: 2 } ]; const fn = (item) => item.id; console.log(array1.groupBy(fn)); // { // 1: [{ id: 1 }, { id: 1 }], // 2: [{ id: 2 }] // } // Příklad 2 const array2 = [1, 2, 3]; console.log(array2.groupBy(String));
Napište funkci tries(n), která volá funkci aus až nkrát: vrací první úspěšný výsledek, a pokud všechny pokusy selžou, vyhodí poslední chybu.
Proč nelze použít šipkovou funkci pro groupBy? Co bude this ve šipce?
Proč je for...of zvýrazněno červeně v TypeScriptu, zatímco běžný for ne?
Jaká jsou omezení rekurzivního průchodu stromem? Čím se liší průchod do hloubky (DFS) od průchodu do šířky (BFS)? Jak lze průchod stromem realizovat bez rekurze?
/* Je nutné implementovat metodu intersection, která rozšiřuje standardní metody množin (Set). Metoda přijímá jinou množinu jako parametr a vrací novou množinu, která je průnikem původní a předané množiny, tj. obsahuje pouze ty prvky, které jsou v obou množinách. */ // váš kód const set1 = new Set([1, 2, 3, 4]); const set2 = new Set([3, 4, 5, 6, 7, 8]); console.log(...set1.intersection(set2)) // 3 4 --- Set.prototype.intersection = function (set2) { const result = new Set(); for(const value of this) { if (set2.has(value)) result.add(value); } return result; } const set1 = new Set([1, 2, 3, 4]); const set2 = new Set([3, 4, 5, 6, 7, 8]); console.log(...set1.intersection(set2)) // 3 4
Jak jinak lze získat číselnou hodnotu z this (kromě Number(this))?