04499-medium-chunk

Back

type _Chunk<T extends any[], U extends number, R extends any[] = []> = T extends [infer F, ...infer rest]
  ? R['length'] extends U
    ? [R, ..._Chunk<rest, U, [F]>]
    : _Chunk<rest, U, [...R, F]>
  : [R]

type Chunk<T extends any[], U extends number> = T extends [] ? [] : _Chunk<T, U>

Solution by rimo030 #32886

// your answers
type Chunk<
	T extends any[],
	N extends number = 1,
	R extends any[] = [],
	C extends any[] = []
> = T extends [infer F, ...infer Rest]
	? C['length'] extends N
		? Chunk<Rest, N, [...R, C], [F]>
		: Chunk<Rest, N, R, [...C, F]>
	: [...R, ...(C['length'] extends 0 ? [] : [C])];

Solution by TRIS-H #31637

type Chunk<
  T extends any[],
  N extends number,
  Arr extends unknown[] = []
> = Arr["length"] extends N
  ? [Arr, ...Chunk<T, N>]
  : T extends [infer First, ...infer res]
  ? Chunk<res, N, [...Arr, First]>
  : Arr["length"] extends 0
  ? []
  : [Arr];

Solution by sunsunmonkey #31542

type NumberToArray<T extends number, U extends boolean[] = []> = 
  U['length'] extends T ?
  U :
  NumberToArray<T, [...U, true]>

type TakeFirst<T extends unknown[], S extends number, U extends unknown[] = []> = 
  U['length'] extends S ?
  U :
  T extends [infer F, ...infer Rest] ?
  TakeFirst<Rest, S, [...U, F]> :
  T

type PopFirst<T extends unknown[], S extends number, U extends unknown[] = []> = 
  U['length'] extends S ?
  T :
  T extends [infer _, ...infer Rest] ?
  PopFirst<Rest, S, [...U, true]> : 
  T

type WrapChunks<T extends unknown[], S extends number> = 
  PopFirst<T, S>['length'] extends 0 ?
  [T] :
  [TakeFirst<T, S>, ...Chunk<PopFirst<T, S>, S>]

type Chunk<T extends unknown[], S extends number> =
  T['length'] extends 0 ?
  [] :
  WrapChunks<T, S>

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Chunk<[], 1>, []>>,
  Expect<Equal<Chunk<[1, 2, 3], 1>, [[1], [2], [3]]>>,
  Expect<Equal<Chunk<[1, 2, 3], 2>, [[1, 2], [3]]>>,
  Expect<Equal<Chunk<[1, 2, 3, 4], 2>, [[1, 2], [3, 4]]>>,
  Expect<Equal<Chunk<[1, 2, 3, 4], 5>, [[1, 2, 3, 4]]>>,
  Expect<Equal<Chunk<[1, true, 2, false], 2>, [[1, true], [2, false]]>>,
]

Solution by gearonix #30915

type Chunk<T extends unknown[], N extends number, C extends unknown[] = [], R extends unknown[] = []> = T extends [
  infer F,
  ...infer Rest,
]
  ? C['length'] extends N
    ? Chunk<Rest, N, [F], [...R, C]>
    : Chunk<Rest, N, [...C, F], [...R]>
  : [...R, C];

Solution by leejaehyup #30829

type Chunk<T extends readonly any[], N extends number, C extends any[] = [], R extends any[] = []> =
  C['length'] extends N
    ? Chunk<T, N, [], [...R, C]>
    : T extends [infer TF, ...infer TR]
      ? Chunk<TR, N, [...C, TF], R>
      : C extends []
        ? R
        : [...R, C]

Solution by matallui #30809

type Chunk<T extends any[], N extends number, C extends any[] = [], Result extends any[] = []> =
  C['length'] extends N
    ? Chunk<T, N, [], [...Result, C]>
    : T extends [infer F, ...infer Rest]
      ? Chunk<Rest, N, [...C, F], Result>
      : C extends []
        ? Result
        : [...Result, C]

Solution by jazelly #30452

// your answers๏ผŒ// ๅขžๅŠ ไธ€ไธชC่ฎฐๅฝ•chunk็š„็ป“ๆžœ
type Chunk<
	T extends unknown[],
	U extends number,
	C extends unknown[] = []
