@turing-machine-js/library-binary-numbers 6.4.0 → 7.0.0-alpha.1

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 CHANGED
@@ -72,11 +72,11 @@ const goToNumbersStart = new machine.State({
72
72
  },
73
73
  },
74
74
  }, 'goToNumberStart');
75
- // deleteNumber — 5 nodes
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.withOverrodeHaltState(deleteNumberInternal): when
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.withOverrodeHaltState(deleteNumberInternal),
97
+ nextState: goToNumbersStart.withOverriddenHaltState(deleteNumberInternal),
98
98
  },
99
99
  [machine.ifOtherSymbol]: {
100
100
  nextState: machine.haltState,
101
101
  },
102
102
  }, 'deleteNumber');
103
- // invertNumber — 5 nodes
103
+ // invertNumber — 4 nodes
104
104
  //
105
105
  // Composition: go to '^', then sweep right flipping each bit until '$'.
106
- // Same shape as deleteNumber (goToNumbersStart.withOverrodeHaltState(...)) but
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.withOverrodeHaltState(invertNumberGoToNumberWithInversion),
132
+ nextState: goToNumbersStart.withOverriddenHaltState(invertNumberGoToNumberWithInversion),
133
133
  },
134
134
  [machine.ifOtherSymbol]: {
135
135
  nextState: machine.haltState,
136
136
  },
137
137
  }, 'invertNumber');
138
- // normalizeNumber — 7 nodes
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.withOverrodeHaltState(normalizeNumberMoveNumberStart),
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 — 17 nodes (the largest in this library)
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
- // withOverrodeHaltState calls to chain invert → plusOne → invert → normalize.
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 (10 nodes, direct borrow) to make the cost of "compose existing
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 four-deep subroutine chain.
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
- .withOverrodeHaltState(plusOne
266
- .withOverrodeHaltState(invertNumber
267
- .withOverrodeHaltState(normalizeNumber))),
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 — 10 nodes (direct borrow propagation)
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 withOverrodeHaltState
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.withOverrodeHaltState(normalizeNumber),
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 — 5 nodes
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.withOverrodeHaltState(deleteNumberInternal): when
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.withOverrodeHaltState(deleteNumberInternal),
95
+ nextState: goToNumbersStart.withOverriddenHaltState(deleteNumberInternal),
96
96
  },
97
97
  [ifOtherSymbol]: {
98
98
  nextState: haltState,
99
99
  },
100
100
  }, 'deleteNumber');
101
- // invertNumber — 5 nodes
101
+ // invertNumber — 4 nodes
102
102
  //
103
103
  // Composition: go to '^', then sweep right flipping each bit until '$'.
104
- // Same shape as deleteNumber (goToNumbersStart.withOverrodeHaltState(...)) but
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.withOverrodeHaltState(invertNumberGoToNumberWithInversion),
130
+ nextState: goToNumbersStart.withOverriddenHaltState(invertNumberGoToNumberWithInversion),
131
131
  },
132
132
  [ifOtherSymbol]: {
133
133
  nextState: haltState,
134
134
  },
135
135
  }, 'invertNumber');
136
- // normalizeNumber — 7 nodes
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.withOverrodeHaltState(normalizeNumberMoveNumberStart),
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 — 17 nodes (the largest in this library)
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
- // withOverrodeHaltState calls to chain invert → plusOne → invert → normalize.
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 (10 nodes, direct borrow) to make the cost of "compose existing
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 four-deep subroutine chain.
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
- .withOverrodeHaltState(plusOne
264
- .withOverrodeHaltState(invertNumber
265
- .withOverrodeHaltState(normalizeNumber))),
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 — 10 nodes (direct borrow propagation)
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 withOverrodeHaltState
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.withOverrodeHaltState(normalizeNumber),
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": "6.4.0",
3
+ "version": "7.0.0-alpha.1",
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": "^6.0.0"
30
+ "@turing-machine-js/machine": "^7.0.0-alpha.1"
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": "a8228b8a5f7f9acd1f6219af80db86368848cdbc"
47
+ "gitHead": "0d52695e614d12547ba73992c00cd48732b1e8c1"
48
48
  }
package/states.md CHANGED
@@ -2,139 +2,153 @@
2
2
 
3
3
  ## goToNumber
4
4
 
