Autor Zpráva
Kubo2
Profil
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
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. :-)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0