Skip to content

Commit 8cda989

Browse files
committed
Add exmaples/atcoder/practice_1 and arithmetic library
1 parent 05e1a40 commit 8cda989

File tree

3 files changed

+142
-0
lines changed

3 files changed

+142
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { run } from '../../src';
2+
3+
describe(`atcoder/practice_1`, () => {
4+
test(`example 1`, async () => {
5+
const { output } = await run(`examples/atcoder/practice_1.ts`, {
6+
input: Buffer.from(`1\n2 3\ntest\n`),
7+
});
8+
expect(output.toString()).toBe(`6 test\n`);
9+
});
10+
11+
test(`example 2`, async () => {
12+
const { output } = await run(`examples/atcoder/practice_1.ts`, {
13+
input: Buffer.from(`72\n128 256\nmyonmyon\n`),
14+
});
15+
expect(output.toString()).toBe(`456 myonmyon\n`);
16+
});
17+
});

examples/atcoder/practice_1.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Encode, Decode, Add } from '../lib/num';
2+
3+
type Main<Input extends string>
4+
= Input extends `${infer A}\n${infer B} ${infer C}\n${infer S}\n`
5+
? `${Decode<Add<Encode<A>, Add<Encode<B>, Encode<C>>>>} ${S}\n`
6+
: never;
7+
8+
export default Main;

examples/lib/num.ts

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
type Natural
2+
= Digit[]
3+
;
4+
5+
type Digit
6+
= Digit0
7+
| Digit1
8+
| Digit2
9+
| Digit3
10+
| Digit4
11+
| Digit5
12+
| Digit6
13+
| Digit7
14+
| Digit8
15+
| Digit9
16+
;
17+
18+
type Digit0 = [];
19+
type Digit1 = [unknown];
20+
type Digit2 = [unknown, unknown];
21+
type Digit3 = [unknown, unknown, unknown];
22+
type Digit4 = [unknown, unknown, unknown, unknown];
23+
type Digit5 = [unknown, unknown, unknown, unknown, unknown];
24+
type Digit6 = [unknown, unknown, unknown, unknown, unknown, unknown];
25+
type Digit7 = [unknown, unknown, unknown, unknown, unknown, unknown, unknown];
26+
type Digit8 = [unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown];
27+
type Digit9 = [unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown];
28+
29+
type EncodeNatural<N extends string>
30+
= N extends `${infer D}${infer DS}`
31+
? [...EncodeNatural<DS>, EncodeDigit<D>]
32+
: []
33+
;
34+
35+
type DecodeNatural<N extends Natural>
36+
= DecodeNaturalRec<N> extends infer Result
37+
? Result extends string
38+
? Result extends ``
39+
? `0`
40+
: Result
41+
: never
42+
: never
43+
;
44+
45+
type DecodeNaturalRec<N extends Natural>
46+
= N extends [infer D, ...infer DS]
47+
? D extends Digit
48+
? DS extends Natural
49+
? `${DecodeNaturalRec<DS>}${DecodeDigit<D>}`
50+
: never
51+
: never
52+
: ``
53+
;
54+
55+
type EncodeDigit<D extends string>
56+
= D extends `0` ? Digit0
57+
: D extends `1` ? Digit1
58+
: D extends `2` ? Digit2
59+
: D extends `3` ? Digit3
60+
: D extends `4` ? Digit4
61+
: D extends `5` ? Digit5
62+
: D extends `6` ? Digit6
63+
: D extends `7` ? Digit7
64+
: D extends `8` ? Digit8
65+
: D extends `9` ? Digit9
66+
: never
67+
;
68+
69+
type DecodeDigit<D extends Digit>
70+
= D extends Digit0 ? `0`
71+
: D extends Digit1 ? `1`
72+
: D extends Digit2 ? `2`
73+
: D extends Digit3 ? `3`
74+
: D extends Digit4 ? `4`
75+
: D extends Digit5 ? `5`
76+
: D extends Digit6 ? `6`
77+
: D extends Digit7 ? `7`
78+
: D extends Digit8 ? `8`
79+
: D extends Digit9 ? `9`
80+
: never
81+
;
82+
83+
type AddDigits<D0 extends Digit, D1 extends Digit, Carry extends Digit0 | Digit1 = Digit0>
84+
= [...D0, ...D1, ...Carry] extends infer Sum
85+
? Sum extends [unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, ...infer Rest]
86+
? [Rest, Digit1]
87+
: [Sum, Digit0]
88+
: never
89+
;
90+
91+
type AddNaturals<N0 extends Natural, N1 extends Natural, C0 extends Digit0 | Digit1 = Digit0>
92+
= N0 extends [infer D0, ...infer DS0]
93+
? D0 extends Digit
94+
? DS0 extends Natural
95+
? N1 extends [infer D1, ...infer DS1]
96+
? D1 extends Digit
97+
? DS1 extends Natural
98+
? AddDigits<D0, D1, C0> extends [infer S0, infer C1]
99+
? C1 extends Digit0 | Digit1
100+
? [S0, ...AddNaturals<DS0, DS1, C1>]
101+
: never
102+
: never
103+
: never
104+
: never
105+
: C0 extends Digit1
106+
? AddNaturals<N0, [C0]>
107+
: N0
108+
: never
109+
: never
110+
: C0 extends Digit1
111+
? AddNaturals<N1, [C0]>
112+
: N1
113+
;
114+
115+
export type Encode<N extends string> = EncodeNatural<N>;
116+
export type Decode<N extends Natural> = DecodeNatural<N>;
117+
export type Add<N0 extends Natural, N1 extends Natural> = AddNaturals<N0, N1>;

0 commit comments

Comments
 (0)