5
- *2 states (including `haltState`)*
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(("goToNumber"))
12
- s1 -- "$ → ·/S" --> s0
13
- s1 -- "* ·/R" --> s1
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 (including `haltState`)*
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(("goToNextNumber"))
26
- s1 -- "$ → ·/S" --> s0
27
- s1 -- "* ·/R" --> s1
28
- s2 -- "*·/R" --> s1
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 (including `haltState`)*
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(("goToPreviousNumber"))
41
- s3 -- "$ → ·/S" --> s0
42
- s3 -- "* ·/L" --> s3
43
- s4 -- "*·/L" --> s3
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 (including `haltState`)*
54
+ *4 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
- s7["goToNumberStart>deleteNumberInternal"]
57
- s8(("deleteNumber"))
58
- s5 -- "^ → ·/S" --> s0
59
- s5 -- "* → ·/L" --> s5
60
- s6 -- "$ → ⌫/S" --> s0
61
- s6 -- "* → ⌫/R" --> s6
62
- s7 -- "^ ·/S" --> s0
63
- s7 -- "*·/L" --> s5
61
+ s8["deleteNumber"]
62
+ idle([idle])
63
+ subgraph w_7["halt frame"]
64
+ s7[["goToNumberStart"]]
65
+ c7(((halt)))
66
+ end
67
+ idle -. enter .-> s8
68
+ s6 -- "['$'][E]/[S]" --> s0
69
+ s6 -- "[*] → [E]/[R]" --> s6
70
+ s7 -- "['^'] → [K]/[S]" --> c7
71
+ s7 -- "[*] → [K]/[L]" --> s7
64
72
  s7 -. onHalt .-> s6
65
- s8 -- "^|1|0|$·/S" --> s7
66
- s8 -- "* → ·/S" --> s0
73
+ s8 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s7
74
+ s8 -- "[*][K]/[S]" --> s0
67
75
  ```
68
76
 
69
77
  ## goToNumbersStart
70
78
 
71
- *2 states (including `haltState`)*
79
+ *2 states; 2 transitions; has cycles*
72
80
 
73
81
  ```mermaid
74
82
  flowchart TD
75
83
  %% alphabets: [[" ","^","$","0","1"]]
76
84
  s0(((halt)))
77
- s5(("goToNumberStart"))
78
- s5 -- "^ → ·/S" --> s0
79
- s5 -- "* ·/L" --> s5
85
+ s5["goToNumberStart"]
86
+ idle([idle])
87
+ idle -. enter .-> s5
88
+ s5 -- "['^'] → [K]/[S]" --> s0
89
+ s5 -- "[*] → [K]/[L]" --> s5
80
90
  ```
81
91
 
82
92
  ## invertNumber
83
93
 
84
- *5 states (including `haltState`)*
94
+ *4 states; 8 transitions; 1 wrapper (max nesting depth 1); has cycles*
85
95
 
86
96
  ```mermaid
87
97
  flowchart TD
88
98
  %% alphabets: [[" ","^","$","0","1"]]
89
99
  s0(((halt)))
90
- s5["goToNumberStart"]
91
100
  s9["invertNumberGoToNumberWithInversion"]
92
- s10["goToNumberStart>invertNumberGoToNumberWithInversion"]
93
- s11(("invertNumber"))
94
- s5 -- "^ → ·/S" --> s0
95
- s5 -- "* → ·/L" --> s5
96
- s9 -- "^ → ·/R" --> s9
97
- s9 -- "1 → 0/R" --> s9
98
- s9 -- "0 1/R" --> s9
99
- s9 -- "$·/S" --> s0
100
- s10 -- "^·/S" --> s0
101
- s10 -- "*·/L" --> s5
101
+ s11["invertNumber"]
102
+ idle([idle])
103
+ subgraph w_10["halt frame"]
104
+ s10[["goToNumberStart"]]
105
+ c10(((halt)))
106
+ end
107
+ idle -. enter .-> s11
108
+ s9 -- "['^'][K]/[R]" --> s9
109
+ s9 -- "['1']['0']/[R]" --> s9
110
+ s9 -- "['0']['1']/[R]" --> s9
111
+ s9 -- "['$'] → [K]/[S]" --> s0
112
+ s10 -- "['^'] → [K]/[S]" --> c10
113
+ s10 -- "[*] → [K]/[L]" --> s10
102
114
  s10 -. onHalt .-> s9
103
- s11 -- "^|1|0|$·/S" --> s10
104
- s11 -- "* → ·/S" --> s0
115
+ s11 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s10
116
+ s11 -- "[*][K]/[S]" --> s0
105
117
  ```
106
118
 
107
119
  ## normalizeNumber
108
120
 
109
- *7 states (including `haltState`)*
121
+ *6 states; 9 transitions; 1 wrapper (max nesting depth 1); has cycles*
110
122
 
111
123
  ```mermaid
112
124
  flowchart TD
113
125
  %% alphabets: [[" ","^","$","0","1"]]
