Created
December 4, 2023 17:21
-
-
Save ljbc1994/37d21e15fc1b33920f62f74c820f98c9 to your computer and use it in GitHub Desktop.
Advent of Code 2023 - Day 1 (Part A)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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