| Autor | Zpráva | ||
|---|---|---|---|
| Kubo2 Profil |
#1 · Zasláno: 23. 4. 2016, 19:24:01
Ahoj,
vytvoril som algoritmus na výpis „diamantu“ (či skôr o 45° otočeného štvorca). Mal by byť tvorený riadkami hviezdičiek ( *), z nich najdlhší má mať n hviezdičiek. Vyzerať by mal pri napr. n = 7 takto:
* *** ***** ******* ***** *** * Na základe poznatku, že ide o pootočený štvorec, je možné potom povedať, že výsledný „obrázok“ bude mať n riadkov a n stĺpcov. Ďalej je možné zistiť, že z každej strany diamantu existuje pravouhlý trojuholník kde odvesna = (n - 1) / 2. Na základe tohto som sa rozhodol rozdeliť si „diamant“ na riadky {(n - i) / -2, ..., 0, ..., (n - i) / 2} kde i je počet hviezdičiek v danom riadku. Táto funkcia zároveň predstavuje aj vzťah medzi počtom hviezdičiek v riadku a počtom medzier v odsadení riadku: odsadenie = (n - i) / 2.
Na vypísanie diamantu som si napísal nasledujúcu iteráciu: var n = 7, diamond = '';
for(
var
line = (n - 1) / 2,
boundary = -line - 1,
indent;
line > boundary;
line--
) {
indent = Math.abs(line);
diamond += ' '.repeat(indent) + '*'.repeat(n - 2 * indent) + '\n';
}
console.log(diamond);No JavaScript sa stále vzpiera a správa sa, akoby vykonával nekonečný cyklus. Uvedený kód som si dokonca aj ručne odkrokoval príkaz po príkaze v JS konzoli, kde som sa dostal do stavu, že diamond obsahoval pekný 7x7 diamant, no keď ho spustím ako celok, už to nefunguje podľa očakávaní. Živú ukážku nebudem odkazovať, pretože by vám z nej zamrzol prehliadač.
Poznámka, kód píšem do riešenia „kata“ na CodeWars. Tam nie je na reťazci definovaná metóda String.prototype.repeat, tak som si definoval vlastnú:
String.prototype.repeat = function(n) {
var ret = this;
while(--n) ret += this;
return ret;
};A vyzerá to, že to práve táto spôsobuje uvedený problém. Pretože keď spustím vyššie uvedený algoritmus s natívnou browserovou implementáciou ''.repeat, vygeneruje mi krásny diamant. Keď to však spustím s mojou dodrôtovanou ''.repeat, prehliadač začne mrznúť.
Problém je však v tom, že ja v mojej trojriadkovej implementácii String.prototype.repeat žiadnu chybu nevidím. Vedeli by ste prosím poradiť, v čom spočíva uvedené chovanie?
(Celý kód, ako ho spúšťam na CodeWars, nájdete tu.) |
||
| Radek9 Profil |
Kubo2:
Kolikrát myslíš, že proběhně ten while, když za n dosadíš 0? ;-) Správně je to např. takhle:
String.prototype.repeat = function(n) {
var ret = '';
while(n--) ret += this;
return ret;
};Úplně správně by to ještě mělo kontrolovat záporné n, ale to v tvém kódu nenastane.
|
||
| Kubo2 Profil |
#3 · Zasláno: 24. 4. 2016, 07:19:38
Radek9:
„Kolikrát myslíš, že proběhně ten while, když za n dosadíš 0? ;-)“
Aha, jasné, ďakujem veľmi pekne! A zrovna táto situácia nastáva, keď je v riadku i = n hviezdičiek a (n - i) / 2 = 0 / 2 = 0 medzier.
„Úplně správně by to ještě mělo kontrolovat záporné n, ale to v tvém kódu nenastane.“
Beriem na vedomie, ešte raz vďaka. :-) |
||
|
Časová prodleva: 10 let
|
|||
0