114
126
  s0(((halt)))
115
127
  s1["goToNumber"]
116
- s5["goToNumberStart"]
117
128
  s12["normalizeNumberPutNewStartSymbol"]
118
129
  s13["normalizeNumberMoveNumberStart"]
119
- s14["goToNumberStart>normalizeNumberMoveNumberStart"]
120
- s15(("normalizeNumber"))
121
- s1 -- "$ → ·/S" --> s0
122
- s1 -- "* → ·/R" --> s1
123
- s5 -- "^ → ·/S" --> s0
124
- s5 -- "* → ·/L" --> s5
125
- s12 -- "- ^/S" --> s1
126
- s13 -- "^|0⌫/R" --> s13
127
- s13 -- "1|$·/L" --> s12
128
- s14 -- "^·/S" --> s0
129
- s14 -- "*·/L" --> s5
130
+ s15["normalizeNumber"]
131
+ idle([idle])
132
+ subgraph w_14["halt frame"]
133
+ s14[["goToNumberStart"]]
134
+ c14(((halt)))
135
+ end
136
+ idle -. enter .-> s15
137
+ s1 -- "['$'][K]/[S]" --> s0
138
+ s1 -- "[*][K]/[R]" --> s1
139
+ s12 -- "[B]['^']/[S]" --> s1
140
+ s13 -- "['^']|['0'][E]/[R]" --> s13
141
+ s13 -- "['1']|['$'] → [K]/[L]" --> s12
142
+ s14 -- "['^'] → [K]/[S]" --> c14
143
+ s14 -- "[*] → [K]/[L]" --> s14
130
144
  s14 -. onHalt .-> s13
131
- s15 -- "^|1|0|$·/S" --> s14
132
- s15 -- "* → ·/S" --> s0
145
+ s15 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s14
146
+ s15 -- "[*][K]/[S]" --> s0
133
147
  ```
134
148
 
135
149
  ## plusOne
136
150
 
137
- *5 states (including `haltState`)*
151
+ *5 states; 10 transitions; has cycles*
138
152
 
139
153
  ```mermaid
140
154
  flowchart TD
@@ -143,124 +157,137 @@ flowchart TD
143
157
  s16["plusOneFillZeros"]
144
158
  s17["plusOneAddNumberStart"]
145
159
  s18["plusOneCaryOne"]
146
- s19(("plusOne"))
147
- s16 -- "1 → 0/R" --> s16
148
- s16 -- "$ ·/S" --> s0
149
- s17 -- "-^/R" --> s17
150
- s17 -- "1·/R" --> s16
151
- s18 -- "01/R" --> s16
152
- s18 -- "1 → ·/L" --> s18
153
- s18 -- "^ → 1/L" --> s17
154
- s19 -- "^|1|0·/R" --> s19
155
- s19 -- "$·/L" --> s18
156
- s19 -- "*·/S" --> s0
160
+ s19["plusOne"]
161
+ idle([idle])
162
+ idle -. enter .-> s19
163
+ s16 -- "['1']['0']/[R]" --> s16
164
+ s16 -- "['$'][K]/[S]" --> s0
165
+ s17 -- "[B]['^']/[R]" --> s17
166
+ s17 -- "['1'][K]/[R]" --> s16
167
+ s18 -- "['0']['1']/[R]" --> s16
168
+ s18 -- "['1'][K]/[L]" --> s18
169
+ s18 -- "['^']['1']/[L]" --> s17
170
+ s19 -- "['^']|['1']|['0'][K]/[R]" --> s19
171
+ s19 -- "['$'] → [K]/[L]" --> s18
172
+ s19 -- "[*] → [K]/[S]" --> s0
157
173
  ```
158
174
 
159
175
  ## minusOne
160
176
 
161
- *17 states (including `haltState`)*
177
+ *15 states; 32 transitions; 5 wrappers (max nesting depth 3); has cycles*
162
178
 
163
179
  ```mermaid
164
180
  flowchart TD
165
181
  %% alphabets: [[" ","^","$","0","1"]]
166
182
  s0(((halt)))
167
183
  s1["goToNumber"]
168
- s5["goToNumberStart"]
169
184
  s9["invertNumberGoToNumberWithInversion"]
170
- s10["goToNumberStart>invertNumberGoToNumberWithInversion"]
171
185
  s12["normalizeNumberPutNewStartSymbol"]
172
186
  s13["normalizeNumberMoveNumberStart"]
173
- s14["goToNumberStart>normalizeNumberMoveNumberStart"]
174
187
  s15["normalizeNumber"]
175
188
  s16["plusOneFillZeros"]