> = T extends [infer F, ...infer R]
	? Equal<C['length'], U> extends true
		? [C, ...Chunk<T, U, []>]
		: Chunk<R, U, [...C, F]>
	: C extends []
	? []
	: [C]

Solution by bebusy007 #30017

type Chunk<T extends any[], N extends number, A extends any[] = [], S extends any[] = []> =
  T extends [infer F, ...infer Rest]
    ? A['length'] extends N
      ? Chunk<Rest, N, [F], [...S, A]>
      : Chunk<Rest, N, [...A, F], S>
    : A['length'] extends 0 ? S : [...S, A]

Solution by hesoso #29841

type Chunk<
  Tuple extends unknown[],
  N extends number,
  Res extends unknown[] = [],
  Pack extends unknown[] = []
> = Tuple extends [infer Head, ...infer Tail]
  ? Pack["length"] extends N
    ? Chunk<Tail, N, [...Res, Pack], [Head]>
    : Chunk<Tail, N, Res, [...Pack, Head]>
  : Pack extends []
  ? Res
  : [...Res, Pack];

Solution by idebbarh #28842

type Pop<T extends any[], C extends number, S extends any[] = []> = S['length'] extends C
  ? S
  : T extends []
  ? S
  : T extends [infer First, ...infer Rest]
  ? Pop<Rest, C, [...S, First]>
  : never

type Chunk<T extends any[], C extends number> = T extends []
  ? T
  : T extends [...Pop<T, C>, ...infer Rest]
  ? [Pop<T, C>, ...Chunk<Rest, C>]
  : never;

Solution by JohnhanLiu #28768

type Chunk<
  T extends unknown[],
  Size extends number,
  Chunks extends unknown[] = [],
  Count extends unknown[] = [],
  Res extends unknown[] = []
> = Count["length"] extends Size
  ? Chunk<T, Size, [], [], [...Res, Chunks]>
  : T extends [infer F, ...infer R]
  ? Chunk<R, Size, [...Chunks, F], [...Count, unknown], Res>
  : Chunks["length"] extends 0
  ? Res
  : [...Res, Chunks];

Solution by DoubleWoodLin #28743

type Chunk<
  T extends readonly unknown[],
  N extends number = 1,
  Item extends unknown[] = [],
  Result extends unknown[] = []> = T extends [] ? Item extends [] ? Result : [...Result, Item] : T extends [infer Pre, ...infer Next]
    ? [...Item, Pre]['length'] extends N
        ? Chunk<Next, N, [], [...Result, [...Item, Pre]]>
        : Chunk<Next, N, [...Item, Pre], [...Result]>
    : Result

Solution by jiechliu #27701

type Chunk<
  T extends any[],
  Y extends number,
  N extends any[] = [],
  M extends any[] = []
> = T extends [infer F, ...(infer R)]
  ? N["length"] extends Y
    ? Chunk<T, Y, [], [...M, N]>
    : Chunk<R, Y, [...N, F], M>
  : N extends []
  ? M
  : [...M, N];

Solution by smileboyi #27075

type Chunk<T extends unknown[],num extends number,i extends unknown[] = [],arr extends unknown[][] = []> = T extends [] ? i extends [] ? arr : [...arr,i] : 
    T extends [infer A,...infer B] ?  
    i['length'] extends num ? Chunk<B,num,[A],[...arr,i]>:  
    Chunk<B,num,[...i,A],arr> : arr

Solution by WangZiChu199910252255 #26691

// your answers
type ChunkIter<A extends any[], L extends number, R extends any[] = []>
  = A extends [infer F, ...infer T] ?
    R['length'] extends L ? [R, ...ChunkIter<T, L, [F]>] : ChunkIter<T, L, [...R, F]>
    : [R]
type Chunk<A extends any[], L extends number> = A extends [] ? [] : ChunkIter<A, L>

Solution by adoin #26248

type Chunk<T extends unknown[], N extends number, R extends unknown[] = []> = T extends [infer First, ...infer Rest]
  ? R['length'] extends N
   ? [R, ...Chunk<Rest, N, [First]>]
   : [...Chunk<Rest, N, [...R, First]>]
  : R['length'] extends 0 ? [] : [R]

Solution by retkiewi #25914

