이 문제에서 T > U와 같은 GreaterThan<T, U>를 구현해야 합니다.
음수는 고려하지 않습니다
In This Challenge, You should implement a type GreaterThan<T, U> like T > U
Negative numbers do not need to be considered.
type StringToNumber<S extends string>=
S extends `${infer R extends number}`?
R
:0
type NumberTuple<S extends string,Result extends number[]=[]>=
`${S}` extends `${infer Start}${infer Last}`?
NumberTuple<Last,[...Result,StringToNumber<Start>]>
:[...Result,StringToNumber<S>]
type LinearGreaterThan<A extends number,B extends number,Tmp extends any[]=[]>=
A extends Tmp['length']?false:
B extends Tmp['length']?true:
LinearGreaterThan<A,B,[...Tmp,1]>
type GreaterThanSameLength<T extends number[], U extends number[],LengthArr extends any[]=[],TN extends number=T[LengthArr['length']],UN extends number=U[LengthArr['length']]>=
T['length'] extends LengthArr['length']?
false
:TN extends UN?
GreaterThanSameLength<T,U,[...LengthArr,1]>
:LinearGreaterThan<TN,UN>
type GreaterThanImplement<T extends number[],U extends number[]>=
T['length'] extends U['length']?
GreaterThanSameLength<T,U>
:LinearGreaterThan<T['length'],U['length']>
type GreaterThan<T extends number, U extends number> =
GreaterThanImplement<NumberTuple<`${T}`>,NumberTuple<`${U}`>>
추가 예제가 들어오면서 linear하게 구현하지 못하게 되어 난이도가 상승한 문제이다.
풀이 과정은 다음과 같다.
먼저 숫자를 1자리 숫자 배열로 바꾼다(NumberTuple)
이때 ${S} extends ${infer Start extends number}${infer Last extends number}를 사용하면 0111과 같이 0이 맨 앞에 오는 경우 start와 last가 각각 1,11로 대응되기 때문에
문자열 별로 분리한 후, 그 문자열을 숫자로 바꾸는(StringToNumber) 과정을 사용했다.
T와 U를 숫자 배열로 바꾼 뒤 두 배열의 길이를 비교한다.
1)두 배열의 길이가 다르다면, 두 배열의 길이를 선형적으로 비교한다(LinearGreaterThan)
2)두 배열의 길이가 같다면, 앞에서부터 선형적으로 크기를 비교한다.
'0123456789' extends `${string}${TF}${string}${UF}${string}
다음과 같은 방식을 통해 숫자의 크기 비교를 한 풀이가 있었다.
신박한 풀이인 것 같다.
https://github.com/type-challenges/type-challenges/issues/21721#issuecomment-1480788068