rimo030 / type-challenges

Collection of TypeScript type challenges with online judge
https://tsch.js.org/
MIT License
3 stars 0 forks source link

no - 274 Integers Comparator #139

Open rimo030 opened 1 week ago

rimo030 commented 1 week ago
enum Comparison {
  Greater,
  Equal,
  Lower,
}

type DigsPrev = {
  '0': 9;
  '1': 0;
  '2': 1;
  '3': 2;
  '4': 3;
  '5': 4;
  '6': 5;
  '7': 6;
  '8': 7;
  '9': 8;
};

type Reverse<T extends string | number | bigint> = `${T}` extends `${infer Head}${infer Tail}`
  ? `${Reverse<Tail>}${Head}`
  : ``;

type SubOne<T extends string>  = 
  T extends `${infer Head}${infer Tail}`
    ? Head extends '0' 
      ? `9${SubOne<Tail>}` 
      : `${DigsPrev[Head & keyof DigsPrev]}${Tail}`
    : never;

type Compare<A extends string, B extends string, R = [SubOne<A>, SubOne<B>]> = R extends [never, never]
    ? Comparison.Equal
    : R extends [string, never] 
      ? Comparison.Greater
      : R extends [never, string]
        ? Comparison.Lower
        : R extends [infer a extends string, infer b extends string]
          ? Compare<a,b>
          : never

type Comparator<A extends number, B extends number> = `${A}` extends `-${any}`
  ? `${B}` extends `-${any}`
    ? Compare<Reverse<B>, Reverse<A>>
    : Comparison.Lower
  : `${B}` extends `-${any}`
    ? Comparison.Greater
    : Compare<Reverse<A>, Reverse<B>>
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Comparator<5, 5>, Comparison.Equal>>,
  Expect<Equal<Comparator<5, 6>, Comparison.Lower>>,
  Expect<Equal<Comparator<5, 8>, Comparison.Lower>>,
  Expect<Equal<Comparator<5, 0>, Comparison.Greater>>,
  Expect<Equal<Comparator<-5, 0>, Comparison.Lower>>,
  Expect<Equal<Comparator<0, 0>, Comparison.Equal>>,
  Expect<Equal<Comparator<0, -5>, Comparison.Greater>>,
  Expect<Equal<Comparator<5, -3>, Comparison.Greater>>,
  Expect<Equal<Comparator<5, -7>, Comparison.Greater>>,
  Expect<Equal<Comparator<-5, -7>, Comparison.Greater>>,
  Expect<Equal<Comparator<-5, -3>, Comparison.Lower>>,
  Expect<Equal<Comparator<-25, -30>, Comparison.Greater>>,
  Expect<Equal<Comparator<15, -23>, Comparison.Greater>>,
  Expect<Equal<Comparator<40, 37>, Comparison.Greater>>,
  Expect<Equal<Comparator<-36, 36>, Comparison.Lower>>,
  Expect<Equal<Comparator<27, 27>, Comparison.Equal>>,
  Expect<Equal<Comparator<-38, -38>, Comparison.Equal>>,

  Expect<Equal<Comparator<1, 100>, Comparison.Lower>>,
  Expect<Equal<Comparator<100, 1>, Comparison.Greater>>,
  Expect<Equal<Comparator<-100, 1>, Comparison.Lower>>,
  Expect<Equal<Comparator<1, -100>, Comparison.Greater>>,
  Expect<Equal<Comparator<-100, -1>, Comparison.Lower>>,
  Expect<Equal<Comparator<-1, -100>, Comparison.Greater>>,

  // Extra tests if you like to challenge yourself!
  Expect<Equal<Comparator<9007199254740992, 9007199254740992>, Comparison.Equal>>,
  Expect<Equal<Comparator<-9007199254740992, -9007199254740992>, Comparison.Equal>>,
  Expect<Equal<Comparator<9007199254740991, 9007199254740992>, Comparison.Lower>>,
  Expect<Equal<Comparator<9007199254740992, 9007199254740991>, Comparison.Greater>>,
  Expect<Equal<Comparator<-9007199254740992, -9007199254740991>, Comparison.Lower>>,
  Expect<Equal<Comparator<-9007199254740991, -9007199254740992>, Comparison.Greater>>,
]