09896-medium-get-middle-element

Back

解法1 - 暴力:

type GetMiddleElement<T extends any[], L extends any[] = [], R extends any[] = [], M extends "L" | "R" = "L"> = T["length"] extends 0
  ? []
  : [...L, ...R]["length"] extends T["length"]
  ? L["length"] extends R["length"]
    ? [[1, ...T][L["length"]], [1, ...T][[...L, 1]["length"]]]
    : [[1, ...T][L["length"]]]
  : M extends "L"
  ? GetMiddleElement<T, [...L, 1], R, "R">
  : GetMiddleElement<T, L, [...R, 1], "L">;

解法2 - 类似动态规划的思路:

type GetMiddleElement<T extends any[]> = T extends 0 | 1 | 2 ? T : T extends [any, infer M, any] ? GetMiddleElement<M> : [];

Solution by tototi5997 #33547

type GetMiddleElement<T extends any[]> = T['length'] extends 0 | 1 | 2
  ? T
  : T extends [infer _, ...infer Rest, infer _]
  ? GetMiddleElement<Rest>
  : never;

Solution by sunupupup #33446

// your answers
type GetMiddleElement<T> = T extends [infer S, ...infer M, infer L]
? M['length'] extends 1
? M : M['length'] extends 0 
? [S,L] : GetMiddleElement<M>
:T

Solution by pea-sys #33270

// 你的答案

type GetMiddleElement<T extends any[]> = T extends [infer L,...infer M , infer R] 
                                                  ? M extends [] 
                                                      ? [L,R]
                                                      : GetMiddleElement<M>
                                                  : T

Solution by shanguoteng #32816

