Przejdź do treści
#239 chunk-tuple · par 4

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 239 · 22 sierpnia 2026 · Trudna

    Podziel na części

    Zaimplementuj `Chunk<T, N>`, aby dzielił krotkę na grupy po `N`. Końcową grupę mniejszą niż `N` zachowaj bez zmian.

    01

    Spróbuj rozwiązać samodzielnie

    Par 4

    Zagadka

    chunk-tuple.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
    • Chunk<[1, 2, 3], 2>
      [[1, 2], [3]]
    • Chunk<[1, 2, 3, 4], 2>
      [[1, 2], [3, 4]]
    • Chunk<[], 3>
      []
    • Chunk<[1, 2], 5>
      [[1, 2]]

    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 23 sierpnia 2026

    Rozwiązanie

    type Chunk<
      T extends readonly unknown[],
      N extends number,
      Acc extends unknown[] = [],
    > = Acc['length'] extends N
      ? [Acc, ...Chunk<T, N>]
      : T extends readonly [infer H, ...infer R]
        ? Chunk<R, N, [...Acc, H]>
        : Acc extends []
          ? []
          : [Acc]

    Najczęstsza błędna odpowiedź

    type Chunk<
      T extends readonly unknown[],
      N extends number,
      Acc extends unknown[] = [],
    > = Acc['length'] extends N
      ? [Acc, ...Chunk<T, N>]
      : T extends readonly [infer H, ...infer R]
        ? Chunk<R, N, [...Acc, H]>
        : [Acc]

    Prawie dobrze i błędnie tylko tam, gdzie najtrudniej to zauważyć. Bez strażnika `Acc extends []` puste wejście daje `[[]]` — krotkę z jedną pustą grupą — zamiast `[]`. Wejście dzielące się bez reszty trafia w tę samą ścieżkę i zyskuje pustą grupę na końcu.

    Linia po linii

    1. Acc['length'] extends N

      Test pełnej grupy jest pierwszy, przed obejrzeniem wejścia. Osiągnięcie `N` wypuszcza grupę i zaczyna od nowa z domyślnym pustym akumulatorem, bo `Chunk<T, N>` pomija trzeci argument.

    2. Acc extends [] ? [] : [Acc]

      Wejście się skończyło. Albo ostatnia grupa jest pusta — poprzednia zamknęła się dokładnie na granicy i nie ma czego wypuszczać — albo trzyma krótką grupę końcową, która należy do wyniku.

    Do zapamiętania

    Rekurencje z dwoma wyjściami wymagają sprawdzenia obu. Przypadek graniczny, w którym wejście dzieli się bez reszty, wymyka się najłatwiej — i akurat jego ręcznie pisany przykład zwykle unika.

    Wykorzystuje