35191-medium-trace

Back

type ValueOf<X> = X extends {[Key in keyof X]: infer Value} ? Value : never;

type Trace<T extends any[][]> = {[Y in keyof T]: ValueOf<{[X in keyof T[Y] as X extends Y ? X : never]: T[Y][X]}>}[number];

It passes

import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Trace<[[1, 2], [3, 4]]>, 1 | 4>>,
  Expect<Equal<Trace<[[0, 1, 1], [2, 0, 2], [3, 3, 0]]>, 0>>,
  Expect<Equal<Trace<[['a', 'b', ''], ['c', '', ''], ['d', 'e', 'f']]>, 'a' | '' | 'f'>>,
]

Solution by ywj3493 #36505

type Trace<T extends any[][], Count extends number[] = []> =
  T extends [infer Head extends any[], ...infer Rest extends any[][]]
    ? Head[Count['length']] | Trace<Rest, [...Count, 0]>
    : never

Solution by poohghg #35972

// your answers 1
type Trace<T extends any[][], K extends unknown[] = []> = T extends [infer F extends unknown[], ...infer R extends any[][]]
  ? Trace<R, [...K, F[K['length']]]>
  : K[number]

// answer 2
type Trace<T extends any[][]> = {[P in keyof T]: T[P][P & keyof T[P]]}[number]

Solution by BruceYuj #35404

Feel happy about this solution 😊

type Trace<T extends any[][], All extends any[] = []> = T extends [
  ...infer R,
  infer L,
]
  ? L extends any[]
    ? R extends any[][]
      ? Trace<R, [...All, L[R["length"]]]>
      : "R is not any[][]"
    : "L is not any[]"
  : All[number];

Solution by StevenJPx2 #35311

type Trace<T extends unknown[][], C extends 1[] = [], R = never> = C['length'] extends T['length']
  ? R
  : Trace<T, [...C, 1], R | T[C['length']][C['length']]>;

Solution by alexandroppolus #35293

type Trace<T extends any[][]> = {[P in keyof T]: T[P][P & keyof T[P]]}[number]

Playground

Solution by teamchong #35247