Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

216 - Slice #21878

Open
lvjiaxuan opened this issue Jan 11, 2023 · 0 comments
Open

216 - Slice #21878

lvjiaxuan opened this issue Jan 11, 2023 · 0 comments
Labels
216 answer Share answers/solutions to a question en in English

Comments

@lvjiaxuan
Copy link
Contributor

It's so extreme level as so much time I had spent to solute it.

Playground.

// #4425
type _GreaterThan<T extends number, U extends number, Arr extends 0[] = []> =
  U extends Arr['length']
    ? T extends Arr['length']
      ? false // 相等
      : true // T 数字更大
    : T extends Arr['length']
      ? false // 先到达 T,证明 U 数字更大
      : _GreaterThan<T, U, [ ...Arr, 0 ]> // 两个都没到达

type _ToPositiveIdx<N extends number, Arr extends unknown[], _Counter extends 0[] = []> =
  `${ N }` extends `-${ infer I extends number }`
    ? _Counter['length'] extends I
      ? Arr['length']
      : Arr extends [ unknown, ...infer Rest ]
        ? _ToPositiveIdx<N, Rest, [ ..._Counter, 0 ]>
        : never
    : N

type _VerifyIdx<A extends number, B extends number, Max extends number> =
  _GreaterThan<A, B> extends true
    ? false
    : _GreaterThan<A, Max> extends true
      ? false
      : _GreaterThan<B, Max> extends true
        ? false
        : true


type Slice<
  Arr extends unknown[],
  Start extends number = 0,
  End extends number = Arr['length'],
  _Idx extends 0[] = [],
  _OverStart extends boolean = false,
  _Result extends unknown[] = [],
  _Start extends number = _ToPositiveIdx<Start, Arr>,
  _End extends number = _ToPositiveIdx<End, Arr>,
  _CurrentValue extends Arr[number] = Arr[_Idx['length']],
  _ValidIdx extends boolean = _VerifyIdx<_Start, _End, Arr['length']>,
> = _ValidIdx extends false
  ? []
  : _Idx['length'] extends _Start
    ? _Idx['length'] extends _End
      ? []
      : Slice<Arr, _Start, _End, [ ..._Idx, 0 ], true, [ _CurrentValue ]>
    : _OverStart extends false
      ? Slice<Arr, _Start, _End, [ ..._Idx, 0 ], false>
      : _Idx['length'] extends _End
        ? _Result
        : Slice<Arr, _Start, _End, [ ..._Idx, 0 ], true, [ ..._Result, _CurrentValue ]>
@lvjiaxuan lvjiaxuan added answer Share answers/solutions to a question en in English labels Jan 11, 2023
@github-actions github-actions bot added the 216 label Jan 11, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
216 answer Share answers/solutions to a question en in English
Projects
None yet
Development

No branches or pull requests

1 participant