Open rimo030 opened 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>>, ]