// your answers
type FixLengthTuple<N extends number, A extends any[] = []> = 
  A['length'] extends N 
    ? A
    : FixLengthTuple<N, [...A, any]>



type Chunk<T extends any[], U extends number> = 
  T extends [...FixLengthTuple<U> , ...infer Rest] // ่ฟ™ๆ ทๅญ Rest ๅฐฑ็ฉบๅ‡บไบ†ๅ‰้ข U ไธช Element
    ? T extends [...infer R, ...Rest] // R ๅฐฑๆ˜ฏๅ‰ U ไธช Element ็ป„ๆˆ็š„ Array
      ? [R, ...Chunk<Rest, U>]
      : []
    : T extends [] 
      ? []
      : [T]

Solution by kiki-zjq #25299

type FixLengthTuple<N extends number, A extends any[] = []> = 
  A['length'] extends N 
    ? A
    : FixLengthTuple<N, [...A, any]>

type Chunk<T extends any[], U extends number> = 
  T extends [...FixLengthTuple<U> , ...infer Rest]
    ? T extends [...infer R, ...Rest]
      ? [R, ...Chunk<Rest, U>]
      : []
    : T extends [] 
      ? []
      : [T]

Solution by Minato1123 #25120

type Chunk<T extends unknown[], U extends number, Result extends unknown[] = []> = T extends [infer First, ...infer Rest]
? Result['length'] extends U
  ? [Result, ...Chunk<T, U>]
  : Chunk<Rest, U, [...Result, First]> 
: Result extends []
  ? Result
  : [Result]

Solution by NeylonR #25052

4499 - Chunk

Another lodash inspired challenge: Chunk asks us to take an array and split it into... well... chunks. It seems hard at first when you consider needing to handle remainders that aren't divisible by the chunk size, but don't worry: it all works out well in the end!

๐ŸŽฅ Video Explanation

Release Date: 2023-03-10 19:00 UTC

Chunk

๐Ÿ”ข Code

// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'

type A1 = Chunk<[], 1>;
type B1 = [];
type C1 = Expect<Equal<A1, B1>>;

type A2 = Chunk<[1, 2, 3], 1>;
type B2 = [[1], [2], [3]];
type C2 = Expect<Equal<A2, B2>>;

type A3 = Chunk<[1, 2, 3], 2>;
type B3 = [[1, 2], [3]];
type C3 = Expect<Equal<A3, B3>>;

type A4 = Chunk<[1, 2, 3, 4], 2>;
type B4 = [[1, 2], [3, 4]];
type C4 = Expect<Equal<A4, B4>>;

type A5 = Chunk<[1, 2, 3, 4], 5>;
type B5 = [[1, 2, 3, 4]];
type C5 = Expect<Equal<A5, B5>>;

type A6 = Chunk<[1, true, 2, false], 2>;
type B6 = [[1, true], [2, false]];
type C6 = Expect<Equal<A6, B6>>;

// ============= Your Code Here =============
type Chunk<
  T extends unknown[],
  U extends number,
  Acc extends unknown[] = [],
> =
  Acc['length'] extends U
  ? [Acc, ...Chunk<T, U>] // we reached our chunk size
  : T extends [infer Head, ...infer Tail]
    ? Chunk<Tail, U, [...Acc, Head]>
    : Acc extends []
      ? Acc
      : [Acc]
;

type Chunk<
    T, 
    U extends number, 
    Temp extends unknown[] = [],
    Acc extends unknown[] = []
> =
  T extends [infer Head, ...infer Tail]
  ? Temp['length'] extends U
    ? Chunk<Tail, U, [Head], [...Acc, Temp]>
    : Chunk<Tail, U, [...Temp, Head], Acc>
  : Temp['length'] extends 0
    ? Acc
    : [...Acc, Temp]
;

type Chunk<
  T extends any[],
  U extends number = 1,
  Acc extends any[] = []
> =
  T extends [infer Head, ...infer Tail]
  ? Acc['length'] extends U
    ? [Acc, ...Chunk<T, U>]
    : Chunk<Tail, U, [...Acc, Head]>
  : Acc['length'] extends 0
    ? Acc
    : [Acc]

โž• More Solutions

For more video solutions to other challenges: see the umbrella list! https://github.com/type-challenges/type-challenges/issues/21338

