Sobes.tech

Frontend

/** * 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); });

171

/** * 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

171

Jak optimalizovat algoritmus průniku?

169

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.

169

/* 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);

166

/** * 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'

166

/* 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 }

166

Přepište funkci strjoin bez použití rest parametrů, místo nich použijte objekt arguments.

164

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ů?

161

Jak dlouho pracujete ve společnosti?

161

// 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.'))

160

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

160

// 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] // }

160

// 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));

159

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.

157

Proč nelze použít šipkovou funkci pro groupBy? Co bude this ve šipce?

155

Proč je for...of zvýrazněno červeně v TypeScriptu, zatímco běžný for ne?

154

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?

153

/* 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

153

Jak jinak lze získat číselnou hodnotu z this (kromě Number(this))?

150
/7