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: 8 let
|
0