176
189
  s17["plusOneAddNumberStart"]
177
190
  s18["plusOneCaryOne"]
178
- s19["plusOne"]
179
- s20["invertNumber>normalizeNumber"]
180
- s21["plusOne>invertNumber>normalizeNumber"]
181
- s22["invertNumber>plusOne>invertNumber>normalizeNumber"]
182
- s23(("minusOne"))
183
- s1 -- "$ → ·/S" --> s0
184
- s1 -- "* → ·/R" --> s1
185
- s5 -- "^ → ·/S" --> s0
186
- s5 -- "* → ·/L" --> s5
187
- s9 -- "^ → ·/R" --> s9
188
- s9 -- "1 → 0/R" --> s9
189
- s9 -- "0 → 1/R" --> s9
190
- s9 -- "$ → ·/S" --> s0
191
- s10 -- "^ → ·/S" --> s0
192
- s10 -- "* → ·/L" --> s5
191
+ s23["minusOne"]
192
+ idle([idle])
193
+ subgraph w_10["halt frame"]
194
+ s10[["goToNumberStart"]]
195
+ c10(((halt)))
196
+ end
197
+ subgraph w_14["halt frame"]
198
+ s14[["goToNumberStart"]]
199
+ c14(((halt)))
200
+ end
201
+ subgraph w_20["halt frame"]
202
+ s20[["invertNumber"]]
203
+ c20(((halt)))
204
+ end
205
+ subgraph w_21["halt frame"]
206
+ s21[["plusOne"]]
207
+ c21(((halt)))
208
+ end
209
+ subgraph w_22["halt frame"]
210
+ s22[["invertNumber"]]
211
+ c22(((halt)))
212
+ end
213
+ idle -. enter .-> s23
214
+ s1 -- "['$'] → [K]/[S]" --> s0
215
+ s1 -- "[*] → [K]/[R]" --> s1
216
+ s9 -- "['^'] → [K]/[R]" --> s9
217
+ s9 -- "['1'] → ['0']/[R]" --> s9
218
+ s9 -- "['0'] → ['1']/[R]" --> s9
219
+ s9 -- "['$'] → [K]/[S]" --> s0
220
+ s10 -- "['^'] → [K]/[S]" --> c10
221
+ s10 -- "[*] → [K]/[L]" --> s10
193
222
  s10 -. onHalt .-> s9
194
- s12 -- "-^/S" --> s1
195
- s13 -- "^|0 → ⌫/R" --> s13
196
- s13 -- "1|$·/L" --> s12
197
- s14 -- "^ → ·/S" --> s0
198
- s14 -- "* → ·/L" --> s5
223
+ s12 -- "[B]['^']/[S]" --> s1
224
+ s13 -- "['^']|['0'][E]/[R]" --> s13
225
+ s13 -- "['1']|['$'][K]/[L]" --> s12
226
+ s14 -- "['^'][K]/[S]" --> c14
227
+ s14 -- "[*][K]/[L]" --> s14
199
228
  s14 -. onHalt .-> s13
200
- s15 -- "^|1|0|$·/S" --> s14
201
- s15 -- "* → ·/S" --> s0
202
- s16 -- "1 → 0/R" --> s16
203
- s16 -- "$ → ·/S" --> s0
204
- s17 -- "-^/R" --> s17
205
- s17 -- "1 → ·/R" --> s16
206
- s18 -- "0 → 1/R" --> s16
207
- s18 -- "1 → ·/L" --> s18
208
- s18 -- "^ → 1/L" --> s17
209
- s19 -- "^|1|0 → ·/R" --> s19
210
- s19 -- "$·/L" --> s18
211
- s19 -- "* → ·/S" --> s0
212
- s20 -- "^|1|0|$ → ·/S" --> s10
213
- s20 -- "* → ·/S" --> s0
229
+ s15 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s14
230
+ s15 -- "[*][K]/[S]" --> s0
231
+ s16 -- "['1']['0']/[R]" --> s16
232
+ s16 -- "['$'][K]/[S]" --> s0
233
+ s17 -- "[B]['^']/[R]" --> s17
234
+ s17 -- "['1'][K]/[R]" --> s16
235
+ s18 -- "['0']['1']/[R]" --> s16
236
+ s18 -- "['1'][K]/[L]" --> s18
237
+ s18 -- "['^']['1']/[L]" --> s17
238
+ s20 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s10
239
+ s20 -- "[*][K]/[S]" --> c20
214
240
  s20 -. onHalt .-> s15