Solution by dimitropoulos #24329

// your answers
type Chunk<
    T extends any[],
    N extends number,
    res extends any[] = [],
    item extends any[] = []
> = item['length'] extends N
    ? Chunk<T, N, [...res, item], []>
    : T extends [infer Left, ...infer Rest]
    ? Chunk<Rest, N, res, [...item, Left]>
    : item['length'] extends 0
    ? res
    : [...res, item]

Solution by studymachiney #24074

type Chunk<T extends any[], U extends number, _Collector extends any[] = []> =
  T extends [infer F, ...infer R] ?
  _Collector[`length`] extends U ? [_Collector, ...Chunk<T, U/*,[]*/>] : Chunk<R, U, [..._Collector, F]> :
  _Collector extends [] ? []/*็ฉบๆ•ฐ็ป„*/ : [_Collector];  //return&pop

// old way
// type Collector<T extends any[], U extends number, _Cluster extends any[] = []> = T extends [infer F, ...infer R] ? (U extends _Cluster["length"] ? [_Cluster, ...Collector<T, U>] : Collector<R, U, [..._Cluster, F]>) : [_Cluster];

// type Chunk<T extends any[], U extends (`${U}` extends `-${number}` | `0` ? never : number)> = T extends [] ? [] : Collector<T, U>;

Solution by E-uler #23970

type Chunk<T extends any[], U extends number, Z extends any[][] = [], O extends any[] = []> = T extends [infer F, ...infer R]
    ? [...O, F]['length'] extends U ? Chunk<R, U, [...Z, [...O, F]]> : Chunk<R, U, Z, [...O, F]>
    : O['length'] extends 0 ? Z : [...Z, O]

Solution by RBL3 #23611

type Chunk<T extends unknown[], N extends number, A extends unknown[] = [], B extends unknown[] = []> = B['length'] extends N ? Chunk<T, N, [...A, B], []> : T extends [infer L, ...infer R] ? Chunk<R, N, A, [...B, L]> : B extends [] ? A : [...A, B]

Solution by asurewall #23169

type Chunk<
  L extends any[],
  Limit extends number,
  U extends any[] = [],
  C extends any[] = []
> = C["length"] extends Limit
  ? Chunk<L, Limit, [...U, C], []>
  : L extends [infer F, ...infer R]
    ? Chunk<R, Limit, U, [...C, F]>
    : C extends [] ? U: [...U, C];

Solution by snakeUni #22935

type Chunk<
  L extends any[],
  Limit extends number,
  U extends any[] = [],
  C extends any[] = []
> = C["length"] extends Limit
  ? Chunk<L, Limit, [...U, C], []>
  : L extends [infer F, ...infer R]
    ? Chunk<R, Limit, U, [...C, F]>
    : C extends [] ? U: [...U, C];

Solution by coderyoo1 #22878

// your answers
type Chunk<
  A extends unknown[],
  Num extends number,
  Saved extends unknown[] = [],
  Counter extends unknown[] = [],
  Result extends unknown[] = []
> = A extends [infer F, ...infer Rest]
  ? [...Counter, unknown]['length'] extends Num
    ? Chunk<Rest, Num, [], [], [...Result, [...Saved, F]]>
    : Chunk<Rest, Num, [...Saved, F], [unknown, ...Counter], [...Result]>
  : Saved['length'] extends 0 
    ? Result 
    : [...Result, Saved]

Solution by jxhhdx #22726

type Chunk<
  T extends unknown[],
  N,
  Saved extends unknown[] = []
> = Saved["length"] extends N
  ? [Saved, ...Chunk<T, N>]
  : T extends [infer A, ...infer B]
  ? B extends []
    ? [[...Saved, A]]
    : Chunk<B, N, [...Saved, A]>
  : [];

Solution by codeisneverodd #22334

type Chunk<
  T extends unknown[],
  N extends number,
  CurrentChunk extends unknown[] = []
> = CurrentChunk["length"] extends N
  ? [CurrentChunk, ...Chunk<T, N, []>]
  : T extends [infer First, ...infer Remainder]
  ? Chunk<Remainder, N, [...CurrentChunk, First]>
  : CurrentChunk extends []
  ? []
  : [CurrentChunk];

Solution by gaac510 #21192