Skip to content

Commit c40f6e2

Browse files
committed
add day 15
1 parent d76eed6 commit c40f6e2

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

2024/15/index.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import type { Expect, Equal } from "type-testing";
2+
3+
type GetRoute<
4+
Path extends string,
5+
Segments extends unknown[] = [],
6+
Distant extends 1[] = [],
7+
> = Path extends ""
8+
? Segments
9+
: Path extends `${infer Segment}-${infer Rest}`
10+
? Segment extends ""
11+
? GetRoute<
12+
Rest,
13+
Segments,
14+
Segments extends [] ? Segments : [...Distant, 1]
15+
>
16+
: GetRoute<Rest, [...Segments, [Segment, Distant["length"]]], [1]>
17+
: [...Segments, [Path, Distant["length"]]];
18+
19+
// ------------------- Test section ---------------------
20+
21+
type t0_actual =
22+
GetRoute<"north_pole--candycane_forest----gumdrop_sea-------hawaii">; // =>
23+
type t0_expected = [
24+
// =>
25+
["north_pole", 0],
26+
["candycane_forest", 2],
27+
["gumdrop_sea", 4],
28+
["hawaii", 7],
29+
];
30+
type t0 = Expect<Equal<t0_actual, t0_expected>>;
31+
32+
type t1_actual = GetRoute<"a-b-c-d">; // =>
33+
type t1_expected = [
34+
// =>
35+
["a", 0],
36+
["b", 1],
37+
["c", 1],
38+
["d", 1],
39+
];
40+
type t1 = Expect<Equal<t1_actual, t1_expected>>;
41+
42+
type t2_actual = GetRoute<"🎅--🎄---🏠----🤶">; // =>
43+
type t2_expected = [
44+
// =>
45+
["🎅", 0],
46+
["🎄", 2],
47+
["🏠", 3],
48+
["🤶", 4],
49+
];
50+
type t2 = Expect<Equal<t2_actual, t2_expected>>;
51+
52+
type t3_actual = GetRoute<"">; // =>
53+
type t3_expected = []; // =>
54+
type t3 = Expect<Equal<t3_actual, t3_expected>>;
55+
56+
type t4_actual = GetRoute<"north_pole">; // =>
57+
type t4_expected = [["north_pole", 0]]; // =>
58+
type t4 = Expect<Equal<t4_actual, t4_expected>>;
59+
60+
type t5_actual = GetRoute<"a--b----c-d---e">; // =>
61+
type t5_expected = [
62+
// =>
63+
["a", 0],
64+
["b", 2],
65+
["c", 4],
66+
["d", 1],
67+
["e", 3],
68+
];
69+
type t5 = Expect<Equal<t5_actual, t5_expected>>;
70+
71+
type t6_actual = GetRoute<"--a-b">; // =>
72+
type t6_expected = [["a", 0], ["b", 1]]; // =>
73+
type t6 = Expect<Equal<t6_actual, t6_expected>>;
74+
75+
type t7_actual = GetRoute<"a-b--">; // =>
76+
type t7_expected = [["a", 0], ["b", 1]]; // =>
77+
type t7 = Expect<Equal<t7_actual, t7_expected>>;
78+
79+
type t8_actual = GetRoute<"north pole-candy.cane">; // =>
80+
type t8_expected = [["north pole", 0], ["candy.cane", 1]]; // =>
81+
type t8 = Expect<Equal<t8_actual, t8_expected>>;
82+
83+
type t9_actual =
84+
GetRoute<"a--------------------------------------------------b">; // =>
85+
type t9_expected = [["a", 0], ["b", 50]]; // =>
86+
type t9 = Expect<Equal<t9_actual, t9_expected>>;
87+
88+
type t10_actual = GetRoute<"a--a-a---a">; // =>
89+
type t10_expected = [["a", 0], ["a", 2], ["a", 1], ["a", 3]]; // =>
90+
type t10 = Expect<Equal<t10_actual, t10_expected>>;
91+
92+
// @ts-expect-error should not be a generic array
93+
type e0 = Expect<Equal<t0_actual, [string, number][]>>;
94+
95+
// @ts-expect-error should only accept string input
96+
type e1 = GetRoute<123>;

0 commit comments

Comments
 (0)