215
- s21 -- "^|1|0 → ·/R" --> s19
216
- s21 -- "$ → ·/L" --> s18
217
- s21 -- "* → ·/S" --> s0
241
+ s21 -- "['^']|['1']|['0'][K]/[R]" --> s21
242
+ s21 -- "['$'][K]/[L]" --> s18
243
+ s21 -- "[*][K]/[S]" --> c21
218
244
  s21 -. onHalt .-> s20
219
- s22 -- "^|1|0|$·/S" --> s10
220
- s22 -- "* → ·/S" --> s0
245
+ s22 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s10
246
+ s22 -- "[*][K]/[S]" --> c22
221
247
  s22 -. onHalt .-> s21
222
- s23 -- "^|1|0 → ·/R" --> s23
223
- s23 -- "$ → ·/S" --> s22
224
- s23 -- "* → ·/S" --> s0
248
+ s23 -- "['^']|['1']|['0'][K]/[R]" --> s23
249
+ s23 == "['$'][K]/[S]" ==> s22
250
+ s23 -- "[*][K]/[S]" --> s0
225
251
  ```
226
252
 
227
253
  ## minusOneFast
228
254
 
229
- *10 states (including `haltState`)*
255
+ *8 states; 15 transitions; 2 wrappers (max nesting depth 1); has cycles*
230
256
 
231
257
  ```mermaid
232
258
  flowchart TD
233
259
  %% alphabets: [[" ","^","$","0","1"]]
234
260
  s0(((halt)))
235
261
  s1["goToNumber"]
236
- s5["goToNumberStart"]
237
262
  s12["normalizeNumberPutNewStartSymbol"]
238
263
  s13["normalizeNumberMoveNumberStart"]
239
- s14["goToNumberStart>normalizeNumberMoveNumberStart"]
240
264
  s15["normalizeNumber"]
241
- s24["minusOneFastBorrow"]
242
- s25["minusOneFastBorrow>normalizeNumber"]
243
- s26(("minusOneFast"))
244
- s1 -- "$ → ·/S" --> s0
245
- s1 -- "* → ·/R" --> s1
246
- s5 -- "^ → ·/S" --> s0
247
- s5 -- "* → ·/L" --> s5
248
- s12 -- "- → ^/S" --> s1
249
- s13 -- "^|0 → ⌫/R" --> s13
250
- s13 -- "1|$ → ·/L" --> s12
251
- s14 -- "^ ·/S" --> s0
252
- s14 -- "*·/L" --> s5
265
+ s26["minusOneFast"]
266
+ idle([idle])
267
+ subgraph w_14["halt frame"]
268
+ s14[["goToNumberStart"]]
269
+ c14(((halt)))
270
+ end
271
+ subgraph w_25["halt frame"]
272
+ s25[["minusOneFastBorrow"]]
273
+ c25(((halt)))
274
+ end
275
+ idle -. enter .-> s26
276
+ s1 -- "['$'][K]/[S]" --> s0
277
+ s1 -- "[*] → [K]/[R]" --> s1
278
+ s12 -- "[B] → ['^']/[S]" --> s1
279
+ s13 -- "['^']|['0'] → [E]/[R]" --> s13
280
+ s13 -- "['1']|['$'] → [K]/[L]" --> s12
281
+ s14 -- "['^'] → [K]/[S]" --> c14
282
+ s14 -- "[*] → [K]/[L]" --> s14
253
283
  s14 -. onHalt .-> s13
254
- s15 -- "^|1|0|$·/S" --> s14
255
- s15 -- "* → ·/S" --> s0
256
- s24 -- "1 → 0/S" --> s0
257
- s24 -- "0 → 1/L" --> s24
258
- s24 -- "^ → ·/S" --> s0
259
- s25 -- "1 → 0/S" --> s0
260
- s25 -- "0 → 1/L" --> s24
261
- s25 -- "^ → ·/S" --> s0
284
+ s15 == "['^']|['1']|['0']|['$'][K]/[S]" ==> s14
285
+ s15 -- "[*][K]/[S]" --> s0
286
+ s25 -- "['1']['0']/[S]" --> c25
287
+ s25 -- "['0']['1']/[L]" --> s25
288
+ s25 -- "['^'][K]/[S]" --> c25
262
289
  s25 -. onHalt .-> s15
263
- s26 -- "^|1|0 → ·/R" --> s26
264
- s26 -- "$ → ·/L" --> s25
265
- s26 -- "* → ·/S" --> s0
290
+ s26 -- "['^']|['1']|['0'][K]/[R]" --> s26
291
+ s26 == "['$'][K]/[L]" ==> s25
292
+ s26 -- "[*][K]/[S]" --> s0
266
293
  ```