@turing-machine-js/library-binary-numbers 6.4.0 → 7.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +20 -18
- package/dist/index.mjs +20 -18
- package/package.json +3 -3
- package/states.md +197 -156
package/dist/index.cjs
CHANGED
|
@@ -72,11 +72,11 @@ const goToNumbersStart = new machine.State({
|
|
|
72
72
|
},
|
|
73
73
|
},
|
|
74
74
|
}, 'goToNumberStart');
|
|
75
|
-
// deleteNumber —
|
|
75
|
+
// deleteNumber — 4 nodes
|
|
76
76
|
//
|
|
77
77
|
// Composition: go to the number's '^', then sweep right erasing every cell
|
|
78
78
|
// (digits, '^', '$') until the number is gone. Implemented as
|
|
79
|
-
// goToNumbersStart.
|
|
79
|
+
// goToNumbersStart.withOverriddenHaltState(deleteNumberInternal): when
|
|
80
80
|
// goToNumbersStart would halt at '^', it falls through to the eraser instead.
|
|
81
81
|
const deleteNumberInternal = new machine.State({
|
|
82
82
|
[symbol('$')]: {
|
|
@@ -94,16 +94,16 @@ const deleteNumberInternal = new machine.State({
|
|
|
94
94
|
}, 'deleteNumberInternal');
|
|
95
95
|
const deleteNumber = new machine.State({
|
|
96
96
|
[symbol('^10$')]: {
|
|
97
|
-
nextState: goToNumbersStart.
|
|
97
|
+
nextState: goToNumbersStart.withOverriddenHaltState(deleteNumberInternal),
|
|
98
98
|
},
|
|
99
99
|
[machine.ifOtherSymbol]: {
|
|
100
100
|
nextState: machine.haltState,
|
|
101
101
|
},
|
|
102
102
|
}, 'deleteNumber');
|
|
103
|
-
// invertNumber —
|
|
103
|
+
// invertNumber — 4 nodes
|
|
104
104
|
//
|
|
105
105
|
// Composition: go to '^', then sweep right flipping each bit until '$'.
|
|
106
|
-
// Same shape as deleteNumber (goToNumbersStart.
|
|
106
|
+
// Same shape as deleteNumber (goToNumbersStart.withOverriddenHaltState(...)) but
|
|
107
107
|
// the inner state writes the complement instead of erasing.
|
|
108
108
|
const invertNumberGoToNumberWithInversion = new machine.State({
|
|
109
109
|
[symbol('^')]: {
|
|
@@ -129,13 +129,13 @@ const invertNumberGoToNumberWithInversion = new machine.State({
|
|
|
129
129
|
}, 'invertNumberGoToNumberWithInversion');
|
|
130
130
|
const invertNumber = new machine.State({
|
|
131
131
|
[symbol('^10$')]: {
|
|
132
|
-
nextState: goToNumbersStart.
|
|
132
|
+
nextState: goToNumbersStart.withOverriddenHaltState(invertNumberGoToNumberWithInversion),
|
|
133
133
|
},
|
|
134
134
|
[machine.ifOtherSymbol]: {
|
|
135
135
|
nextState: machine.haltState,
|
|
136
136
|
},
|
|
137
137
|
}, 'invertNumber');
|
|
138
|
-
// normalizeNumber —
|
|
138
|
+
// normalizeNumber — 6 nodes
|
|
139
139
|
//
|
|
140
140
|
// Strips leading zeros by erasing them and re-planting '^' just before the first
|
|
141
141
|
// '1' (or before '$' if the entire number was zero — preserving "0" as "^$").
|
|
@@ -165,7 +165,7 @@ const normalizeNumberMoveNumberStart = new machine.State({
|
|
|
165
165
|
}, 'normalizeNumberMoveNumberStart');
|
|
166
166
|
const normalizeNumber = new machine.State({
|
|
167
167
|
[symbol('^10$')]: {
|
|
168
|
-
nextState: goToNumbersStart.
|
|
168
|
+
nextState: goToNumbersStart.withOverriddenHaltState(normalizeNumberMoveNumberStart),
|
|
169
169
|
},
|
|
170
170
|
[machine.ifOtherSymbol]: {
|
|
171
171
|
nextState: machine.haltState,
|
|
@@ -244,16 +244,18 @@ const plusOne = new machine.State({
|
|
|
244
244
|
nextState: machine.haltState,
|
|
245
245
|
},
|
|
246
246
|
}, 'plusOne');
|
|
247
|
-
// minusOne —
|
|
247
|
+
// minusOne — 15 nodes (the largest in this library, per `summarize().stateCount`)
|
|
248
248
|
//
|
|
249
249
|
// Computes x − 1 via the two's-complement identity: x − 1 == ~(~x + 1)
|
|
250
250
|
// (every step is a state we already have), composed with three nested
|
|
251
|
-
//
|
|
251
|
+
// withOverriddenHaltState calls to chain invert → plusOne → invert → normalize.
|
|
252
|
+
// The chain has 4 state names but 3 wrapper hops — `normalizeNumber` at the
|
|
253
|
+
// inner end is the terminal override target, not another wrapper level.
|
|
252
254
|
//
|
|
253
255
|
// This is *deliberately* the heavy version. It exists side-by-side with
|
|
254
|
-
// minusOneFast (
|
|
256
|
+
// minusOneFast (8 nodes, direct borrow) to make the cost of "compose existing
|
|
255
257
|
// pieces" vs "write a dedicated algorithm" visible. See ../states.md for the
|
|
256
|
-
// dotted onHalt edges that show the
|
|
258
|
+
// dotted onHalt edges that show the three-deep wrapper chain.
|
|
257
259
|
const minusOne = new machine.State({
|
|
258
260
|
[symbol('^10')]: {
|
|
259
261
|
command: {
|
|
@@ -262,15 +264,15 @@ const minusOne = new machine.State({
|
|
|
262
264
|
},
|
|
263
265
|
[symbol('$')]: {
|
|
264
266
|
nextState: invertNumber
|
|
265
|
-
.
|
|
266
|
-
.
|
|
267
|
-
.
|
|
267
|
+
.withOverriddenHaltState(plusOne
|
|
268
|
+
.withOverriddenHaltState(invertNumber
|
|
269
|
+
.withOverriddenHaltState(normalizeNumber))),
|
|
268
270
|
},
|
|
269
271
|
[machine.ifOtherSymbol]: {
|
|
270
272
|
nextState: machine.haltState,
|
|
271
273
|
},
|
|
272
274
|
}, 'minusOne');
|
|
273
|
-
// minusOneFast —
|
|
275
|
+
// minusOneFast — 8 nodes (direct borrow propagation)
|
|
274
276
|
//
|
|
275
277
|
// Walks left from the LSB: 0→1 keeps borrowing; 1→0 stops; ^ is underflow.
|
|
276
278
|
// Falls through to normalizeNumber to strip the leading zero introduced when the
|
|
@@ -278,7 +280,7 @@ const minusOne = new machine.State({
|
|
|
278
280
|
//
|
|
279
281
|
// Same algorithm as minusOne in @turing-machine-js/library-binary-numbers-bare
|
|
280
282
|
// (which is 3 nodes there). The extra 7 nodes here are the cost of: scanning
|
|
281
|
-
// past '^' on entry, the goToNumberStart path and its
|
|
283
|
+
// past '^' on entry, the goToNumberStart path and its withOverriddenHaltState
|
|
282
284
|
// wrapper for normalize, and normalizeNumber's own marker-relocation chain.
|
|
283
285
|
const minusOneFastBorrow = new machine.State({
|
|
284
286
|
[symbol('1')]: {
|
|
@@ -307,7 +309,7 @@ const minusOneFast = new machine.State({
|
|
|
307
309
|
command: {
|
|
308
310
|
movement: machine.movements.left,
|
|
309
311
|
},
|
|
310
|
-
nextState: minusOneFastBorrow.
|
|
312
|
+
nextState: minusOneFastBorrow.withOverriddenHaltState(normalizeNumber),
|
|
311
313
|
},
|
|
312
314
|
[machine.ifOtherSymbol]: {
|
|
313
315
|
nextState: machine.haltState,
|
package/dist/index.mjs
CHANGED
|
@@ -70,11 +70,11 @@ const goToNumbersStart = new State({
|
|
|
70
70
|
},
|
|
71
71
|
},
|
|
72
72
|
}, 'goToNumberStart');
|
|
73
|
-
// deleteNumber —
|
|
73
|
+
// deleteNumber — 4 nodes
|
|
74
74
|
//
|
|
75
75
|
// Composition: go to the number's '^', then sweep right erasing every cell
|
|
76
76
|
// (digits, '^', '$') until the number is gone. Implemented as
|
|
77
|
-
// goToNumbersStart.
|
|
77
|
+
// goToNumbersStart.withOverriddenHaltState(deleteNumberInternal): when
|
|
78
78
|
// goToNumbersStart would halt at '^', it falls through to the eraser instead.
|
|
79
79
|
const deleteNumberInternal = new State({
|
|
80
80
|
[symbol('$')]: {
|
|
@@ -92,16 +92,16 @@ const deleteNumberInternal = new State({
|
|
|
92
92
|
}, 'deleteNumberInternal');
|
|
93
93
|
const deleteNumber = new State({
|
|
94
94
|
[symbol('^10$')]: {
|
|
95
|
-
nextState: goToNumbersStart.
|
|
95
|
+
nextState: goToNumbersStart.withOverriddenHaltState(deleteNumberInternal),
|
|
96
96
|
},
|
|
97
97
|
[ifOtherSymbol]: {
|
|
98
98
|
nextState: haltState,
|
|
99
99
|
},
|
|
100
100
|
}, 'deleteNumber');
|
|
101
|
-
// invertNumber —
|
|
101
|
+
// invertNumber — 4 nodes
|
|
102
102
|
//
|
|
103
103
|
// Composition: go to '^', then sweep right flipping each bit until '$'.
|
|
104
|
-
// Same shape as deleteNumber (goToNumbersStart.
|
|
104
|
+
// Same shape as deleteNumber (goToNumbersStart.withOverriddenHaltState(...)) but
|
|
105
105
|
// the inner state writes the complement instead of erasing.
|
|
106
106
|
const invertNumberGoToNumberWithInversion = new State({
|
|
107
107
|
[symbol('^')]: {
|
|
@@ -127,13 +127,13 @@ const invertNumberGoToNumberWithInversion = new State({
|
|
|
127
127
|
}, 'invertNumberGoToNumberWithInversion');
|
|
128
128
|
const invertNumber = new State({
|
|
129
129
|
[symbol('^10$')]: {
|
|
130
|
-
nextState: goToNumbersStart.
|
|
130
|
+
nextState: goToNumbersStart.withOverriddenHaltState(invertNumberGoToNumberWithInversion),
|
|
131
131
|
},
|
|
132
132
|
[ifOtherSymbol]: {
|
|
133
133
|
nextState: haltState,
|
|
134
134
|
},
|
|
135
135
|
}, 'invertNumber');
|
|
136
|
-
// normalizeNumber —
|
|
136
|
+
// normalizeNumber — 6 nodes
|
|
137
137
|
//
|
|
138
138
|
// Strips leading zeros by erasing them and re-planting '^' just before the first
|
|
139
139
|
// '1' (or before '$' if the entire number was zero — preserving "0" as "^$").
|
|
@@ -163,7 +163,7 @@ const normalizeNumberMoveNumberStart = new State({
|
|
|
163
163
|
}, 'normalizeNumberMoveNumberStart');
|
|
164
164
|
const normalizeNumber = new State({
|
|
165
165
|
[symbol('^10$')]: {
|
|
166
|
-
nextState: goToNumbersStart.
|
|
166
|
+
nextState: goToNumbersStart.withOverriddenHaltState(normalizeNumberMoveNumberStart),
|
|
167
167
|
},
|
|
168
168
|
[ifOtherSymbol]: {
|
|
169
169
|
nextState: haltState,
|
|
@@ -242,16 +242,18 @@ const plusOne = new State({
|
|
|
242
242
|
nextState: haltState,
|
|
243
243
|
},
|
|
244
244
|
}, 'plusOne');
|
|
245
|
-
// minusOne —
|
|
245
|
+
// minusOne — 15 nodes (the largest in this library, per `summarize().stateCount`)
|
|
246
246
|
//
|
|
247
247
|
// Computes x − 1 via the two's-complement identity: x − 1 == ~(~x + 1)
|
|
248
248
|
// (every step is a state we already have), composed with three nested
|
|
249
|
-
//
|
|
249
|
+
// withOverriddenHaltState calls to chain invert → plusOne → invert → normalize.
|
|
250
|
+
// The chain has 4 state names but 3 wrapper hops — `normalizeNumber` at the
|
|
251
|
+
// inner end is the terminal override target, not another wrapper level.
|
|
250
252
|
//
|
|
251
253
|
// This is *deliberately* the heavy version. It exists side-by-side with
|
|
252
|
-
// minusOneFast (
|
|
254
|
+
// minusOneFast (8 nodes, direct borrow) to make the cost of "compose existing
|
|
253
255
|
// pieces" vs "write a dedicated algorithm" visible. See ../states.md for the
|
|
254
|
-
// dotted onHalt edges that show the
|
|
256
|
+
// dotted onHalt edges that show the three-deep wrapper chain.
|
|
255
257
|
const minusOne = new State({
|
|
256
258
|
[symbol('^10')]: {
|
|
257
259
|
command: {
|
|
@@ -260,15 +262,15 @@ const minusOne = new State({
|
|
|
260
262
|
},
|
|
261
263
|
[symbol('$')]: {
|
|
262
264
|
nextState: invertNumber
|
|
263
|
-
.
|
|
264
|
-
.
|
|
265
|
-
.
|
|
265
|
+
.withOverriddenHaltState(plusOne
|
|
266
|
+
.withOverriddenHaltState(invertNumber
|
|
267
|
+
.withOverriddenHaltState(normalizeNumber))),
|
|
266
268
|
},
|
|
267
269
|
[ifOtherSymbol]: {
|
|
268
270
|
nextState: haltState,
|
|
269
271
|
},
|
|
270
272
|
}, 'minusOne');
|
|
271
|
-
// minusOneFast —
|
|
273
|
+
// minusOneFast — 8 nodes (direct borrow propagation)
|
|
272
274
|
//
|
|
273
275
|
// Walks left from the LSB: 0→1 keeps borrowing; 1→0 stops; ^ is underflow.
|
|
274
276
|
// Falls through to normalizeNumber to strip the leading zero introduced when the
|
|
@@ -276,7 +278,7 @@ const minusOne = new State({
|
|
|
276
278
|
//
|
|
277
279
|
// Same algorithm as minusOne in @turing-machine-js/library-binary-numbers-bare
|
|
278
280
|
// (which is 3 nodes there). The extra 7 nodes here are the cost of: scanning
|
|
279
|
-
// past '^' on entry, the goToNumberStart path and its
|
|
281
|
+
// past '^' on entry, the goToNumberStart path and its withOverriddenHaltState
|
|
280
282
|
// wrapper for normalize, and normalizeNumber's own marker-relocation chain.
|
|
281
283
|
const minusOneFastBorrow = new State({
|
|
282
284
|
[symbol('1')]: {
|
|
@@ -305,7 +307,7 @@ const minusOneFast = new State({
|
|
|
305
307
|
command: {
|
|
306
308
|
movement: movements.left,
|
|
307
309
|
},
|
|
308
|
-
nextState: minusOneFastBorrow.
|
|
310
|
+
nextState: minusOneFastBorrow.withOverriddenHaltState(normalizeNumber),
|
|
309
311
|
},
|
|
310
312
|
[ifOtherSymbol]: {
|
|
311
313
|
nextState: haltState,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@turing-machine-js/library-binary-numbers",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0-alpha.2",
|
|
4
4
|
"description": "A standard library for working with binary numbers",
|
|
5
5
|
"engines": {
|
|
6
6
|
"npm": ">=7.0.0"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"numbers"
|
|
28
28
|
],
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@turing-machine-js/machine": "^
|
|
30
|
+
"@turing-machine-js/machine": "^7.0.0-alpha.2"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "tsc --build --verbose tsconfig.build.json && node ../../scripts/build-node-entries.mjs --package=@turing-machine-js/library-binary-numbers",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"default": "./dist/index.mjs"
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "163c0f818365241bac2c2de5e489124056703d8b"
|
|
48
48
|
}
|
package/states.md
CHANGED
|
@@ -2,139 +2,162 @@
|
|
|
2
2
|
|
|
3
3
|
## goToNumber
|
|
4
4
|
|
|
5
|
-
*2 states
|
|
5
|
+
*2 states; 2 transitions; has cycles*
|
|
6
6
|
|
|
7
7
|
```mermaid
|
|
8
8
|
flowchart TD
|
|
9
9
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
10
10
|
s0(((halt)))
|
|
11
|
-
s1
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
s1["goToNumber"]
|
|
12
|
+
idle([idle])
|
|
13
|
+
idle -. enter .-> s1
|
|
14
|
+
s1 -- "['$'] → [K]/[S]" --> s0
|
|
15
|
+
s1 -- "[*] → [K]/[R]" --> s1
|
|
14
16
|
```
|
|
15
17
|
|
|
16
18
|
## goToNextNumber
|
|
17
19
|
|
|
18
|
-
*3 states
|
|
20
|
+
*3 states; 3 transitions; has cycles*
|
|
19
21
|
|
|
20
22
|
```mermaid
|
|
21
23
|
flowchart TD
|
|
22
24
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
23
25
|
s0(((halt)))
|
|
24
26
|
s1["goToNumber"]
|
|
25
|
-
s2
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
s2["goToNextNumber"]
|
|
28
|
+
idle([idle])
|
|
29
|
+
idle -. enter .-> s2
|
|
30
|
+
s1 -- "['$'] → [K]/[S]" --> s0
|
|
31
|
+
s1 -- "[*] → [K]/[R]" --> s1
|
|
32
|
+
s2 -- "[*] → [K]/[R]" --> s1
|
|
29
33
|
```
|
|
30
34
|
|
|
31
35
|
## goToPreviousNumber
|
|
32
36
|
|
|
33
|
-
*3 states
|
|
37
|
+
*3 states; 3 transitions; has cycles*
|
|
34
38
|
|
|
35
39
|
```mermaid
|
|
36
40
|
flowchart TD
|
|
37
41
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
38
42
|
s0(((halt)))
|
|
39
43
|
s3["goToPreviousNumberInternal"]
|
|
40
|
-
s4
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
s4["goToPreviousNumber"]
|
|
45
|
+
idle([idle])
|
|
46
|
+
idle -. enter .-> s4
|
|
47
|
+
s3 -- "['$'] → [K]/[S]" --> s0
|
|
48
|
+
s3 -- "[*] → [K]/[L]" --> s3
|
|
49
|
+
s4 -- "[*] → [K]/[L]" --> s3
|
|
44
50
|
```
|
|
45
51
|
|
|
46
52
|
## deleteNumber
|
|
47
53
|
|
|
48
|
-
*5 states (
|
|
54
|
+
*5 states; 6 transitions; 1 wrapper (max nesting depth 1); has cycles*
|
|
49
55
|
|
|
50
56
|
```mermaid
|
|
51
57
|
flowchart TD
|
|
52
58
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
53
59
|
s0(((halt)))
|
|
54
|
-
s5["goToNumberStart"]
|
|
55
60
|
s6["deleteNumberInternal"]
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
s7
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
s8["deleteNumber"]
|
|
62
|
+
s7[["goToNumberStart(deleteNumberInternal)"]]
|
|
63
|
+
idle([idle])
|
|
64
|
+
subgraph w_5["callable subtree of goToNumberStart"]
|
|
65
|
+
s5["goToNumberStart"]
|
|
66
|
+
c5(((halt)))
|
|
67
|
+
end
|
|
68
|
+
idle -. enter .-> s8
|
|
69
|
+
s7 == "call" ==> s5
|
|
70
|
+
w_5 -. "return" .-> s7
|
|
71
|
+
s7 --> s6
|
|
72
|
+
s5 -- "['^'] → [K]/[S]" --> c5
|
|
73
|
+
s5 -- "[*] → [K]/[L]" --> s5
|
|
74
|
+
s6 -- "['$'] → [E]/[S]" --> s0
|
|
75
|
+
s6 -- "[*] → [E]/[R]" --> s6
|
|
76
|
+
s8 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s7
|
|
77
|
+
s8 -- "[*] → [K]/[S]" --> s0
|
|
67
78
|
```
|
|
68
79
|
|
|
69
80
|
## goToNumbersStart
|
|
70
81
|
|
|
71
|
-
*2 states
|
|
82
|
+
*2 states; 2 transitions; has cycles*
|
|
72
83
|
|
|
73
84
|
```mermaid
|
|
74
85
|
flowchart TD
|
|
75
86
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
76
87
|
s0(((halt)))
|
|
77
|
-
s5
|
|
78
|
-
|
|
79
|
-
|
|
88
|
+
s5["goToNumberStart"]
|
|
89
|
+
idle([idle])
|
|
90
|
+
idle -. enter .-> s5
|
|
91
|
+
s5 -- "['^'] → [K]/[S]" --> s0
|
|
92
|
+
s5 -- "[*] → [K]/[L]" --> s5
|
|
80
93
|
```
|
|
81
94
|
|
|
82
95
|
## invertNumber
|
|
83
96
|
|
|
84
|
-
*5 states (
|
|
97
|
+
*5 states; 8 transitions; 1 wrapper (max nesting depth 1); has cycles*
|
|
85
98
|
|
|
86
99
|
```mermaid
|
|
87
100
|
flowchart TD
|
|
88
101
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
89
102
|
s0(((halt)))
|
|
90
|
-
s5["goToNumberStart"]
|
|
91
103
|
s9["invertNumberGoToNumberWithInversion"]
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
s10
|
|
101
|
-
|
|
102
|
-
s10
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
s11["invertNumber"]
|
|
105
|
+
s10[["goToNumberStart(invertNumberGoToNumberWithInversion)"]]
|
|
106
|
+
idle([idle])
|
|
107
|
+
subgraph w_5["callable subtree of goToNumberStart"]
|
|
108
|
+
s5["goToNumberStart"]
|
|
109
|
+
c5(((halt)))
|
|
110
|
+
end
|
|
111
|
+
idle -. enter .-> s11
|
|
112
|
+
s10 == "call" ==> s5
|
|
113
|
+
w_5 -. "return" .-> s10
|
|
114
|
+
s10 --> s9
|
|
115
|
+
s5 -- "['^'] → [K]/[S]" --> c5
|
|
116
|
+
s5 -- "[*] → [K]/[L]" --> s5
|
|
117
|
+
s9 -- "['^'] → [K]/[R]" --> s9
|
|
118
|
+
s9 -- "['1'] → ['0']/[R]" --> s9
|
|
119
|
+
s9 -- "['0'] → ['1']/[R]" --> s9
|
|
120
|
+
s9 -- "['$'] → [K]/[S]" --> s0
|
|
121
|
+
s11 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s10
|
|
122
|
+
s11 -- "[*] → [K]/[S]" --> s0
|
|
105
123
|
```
|
|
106
124
|
|
|
107
125
|
## normalizeNumber
|
|
108
126
|
|
|
109
|
-
*7 states (
|
|
127
|
+
*7 states; 9 transitions; 1 wrapper (max nesting depth 1); has cycles*
|
|
110
128
|
|
|
111
129
|
```mermaid
|
|
112
130
|
flowchart TD
|
|
113
131
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
114
132
|
s0(((halt)))
|
|
115
133
|
s1["goToNumber"]
|
|
116
|
-
s5["goToNumberStart"]
|
|
117
134
|
s12["normalizeNumberPutNewStartSymbol"]
|
|
118
135
|
s13["normalizeNumberMoveNumberStart"]
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
s14
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
s15["normalizeNumber"]
|
|
137
|
+
s14[["goToNumberStart(normalizeNumberMoveNumberStart)"]]
|
|
138
|
+
idle([idle])
|
|
139
|
+
subgraph w_5["callable subtree of goToNumberStart"]
|
|
140
|
+
s5["goToNumberStart"]
|
|
141
|
+
c5(((halt)))
|
|
142
|
+
end
|
|
143
|
+
idle -. enter .-> s15
|
|
144
|
+
s14 == "call" ==> s5
|
|
145
|
+
w_5 -. "return" .-> s14
|
|
146
|
+
s14 --> s13
|
|
147
|
+
s1 -- "['$'] → [K]/[S]" --> s0
|
|
148
|
+
s1 -- "[*] → [K]/[R]" --> s1
|
|
149
|
+
s5 -- "['^'] → [K]/[S]" --> c5
|
|
150
|
+
s5 -- "[*] → [K]/[L]" --> s5
|
|
151
|
+
s12 -- "[B] → ['^']/[S]" --> s1
|
|
152
|
+
s13 -- "['^']|['0'] → [E]/[R]" --> s13
|
|
153
|
+
s13 -- "['1']|['$'] → [K]/[L]" --> s12
|
|
154
|
+
s15 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s14
|
|
155
|
+
s15 -- "[*] → [K]/[S]" --> s0
|
|
133
156
|
```
|
|
134
157
|
|
|
135
158
|
## plusOne
|
|
136
159
|
|
|
137
|
-
*5 states
|
|
160
|
+
*5 states; 10 transitions; has cycles*
|
|
138
161
|
|
|
139
162
|
```mermaid
|
|
140
163
|
flowchart TD
|
|
@@ -143,124 +166,142 @@ flowchart TD
|
|
|
143
166
|
s16["plusOneFillZeros"]
|
|
144
167
|
s17["plusOneAddNumberStart"]
|
|
145
168
|
s18["plusOneCaryOne"]
|
|
146
|
-
s19
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
s18 -- "
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
s19 -- "
|
|
169
|
+
s19["plusOne"]
|
|
170
|
+
idle([idle])
|
|
171
|
+
idle -. enter .-> s19
|
|
172
|
+
s16 -- "['1'] → ['0']/[R]" --> s16
|
|
173
|
+
s16 -- "['$'] → [K]/[S]" --> s0
|
|
174
|
+
s17 -- "[B] → ['^']/[R]" --> s17
|
|
175
|
+
s17 -- "['1'] → [K]/[R]" --> s16
|
|
176
|
+
s18 -- "['0'] → ['1']/[R]" --> s16
|
|
177
|
+
s18 -- "['1'] → [K]/[L]" --> s18
|
|
178
|
+
s18 -- "['^'] → ['1']/[L]" --> s17
|
|
179
|
+
s19 -- "['^']|['1']|['0'] → [K]/[R]" --> s19
|
|
180
|
+
s19 -- "['$'] → [K]/[L]" --> s18
|
|
181
|
+
s19 -- "[*] → [K]/[S]" --> s0
|
|
157
182
|
```
|
|
158
183
|
|
|
159
184
|
## minusOne
|
|
160
185
|
|
|
161
|
-
*
|
|
186
|
+
*18 states; 28 transitions; 5 wrappers (max nesting depth 3); has cycles*
|
|
162
187
|
|
|
163
188
|
```mermaid
|
|
164
189
|
flowchart TD
|
|
165
190
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
166
191
|
s0(((halt)))
|
|
167
192
|
s1["goToNumber"]
|
|
168
|
-
s5["goToNumberStart"]
|
|
169
193
|
s9["invertNumberGoToNumberWithInversion"]
|
|
170
|
-
s10["goToNumberStart>invertNumberGoToNumberWithInversion"]
|
|
171
194
|
s12["normalizeNumberPutNewStartSymbol"]
|
|
172
195
|
s13["normalizeNumberMoveNumberStart"]
|
|
173
|
-
s14["goToNumberStart>normalizeNumberMoveNumberStart"]
|
|
174
196
|
s15["normalizeNumber"]
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
197
|
+
s23["minusOne"]
|
|
198
|
+
s10[["goToNumberStart(invertNumberGoToNumberWithInversion)"]]
|
|
199
|
+
s14[["goToNumberStart(normalizeNumberMoveNumberStart)"]]
|
|
200
|
+
s20[["invertNumber(normalizeNumber)"]]
|
|
201
|
+
s21[["plusOne(invertNumber(normalizeNumber))"]]
|
|
202
|
+
s22[["invertNumber(plusOne(invertNumber(normalizeNumber)))"]]
|
|
203
|
+
idle([idle])
|
|
204
|
+
subgraph w_5["callable subtree of goToNumberStart"]
|
|
205
|
+
s5["goToNumberStart"]
|
|
206
|
+
c5(((halt)))
|
|
207
|
+
end
|
|
208
|
+
subgraph w_11["callable subtree of invertNumber"]
|
|
209
|
+
s11["invertNumber"]
|
|
210
|
+
c11(((halt)))
|
|
211
|
+
end
|
|
212
|
+
subgraph w_19["callable subtree of plusOne"]
|
|
213
|
+
s16["plusOneFillZeros"]
|
|
214
|
+
s17["plusOneAddNumberStart"]
|
|
215
|
+
s18["plusOneCaryOne"]
|
|
216
|
+
s19["plusOne"]
|
|
217
|
+
c19(((halt)))
|
|
218
|
+
end
|
|
219
|
+
idle -. enter .-> s23
|
|
220
|
+
s10 & s14 == "call" ==> s5
|
|
221
|
+
s20 & s22 == "call" ==> s11
|
|
222
|
+
s21 == "call" ==> s19
|
|
223
|
+
w_5 -. "return" .-> s10 & s14
|
|
224
|
+
w_11 -. "return" .-> s20 & s22
|
|
225
|
+
w_19 -. "return" .-> s21
|
|
226
|
+
s10 --> s9
|
|
227
|
+
s14 --> s13
|
|
228
|
+
s20 --> s15
|
|
229
|
+
s21 --> s20
|
|
230
|
+
s22 --> s21
|
|
231
|
+
s1 -- "['$'] → [K]/[S]" --> s0
|
|
232
|
+
s1 -- "[*] → [K]/[R]" --> s1
|
|
233
|
+
s5 -- "['^'] → [K]/[S]" --> c5
|
|
234
|
+
s5 -- "[*] → [K]/[L]" --> s5
|
|
235
|
+
s9 -- "['^'] → [K]/[R]" --> s9
|
|
236
|
+
s9 -- "['1'] → ['0']/[R]" --> s9
|
|
237
|
+
s9 -- "['0'] → ['1']/[R]" --> s9
|
|
238
|
+
s9 -- "['$'] → [K]/[S]" --> s0
|
|
239
|
+
s11 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s10
|
|
240
|
+
s11 -- "[*] → [K]/[S]" --> c11
|
|
241
|
+
s12 -- "[B] → ['^']/[S]" --> s1
|
|
242
|
+
s13 -- "['^']|['0'] → [E]/[R]" --> s13
|
|
243
|
+
s13 -- "['1']|['$'] → [K]/[L]" --> s12
|
|
244
|
+
s15 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s14
|
|
245
|
+
s15 -- "[*] → [K]/[S]" --> s0
|
|
246
|
+
s16 -- "['1'] → ['0']/[R]" --> s16
|
|
247
|
+
s16 -- "['$'] → [K]/[S]" --> c19
|
|
248
|
+
s17 -- "[B] → ['^']/[R]" --> s17
|
|
249
|
+
s17 -- "['1'] → [K]/[R]" --> s16
|
|
250
|
+
s18 -- "['0'] → ['1']/[R]" --> s16
|
|
251
|
+
s18 -- "['1'] → [K]/[L]" --> s18
|
|
252
|
+
s18 -- "['^'] → ['1']/[L]" --> s17
|
|
253
|
+
s19 -- "['^']|['1']|['0'] → [K]/[R]" --> s19
|
|
254
|
+
s19 -- "['$'] → [K]/[L]" --> s18
|
|
255
|
+
s19 -- "[*] → [K]/[S]" --> c19
|
|
256
|
+
s23 -- "['^']|['1']|['0'] → [K]/[R]" --> s23
|
|
257
|
+
s23 -- "['$'] → [K]/[S]" --> s22
|
|
258
|
+
s23 -- "[*] → [K]/[S]" --> s0
|
|
225
259
|
```
|
|
226
260
|
|
|
227
261
|
## minusOneFast
|
|
228
262
|
|
|
229
|
-
*10 states (
|
|
263
|
+
*10 states; 15 transitions; 2 wrappers (max nesting depth 1); has cycles*
|
|
230
264
|
|
|
231
265
|
```mermaid
|
|
232
266
|
flowchart TD
|
|
233
267
|
%% alphabets: [[" ","^","$","0","1"]]
|
|
234
268
|
s0(((halt)))
|
|
235
269
|
s1["goToNumber"]
|
|
236
|
-
s5["goToNumberStart"]
|
|
237
270
|
s12["normalizeNumberPutNewStartSymbol"]
|
|
238
271
|
s13["normalizeNumberMoveNumberStart"]
|
|
239
|
-
s14["goToNumberStart>normalizeNumberMoveNumberStart"]
|
|
240
272
|
s15["normalizeNumber"]
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
s25
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
273
|
+
s26["minusOneFast"]
|
|
274
|
+
s14[["goToNumberStart(normalizeNumberMoveNumberStart)"]]
|
|
275
|
+
s25[["minusOneFastBorrow(normalizeNumber)"]]
|
|
276
|
+
idle([idle])
|
|
277
|
+
subgraph w_5["callable subtree of goToNumberStart"]
|
|
278
|
+
s5["goToNumberStart"]
|
|
279
|
+
c5(((halt)))
|
|
280
|
+
end
|
|
281
|
+
subgraph w_24["callable subtree of minusOneFastBorrow"]
|
|
282
|
+
s24["minusOneFastBorrow"]
|
|
283
|
+
c24(((halt)))
|
|
284
|
+
end
|
|
285
|
+
idle -. enter .-> s26
|
|
286
|
+
s14 == "call" ==> s5
|
|
287
|
+
s25 == "call" ==> s24
|
|
288
|
+
w_5 -. "return" .-> s14
|
|
289
|
+
w_24 -. "return" .-> s25
|
|
290
|
+
s14 --> s13
|
|
291
|
+
s25 --> s15
|
|
292
|
+
s1 -- "['$'] → [K]/[S]" --> s0
|
|
293
|
+
s1 -- "[*] → [K]/[R]" --> s1
|
|
294
|
+
s5 -- "['^'] → [K]/[S]" --> c5
|
|
295
|
+
s5 -- "[*] → [K]/[L]" --> s5
|
|
296
|
+
s12 -- "[B] → ['^']/[S]" --> s1
|
|
297
|
+
s13 -- "['^']|['0'] → [E]/[R]" --> s13
|
|
298
|
+
s13 -- "['1']|['$'] → [K]/[L]" --> s12
|
|
299
|
+
s15 -- "['^']|['1']|['0']|['$'] → [K]/[S]" --> s14
|
|
300
|
+
s15 -- "[*] → [K]/[S]" --> s0
|
|
301
|
+
s24 -- "['1'] → ['0']/[S]" --> c24
|
|
302
|
+
s24 -- "['0'] → ['1']/[L]" --> s24
|
|
303
|
+
s24 -- "['^'] → [K]/[S]" --> c24
|
|
304
|
+
s26 -- "['^']|['1']|['0'] → [K]/[R]" --> s26
|
|
305
|
+
s26 -- "['$'] → [K]/[L]" --> s25
|
|
306
|
+
s26 -- "[*] → [K]/[S]" --> s0
|
|
266
307
|
```
|