Przejdź do treści
webtype.orgwebtype.org

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Nr 229 · 6 sierpnia 2026 · Trudna

    Spłaszcz

    Zaimplementuj Flatten<T>, aby całkowicie spłaszczał zagnieżdżoną krotkę, na dowolną głębokość.

    01

    Spróbuj rozwiązać samodzielnie

    Par 4

    Zagadka

    flatten-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
    • Flatten<[1, [2, 3], 4]>—
      → [1, 2, 3, 4]
    • Flatten<[]>—
      → []
    • Flatten<[[[1]]]>—
      → [1]
    • Flatten<[1, [2, [3, [4]]]]>—
      → [1, 2, 3, 4]

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

    Rozwiązanie

    type Flatten<T extends readonly unknown[]> =
      T extends readonly [infer H, ...infer R]
        ? H extends readonly unknown[]
          ? [...Flatten<H>, ...Flatten<R>]
          : [H, ...Flatten<R>]
        : []

    Najczęstsza błędna odpowiedź

    type Flatten<T extends readonly unknown[]> =
      T extends readonly [infer H, ...infer R]
        ? H extends readonly unknown[]
          ? [...H, ...Flatten<R>]
          : [H, ...Flatten<R>]
        : []

    Rozwinięcie H wprost zdejmuje dokładnie jedną warstwę, więc [[[1]]] spłaszcza się do [[1]] i koniec. Głowę też trzeba spłaszczyć rekurencyjnie — to nie jest jedynie pojemnik do otwarcia, lecz cała zagnieżdżona struktura.

    Linia po linii

    1. H extends readonly unknown[]

      Gałąź decydująca, czy ten element trzeba otworzyć. readonly unknown[] pasuje zarówno do krotek modyfikowalnych, jak i tylko do odczytu, więc żadna nie zostanie wzięta za wartość skalarną.

    2. [...Flatten<H>, ...Flatten<R>]

      Dwa wywołania rekurencyjne: jedno schodzi w zagnieżdżenie, drugie idzie wzdłuż krotki. Ta para czyni spłaszczanie zupełnym, a nie jednopoziomowym.

    Do zapamiętania

    Rekurencja w jednym kierunku przechodzi listę; w dwóch — drzewo. Większość błędów „zeszło tylko o poziom” to brak drugiego wywołania rekurencyjnego.

    Wykorzystuje