StudyPlayground / TypeScript-Exercise-Challenges

Typescript exercise & challenges
2 stars 0 forks source link

Type Challenges 2257-MinusOne #62

Open kscory opened 4 months ago

kscory commented 4 months ago

답안을 작성해주세요.

wogha95 commented 3 months ago
SOS
kscory commented 3 months ago
type ParseInt<T extends string> = T extends `${infer U extends number}` ? U : never;

type ReverseString<T extends string> = T extends `${infer F}${infer Rest}` ? `${ReverseString<Rest>}${F}` : ''

type RemoveLeadingZero<T extends string> = T extends '0' ? '0' : T extends `0${infer Rest}` ? RemoveLeadingZero<Rest> : T;

type ReversePositiveMinus<T extends string> = T extends `${infer Digit extends number}${infer Rest}` 
    ? Digit extends 0 
        ? `9${ReversePositiveMinus<Rest>}` 
        : `${[9, 0, 1, 2, 3, 4, 5, 6, 7, 8][Digit]}${Rest}` 
    : never
type PositiveMinus<T extends string> = ParseInt<RemoveLeadingZero<ReverseString<ReversePositiveMinus<ReverseString<T>>>>>

type ReverseNegativeMinus<T extends string> =  T extends '9' ? '01' 
    : T extends `${infer Digit extends number}${infer Rest}` 
        ? Digit extends 9 
            ? `0${ReverseNegativeMinus<Rest>}` 
            : `${[1, 2, 3, 4, 5, 6, 7, 8, 9][Digit]}${Rest}`
    : never

type NegativeMinus<T extends string> = ParseInt<`-${ReverseString<ReverseNegativeMinus<ReverseString<T>>>}`>

type MinusOne<T extends number>  = T extends 0 ? -1
    : `${T}` extends `-${infer Abs}` 
        ? NegativeMinus<Abs>
        : PositiveMinus<`${T}`>

이게 뭔...

bananana0118 commented 3 months ago
type step1ParseInt<T extends string> = T extends `${infer Digit extends number}`?Digit : never;
type step2ReverseString<S extends string> = S extends `${infer First}${infer Rest}` ? `${step2ReverseString<Rest>}${First}` : ""
type step3RemoveLeadingZeros<S extends string> = S extends '0' ? S : S extends `${0}${infer Rest}` ? step3RemoveLeadingZeros<Rest>:S
type step4InternalMinusOne<S extends string> =
  S extends `${infer Digit extends number}${infer Rest}`?
  Digit extends 0?
    `9${step4InternalMinusOne<Rest>}`:
    `${[9, 0, 1, 2, 3, 4, 5, 6, 7, 8][Digit]}${Rest}`
  :never

type MinusOne<T extends number> = T extends 0? -1 :step1ParseInt<step3RemoveLeadingZeros<step2ReverseString<step4InternalMinusOne<step2ReverseString<`${T}`>>>>>

눈물이 주룩주룩