type GetMiddleElement<T extends unknown[]> =  T extends [infer First, ...infer Middle, infer Last]
  ? Middle['length'] extends 1
    ? Middle
    : Middle['length'] extends 0
      ? [First, Last]
      : GetMiddleElement<[...Middle]>
  : T```

Solution by keyurparalkar #32709

// your answers
type GetMiddleElement<T extends any[]> = T extends [] 
  ? [] 
  : T extends [infer Last] 
    ? T 
    : T extends [infer First, infer Last] 
      ? T 
      : T extends [infer First, ...infer Middles extends any[], infer Last]
        ? GetMiddleElement<Middles> 
        : never;

Solution by kakasoo #32163

type GetMiddleElement<T extends any[], U = T> = T extends [
  infer _F,
  ...infer C,
  infer _L
]
  ? C["length"] extends 1 | 2
    ? C
    : GetMiddleElement<C, T>
  : U;

Solution by moonpoet #31021

type GetMiddleElement<T extends any[]> = T extends [infer X, ...infer Y, infer Z] ?
  Y extends [] ? [X, Z] : GetMiddleElement<Y>
  : T

Solution by zzz1220 #30880

// your answers
type GetMiddleElement<T extends unknown[]> =
  T extends [infer F, ...infer M, infer L]
    ? M extends []
      ? [F, L]
      : [M] extends [never]
        ? F
        : GetMiddleElement<M>
    : T

Solution by enochjs #30542

// 你的答案
type GetMiddleElement<T> = T extends [unknown, ...infer R, unknown] ? R extends [] ? T : GetMiddleElement<R> : T

Solution by YE840926098 #30136

type Shift<T> = T extends [any, ...infer Rest] ? Rest : never;

type GetMiddle<T extends unknown[], K extends unknown[]> = T extends [
  infer First,
  infer Second,
  ...any
]
  ? K["length"] extends 0
    ? [First, Second]
    : [First]
  : T;

type GetMiddleElement<
  T extends unknown[],
  Fast extends unknown[] = T,
  Slow extends unknown[] = T
> = Fast extends [any, any, ...infer Rest]
  ? GetMiddleElement<T, Rest, [] extends Rest ? Slow : Shift<Slow>>
  : GetMiddle<Slow, Fast>;

Solution by idebbarh #29942

// 提取构造 // 当 T 长度为 0 | 1 | 2 时,中间元素就是 T 本身 // 然后构造,不断递归,去掉数组第一个和最后一个,提取中间元素,直至满足上面条件

type GetMiddleElement<T extends unknown[]> =
  T['length'] extends 0 | 1 | 2
  ? T
  : T extends [infer F, ...infer M, infer L]
    ? GetMiddleElement<M>
    : never

Solution by stevenaces #29450

type GetMiddleElement<T extends unknown[]> = T extends
  | [infer Midlle]
  | [infer Left, infer Right]
  ? T
  : T extends [infer First, ...infer Rest, infer Last]
  ? GetMiddleElement<Rest>
  : T;

Solution by DoubleWoodLin #28852

type GetMiddleElement<T extends unknown[]> =
  T["length"] extends 0 | 1 | 2 ?
  T :
  T extends [infer _, ...infer Rest, infer _]
    ? GetMiddleElement<Rest>
    : []

Solution by smileboyi #27218

type PlusOne<Number, Current extends any[]= [], Next extends any[] = [...Current, never]> = Number extends Current['length'] ? Next['length'] : PlusOne<Number, Next>
type GetMiddleElement<T extends readonly any[]> = GetMiddleHelper<T>

type GetMiddleHelper<T extends readonly any[], Prev extends 'hi'[] = []> = 
  T extends [infer First, ...infer Rest] 
    ? Rest['length'] extends Prev['length'] 
      ? [First]
      : PlusOne<Prev['length']> extends Rest['length'] ? [First, Rest[0]]: GetMiddleHelper<Rest, ['hi', ...Prev]> 
    : [] // Base Case

Solution by amsuarez99 #26774

type GetMiddleElement<TArray extends any[]> = TArray extends [
  infer Head,
  ...infer Center,
  infer Tail,
]
  ? Center extends []
    ? [Head, Tail]
    : GetMiddleElement<Center>
  : TArray

Solution by valentynpodkradylin #26270

// your answers
type GetMiddleElement<T extends any[]> = T extends [
  infer F,
  ...infer M,
  infer L
]
  ? M["length"] extends 0
    ? [F, L]
    : GetMiddleElement<M>
  : T;

Solution by DvYinPo #25904

// 你的答案
type GetMiddleElement<T extends unknown[]> = 
  T['length'] extends 0 | 1 | 2
  ? T 
  : T extends [infer X, ...infer M, infer Y] 
    ? GetMiddleElement<M>
    : []

Solution by kiki-zjq #25765

type Head<T> = T extends [infer First, ...any[]]
  ? First
  : never
type Tail<T> = T extends [any, ...infer Rest]
  ? Rest
  : []
type Helper<Fast extends unknown[], Slow> = Fast extends [any, any, ...infer Rest]
  ? Helper<Rest, Tail<Slow>>
  : Fast['length'] extends 1
    ? [Head<Tail<Slow>>]
    : [Head<Slow>, Head<Tail<Slow>>]
type GetMiddleElement<T extends unknown[]> = T['length'] extends 0
  ? []
  : Helper<T, [never, ...T]>

Solution by Sun79 #24895

type GetMiddleElement<T extends any[]> = T['length'] extends 0 | 1 | 2
  ? T
  : T extends [infer _, ...infer R, infer __]
  ? GetMiddleElement<R>
  : never;

Solution by JohnLi1999 #24688

// your answers
type GetMiddleElement<T extends unknown[]> = T extends [infer F,...infer M, infer L]
                                              ? M extends []
                                                ? [F,L]
                                                : GetMiddleElement<M>
                                              : T

Solution by studymachiney #24682

type GetMiddleElement<T extends any[]> = T extends [any, ...infer R, any] ? R extends [] ? T : GetMiddleElement<R> : T;

// old way
// type GetMiddleElement<T extends any[]> = T extends [] | [any] | [any, any] ? T :
//   (T extends [any, ...infer R] ?    //[->,...]
//     (R extends [...infer RR, any] ? GetMiddleElement<RR> : T) :   //[...,<-]
//     T);

Solution by E-uler #24518

// your answers
type GetMiddleElement<T extends unknown[]> = T extends [infer F,...infer M, infer L] ?
 M extends [] ?[F,L] : GetMiddleElement<M> : T

Solution by snakeUni #23330

// 你的答案
type GetMiddleElement<T extends unknown[] = []> = T['length']  extends 2 | 1
  ? T
  : T extends [infer L, ...infer M, infer R] 
    ? GetMiddleElement<M>
    : [] 

Solution by aloneWang #23051

// 你的答案
type GetMiddleElement<T> = T extends [unknown, infer Head, ...infer Tail, unknown] ? GetMiddleElement<[Head, ...Tail]> : T

Solution by jxhhdx #22754

type GetMiddleElement<T> = T extends [unknown, infer Head, ...infer Tail, unknown] ? GetMiddleElement<[Head, ...Tail]> : T

Playground

Solution by teamchong #22548

type GetMiddleElement<T extends unknown[]> = T extends [infer A,...infer B,infer C] ? B extends [] ?[A,C] : GetMiddleElement<B> : T

Solution by tororo00 #22445

type GetMiddleElement<T extends unknown[]> =
  T extends [infer _A, infer B, ...infer C, infer _D]
    ? GetMiddleElement<[B, ...C]>
    : T

Solution by drylint #22125

type GetMiddleElement<T extends any[]> = T extends [] ? [] : T['length'] extends 1 ? T : T['length'] extends 2 ? T : T extends [infer F, ...infer M, infer L] ?GetMiddleElement :never

Solution by amcguire704 #22061

type GetMiddleElement<T extends unknown[]> = T['length'] extends 0 | 1 | 2 ? T : 
T extends [infer S, ...infer Next, infer E] ? GetMiddleElement<Next> : never;

Solution by Karamuto #21800