Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 244 · 27 sierpnia 2026 · Trudna

    Powtórz

    Zaimplementuj Repeat<S, N>, aby sklejał łańcuch S dokładnie N razy. Powtórzenie zero razy daje pusty łańcuch.

    01

    Spróbuj rozwiązać samodzielnie

    Par 4

    Zagadka

    repeat-string.ts
    Podejście 1 z 4Jeszcze nie sprawdzone

    Zastąp ??? — rozwiązanie sprawdzamy przypadkami poniżej. Tab wcina; naciśnij Escape, a potem Tab, by wyjść fokusem.

    Testy

    4
    • Repeat<'ab', 3>—
      → 'ababab'
    • Repeat<'x', 0>—
      → ''
    • Repeat<'x', 1>—
      → 'x'
    • Repeat<'-', 5>—
      → '-----'

    Jak oceniamy test Dokładna równość typów, nie przypisywalność — przecięcie to nie to samo co spłaszczony obiekt.

    Jak poszło innym

    Tę zagadkę rozwiązało jak dotąd mniej niż 5 osób. Rozkład pojawi się, gdy próbka będzie na tyle duża, by coś znaczyć.

    Gra na krótkim dystansie

    Najmniej znaków

    Nie ma jeszcze publicznych wyników.

    Archiwum
    02

    Rozwiązanie z komentarzem

    Opublikowano 28 sierpnia 2026

    Rozwiązanie

    type Repeat<
      S extends string,
      N extends number,
      Acc extends unknown[] = [],
    > = Acc['length'] extends N ? '' : `${S}${Repeat<S, N, [...Acc, unknown]>}`

    Najczęstsza błędna odpowiedź

    type Repeat<
      S extends string,
      N extends number,
      Acc extends unknown[] = [],
    > = Acc['length'] extends N ? S : `${S}${Repeat<S, N, [...Acc, unknown]>}`

    Przypadek bazowy wypuszcza jedną kopię za dużo. Zwrócenie S, gdy licznik jest pełny, sprawia, że krok kończący też dokłada swoje, więc Repeat<"ab", 3> daje cztery kopie — a Repeat<"x", 0> zwraca "x", choć powinien nie zwrócić nic.

    Linia po linii

    1. Acc['length'] extends N ? ''

      Przypadek bazowy musi być *elementem neutralnym* budowanej operacji. Dla konkatenacji jest nim pusty łańcuch — dokładnie tak jak [] przy budowaniu krotki i 0 przy dodawaniu liczb.

    2. [...Acc, unknown]

      Akumulator trzyma unknown, bo jego zawartość nie ma znaczenia — odczytywana jest tylko długość. To licznik kresek, a nie kolekcja.

    Do zapamiętania

    Gdy pętla na typach myli się o jeden, patrz na to, co zwraca przypadek bazowy, a nie na krok rekurencyjny. Gałąź kończąca powinna dokładać element neutralny, a nie kolejną kopię ładunku.

    Wykorzystuje