31824-hard-length-of-string-3

Back

type ToInt<S> = S extends `0${infer X}` ? ToInt<X> : S extends `${infer N extends number}` ? N : 0;

type Q1 = string;
type Q10 = `${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1}${Q1 & {}}`;
type Q100 = `${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}${Q10}`;
type Q1000 = `${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}${Q100}`;
type Q10k = `${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}${Q1000}`;
type Q100k = `${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}${Q10k}`;

type Len<S, Q extends string, R extends 1[] = []> = S extends `${Q}${infer T}`
  ? Len<T, Q, [...R, 1]>
  : [R['length'], S];

type LengthOfString<S extends string> = Len<S, Q100k> extends [infer A extends number, infer S1]
  ? Len<S1, Q10k> extends [infer B extends number, infer S2]
    ? Len<S2, Q1000> extends [infer C extends number, infer S3]
      ? Len<S3, Q100> extends [infer D extends number, infer S4]
        ? Len<S4, Q10> extends [infer E extends number, infer S5]
          ? Len<S5, Q1> extends [infer F extends number, string]
            ? ToInt<`${A}${B}${C}${D}${E}${F}`>
            : 0
          : 0
        : 0
      : 0
    : 0
  : 0;

Play

Solution by alexandroppolus #33269

type LengthOfString<S extends string> =
  S extends `${infer First extends string}${string}`
    ? NumFrom<LengthAssessment<S, First>['Num']>
  : 0

type LengthAssessment<S extends string, Tenfold extends string> =
  S extends `${Tenfold}${infer _ extends string}`
    ? LengthAssessment<S, Repeat<Tenfold, '10'>> extends infer A extends {Num: string, Rest: string}
      ? A['Rest'] extends `${Repeat<Tenfold, '9'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}9`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '8'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}8`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '7'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}7`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '6'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}6`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '5'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}5`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '4'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}4`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '3'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}3`, Rest: Rest}
      : A['Rest'] extends `${Repeat<Tenfold, '2'>}${infer Rest extends string}`
        ? {Num: `${A['Num']}2`, Rest: Rest}
      : A['Rest'] extends `${Tenfold}${infer Rest extends string}`
        ? {Num: `${A['Num']}1`, Rest: Rest}
      : {Num: `${A['Num']}0`, Rest: A['Rest']}
    : never   // infer A
  : {Num: '', Rest: S}

type Repeat<Ch extends string, N extends string> =
  N extends `${infer P extends string}${keyof Factory}`
    ? Factory<Ch, Repeat<Ch, P>>[N extends `${P}${infer L extends keyof Factory}` ? L : never]
  : ''

type Factory<Ch extends string = '', T extends string = ''> = {
  0: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}`
  1: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}`
  2: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}`
  3: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}`
  4: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}`
  5: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}`
  6: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
  7: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
  8: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
  9: `${T}${T}${T}${T}${T}${T}${T}${T}${T}${T}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}${Ch}`
}

type NumFrom<S extends string> =
  S extends `${infer N extends number}`
    ? number extends N ? never : N
  : never

Playground

Solution by teamchong #33139