-
Notifications
You must be signed in to change notification settings - Fork 0
/
04260-medium-nomiwase.ts
126 lines (121 loc) · 2.14 KB
/
04260-medium-nomiwase.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<AllCombinations<''>, ''>>,
Expect<Equal<AllCombinations<'A'>, '' | 'A'>>,
Expect<Equal<AllCombinations<'AB'>, '' | 'A' | 'B' | 'AB' | 'BA'>>,
Expect<
Equal<
AllCombinations<'ABC'>,
| ''
| 'A'
| 'B'
| 'C'
| 'AB'
| 'AC'
| 'BA'
| 'BC'
| 'CA'
| 'CB'
| 'ABC'
| 'ACB'
| 'BAC'
| 'BCA'
| 'CAB'
| 'CBA'
>
>,
Expect<
Equal<
AllCombinations<'ABCD'>,
| ''
| 'A'
| 'B'
| 'C'
| 'D'
| 'AB'
| 'AC'
| 'AD'
| 'BA'
| 'BC'
| 'BD'
| 'CA'
| 'CB'
| 'CD'
| 'DA'
| 'DB'
| 'DC'
| 'ABC'
| 'ABD'
| 'ACB'
| 'ACD'
| 'ADB'
| 'ADC'
| 'BAC'
| 'BAD'
| 'BCA'
| 'BCD'
| 'BDA'
| 'BDC'
| 'CAB'
| 'CAD'
| 'CBA'
| 'CBD'
| 'CDA'
| 'CDB'
| 'DAB'
| 'DAC'
| 'DBA'
| 'DBC'
| 'DCA'
| 'DCB'
| 'ABCD'
| 'ABDC'
| 'ACBD'
| 'ACDB'
| 'ADBC'
| 'ADCB'
| 'BACD'
| 'BADC'
| 'BCAD'
| 'BCDA'
| 'BDAC'
| 'BDCA'
| 'CABD'
| 'CADB'
| 'CBAD'
| 'CBDA'
| 'CDAB'
| 'CDBA'
| 'DABC'
| 'DACB'
| 'DBAC'
| 'DBCA'
| 'DCAB'
| 'DCBA'
>
>
]
// ============= Your Code Here =============
// type StringToUnion<S> = S extends `${infer Head}${infer Tail}`
// ? Head | StringToUnion<Tail>
// : never
// type IsNever<T> = [T] extends [never] ? true : false
// type AllCombinations<
// S,
// Acc extends string = StringToUnion<S>
// > = IsNever<Acc> extends true
// ? ''
// :
// | ''
// | {
// [Combo in Acc]: `${Combo}${AllCombinations<S, Exclude<Acc, Combo>>}`
// }[Acc]
type AllCombinations<
S,
Acc extends string = ''
> = S extends `${infer Head}${infer Tail}`
?
| `${Head}${AllCombinations<`${Acc}${Tail}`>}`
| AllCombinations<Tail, `${Acc}${Head}`>
: ''