You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hi, I wanted to make the simplest solution that will be understandable by everyone. Thats why each helper function describes what it should return in every possible case. There are 3 main steps to solve this problem:
checking if the numbers have the same signs
splitting number into digits
checking which array of digits is longer
if both arrays have the same length -> compare the digits one by one
Hope you will enjoy! 😄
Code
enumComparison{Greater,Equal,Lower,}typeDigitMap=[0,1,2,3,4,5,6,7,8,9];typeDigit=DigitMap[number];// 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9typeSDigit=NumberToString<Digit>// "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"typeNumberToString<Textendsnumber>= `${T}`;// NumberToString<123> => "123"typeIfNegative<Textendsstring,B,C>=Textends `-${number}` ? B : C;// IfNegative<"-123", true, false> => truetypeAbs<Textendsstring>=Textends `-${infer N}` ? N : T;// Abs<"-123"> => "123", Abs<"123"> => "123"typeNumberToArray<Textendsnumber,Rextendsunknown[]=[]>=R['length']extendsT ? R : NumberToArray<T,[...R,unknown]>;// NumberToArray<2> => [unknown, unknown]typeIncrement<Textendsnumber>=[...NumberToArray<T>,unknown]['length'];// Increment<3> => 4typeNumberToSDigits<Textendsstring,RextendsSDigit[]=[]>=TextendsSDigit ? [...R,T] :
Textends `${infer X}${infer Y}` ?
XextendsSDigit ? NumberToSDigits<Y,[...R,X]> : never
: never;// NumberToDigits<"123"> => ["1", "2", "3"]typeDigitsComparator<AextendsDigit,BextendsDigit,R=Comparison.Equal>=AextendsB ? R :
Increment<A>extendsDigit ? DigitsComparator<Increment<A>,B,Comparison.Lower> : Comparison.Greater;// DigitsComparator<0, 1> => Comparison.Lower// DigitsComparator<0, 0> => Comparison.Equal// DigitsComparator<1, 0> => Comparison.Greater// Checks if A comes before B with respect to DigitsMap, or vice versa// Wanted function but only for digitstypeEqualLengthComparator<AQextendsSDigit[],BQextendsSDigit[],Iextendsnumber=0,NIextendsnumber=Increment<I>extendsnumber ? Increment<I> : never>=AQ[I]extendsBQ[I] ?
NIextendsAQ['length'] ? Comparison.Equal : EqualLengthComparator<AQ,BQ,NI> :
DigitsComparator<DigitMap[AQ[I]],DigitMap[BQ[I]]>;// EqualLengthComparator<["2", "3"], ["2", "3"]> => Comparison.Equal// EqualLengthComparator<["2", "4"], ["2", "3"]> => Comparison.Greater// EqualLengthComparator<["2", "2"], ["2", "3"]> => Comparison.LowertypeAbsoluteComparator<Aextendsstring,Bextendsstring,AQextendsSDigit[]=NumberToSDigits<A>,BQextendsSDigit[]=NumberToSDigits<B>,AQLextendsnumber=AQ['length'],BQLextendsnumber=BQ['length']>=AQLextendsBQL ? EqualLengthComparator<AQ,BQ> :
AQLextendsDigit ?
BQLextendsDigit ?
DigitsComparator<AQL,BQL> : // AQL and BQL are digitsComparison.Lower// AQL is digit, but BQL is number
:
BQLextendsDigit ?
Comparison.Greater : // BQL is digit, but AQL is numberAbsoluteComparator<NumberToString<AQL>,NumberToString<BQL>>// AQL and BQL are numbers;typeInverse<TextendsComparison>=TextendsComparison.Equal ?
Comparison.Equal :
TextendsComparison.Greater ? Comparison.Lower : Comparison.Greater;// Inverse<Comparison.Equal> => Comparison.Equal// Inverse<Comparison.Lower> => Comparison.Greater// Inverse<Comparison.Greater> => Comparison.LowertypeNumberComparator<Aextendsstring,Bextendsstring>=AextendsB ? Comparison.Equal :
IfNegative<A,IfNegative<B,Inverse<AbsoluteComparator<Abs<A>,Abs<B>>>,// A and B are negativeComparison.Lower// A is negative, but B is positive>,IfNegative<B,Comparison.Greater,// A is positive, but B is negativeAbsoluteComparator<A,B>// A and B are positive>>;typeComparator<Aextendsnumber,Bextendsnumber>=NumberComparator<NumberToString<A>,NumberToString<B>>;
Test cases
/* _____________ Test Cases _____________ */import{Equal,Expect}from'@type-challenges/utils'typecases=[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>>,]
The text was updated successfully, but these errors were encountered:
274 - Integers Comparator
Hi, I wanted to make the simplest solution that will be understandable by everyone. Thats why each helper function describes what it should return in every possible case. There are 3 main steps to solve this problem:
Hope you will enjoy! 😄
Code
Test cases
The text was updated successfully, but these errors were encountered: