Skip to content

Instantly share code, notes, and snippets.

@ljbc1994
Created December 4, 2023 17:21
Show Gist options
  • Save ljbc1994/37d21e15fc1b33920f62f74c820f98c9 to your computer and use it in GitHub Desktop.
Save ljbc1994/37d21e15fc1b33920f62f74c820f98c9 to your computer and use it in GitHub Desktop.
Advent of Code 2023 - Day 1 (Part A)
type NumberArr = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 }
type Count<A, S extends 0[] = []> = A extends S['length'] ? S : Count<A, [...S, 0]>
type Add<A, B> = [...Count<A>, ...Count<B>]['length']
type ParseInt<T extends string>
= T extends `${infer N extends number}` ? N : never;
type Combine<A extends number, B extends number> =
ParseInt<`${A}${B}`>
type Sum<Arr extends number[], Total extends number = 0> = Arr extends [infer First, infer Second, ...infer Rest]
? Rest extends number[]
? First extends number
? Second extends number
? Sum<Rest, Add<Total, Add<First, Second> extends infer S ? S extends number ? S : 0 : 0> extends infer T extends number ? T : 0>
: Total
: Total
: Total
: Total
type Trim<Str extends string> = Str extends `${infer First} ${infer Rest}`
? First extends ''
? Trim<Rest>
: Rest
: Str
type SplitTrim<Str extends string, Char extends string, Acc extends string[] = []> =
Str extends `${infer C}${Char}${infer Rest}`
? SplitTrim<Rest, Char, Trim<C> extends '' ? Acc : [...Acc, Trim<C>]>
: Acc
type GetNumbersFromString<Arr extends string, Acc extends any[] = []> =
Arr extends `${infer First}${infer Rest}`
? First extends keyof NumberArr
? GetNumbersFromString<Rest, [...Acc, NumberArr[First]]>
: GetNumbersFromString<Rest, Acc>
: Acc
type GetFirstAndLastArr<Arr extends any[]> = [
Arr[0],
Arr extends [infer _, ...infer Rest] ? Arr[Rest['length']] : 0
]
type TotalPerLine<Lines extends string[], TotalArr extends number[] = []> =
Lines extends [infer First, ...infer Rest]
? First extends string
? Rest extends string[]
? GetFirstAndLastArr<GetNumbersFromString<First>> extends [infer AFirst, infer ALast]
? AFirst extends number
? ALast extends number
? TotalPerLine<Rest, [...TotalArr, Combine<AFirst, ALast>]>
: TotalArr
: TotalArr
: TotalArr
: TotalArr
: TotalArr
: TotalArr
type Test = `
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet
`
type Result = Sum<TotalPerLine<SplitTrim<Test, '\n'>>>
// ^?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment