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

274 - Integers Comparator (Including no-limit version) #21929

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

274 - Integers Comparator (Including no-limit version) #21929

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

Comments

@lvjiaxuan
Copy link
Contributor

Playground.

enum Comparison {
  Greater,
  Equal,
  Lower,
}

// # 4425
type _GreaterThanForPos<T extends number, U extends number, _Counter extends 0[] = []> =
  _Counter['length'] extends T
    ? _Counter['length'] extends U
      ? Comparison.Equal
      : Comparison.Lower
    : _Counter['length'] extends U
      ? Comparison.Greater
      : _GreaterThanForPos<T, U, [ ..._Counter, 0 ]>

// Limit version
// type Comparator<
//   A extends number,
//   B extends number,
// > = `${ A },${ B }` extends `-${ infer IA extends number },-${ infer IB extends number }`
//   ? _GreaterThanForPos<IB, IA>
//   : `${ A },${ B }` extends `${ number },-${ number }`
//     ? Comparison.Greater
//     : `${ A },${ B }` extends `-${ number },${ number }`
//       ? Comparison.Lower
//       : _GreaterThanForPos<A, B>


type _RemoveZeroes<T extends string> =
  `${ T }` extends `${ infer A extends string }0${ infer B extends string }`
    ? B extends '' | '0' ? T : _RemoveZeroes<`${ A }${ B }`>
    : T

type _CountStringLength<T extends string, _Counter extends 0[] = []> =
  T extends `${ string }${ infer Rest }`
    ? _CountStringLength<Rest, [ ..._Counter, 0 ]>
    : _Counter['length']

type _ComparatorNumberLengthForPos<
  A extends number,
  B extends number,
  _A extends string = `${ A }` extends `${ infer I extends string }` ? I : never,
  _B extends string = `${ B }` extends `${ infer I extends string }` ? I : never,
> = _GreaterThanForPos<_CountStringLength<_A>, _CountStringLength<_B>>

type _ComparatorEqualLengthForPos<
  A extends number,
  B extends number,
  _A extends string = `${ A }` extends `${ infer I extends string }` ? _RemoveZeroes<I> : never,
  _B extends string = `${ B }` extends `${ infer I extends string }` ? _RemoveZeroes<I> : never,
> = _A extends `${ infer FA extends number }${ infer RestA extends number }`
  ? _B extends `${ infer FB extends number }${ infer RestB extends number }`
    ? FA extends FB
      ? _ComparatorEqualLengthForPos<RestA, RestB>
      : _GreaterThanForPos<FA, FB>
    : never
  : _GreaterThanForPos<A, B>

// No limit
type Comparator<A extends number, B extends number> =
  `${ A },${ B }` extends `-${ infer IA extends number },-${ infer IB extends number }`
    ? _ComparatorNumberLengthForPos<IA, IB> extends Comparison.Equal
      ? _ComparatorEqualLengthForPos<IB, IA>
      : _ComparatorNumberLengthForPos<IB, IA>
    : `${ A },${ B }` extends `${ number },-${ number }`
      ? Comparison.Greater
      : `${ A },${ B }` extends `-${ number },${ number }`
        ? Comparison.Lower
        : _ComparatorNumberLengthForPos<A, B> extends Comparison.Equal
          ? _ComparatorEqualLengthForPos<A, B>
          : _ComparatorNumberLengthForPos<A, B>
@lvjiaxuan lvjiaxuan added answer Share answers/solutions to a question en in English labels Jan 12, 2023
@github-actions github-actions bot added the 274 label Jan 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
274 answer Share answers/solutions to a question en in English
Projects
None yet
Development

No branches or pull requests

1 participant