回答編集履歴

2

質問を誤解していたので、訂正のコードを追加

2020/11/03 14:50

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -161,3 +161,91 @@
161
161
  しかし、状態は { p, q, d, >q, <d } であり、
162
162
 
163
163
  q より大きい数は無数にあるので、 これを有限状態とは言えません。
164
+
165
+
166
+
167
+ **追記2**
168
+
169
+ > 例えばaaabだとしたらYESと表示され、
170
+
171
+ bbaとかだとNOと表示されるプログラムです。
172
+
173
+
174
+
175
+ 私はこれを読み違えて、aaab は YES、abb は NO と書かれているものだと
176
+
177
+ 信じ込んでいました。
178
+
179
+ だから、m > n という条件を勝手に想定していました。
180
+
181
+ そして、それは有限オートマトンにはなりえないと言ってしまいました。
182
+
183
+
184
+
185
+ m > 0 かつ n > 0 という条件があるだけで m と n の大小が無関係なら
186
+
187
+ それは "a+b+" または "aa*bb*" という正規表現で表せるので、
188
+
189
+ 4つの状態を持つ有限オートマトンになります。
190
+
191
+
192
+
193
+ 質問のコードを修正するとすれば、
194
+
195
+ ```C
196
+
197
+ #include <stdio.h>
198
+
199
+
200
+
201
+ #define p 0
202
+
203
+ #define q 1
204
+
205
+ #define r 2
206
+
207
+ #define d 3
208
+
209
+
210
+
211
+ int main(void)
212
+
213
+ {
214
+
215
+ int s = p, c;
216
+
217
+ char str[30];
218
+
219
+ scanf("%s", str);
220
+
221
+ for (int i = 0; c = str[i]; i++) {
222
+
223
+ if (s == p && c == 'a') s = q;
224
+
225
+ else if (s == p && c == 'b') s = d;
226
+
227
+ else if (s == q && c == 'a') s = q;
228
+
229
+ else if (s == q && c == 'b') s = r;
230
+
231
+ else if (s == r && c == 'a') s = d;
232
+
233
+ else if (s == r && c == 'b') s = r;
234
+
235
+ else if (s == d && c == 'a') s = d;
236
+
237
+ else if (s == d && c == 'b') s = d;
238
+
239
+ }
240
+
241
+ if (s == r)
242
+
243
+ puts("Yes");
244
+
245
+ else
246
+
247
+ puts("No");
248
+
249
+ }
250
+
251
+ ```

1

有限オートマトン風のコードを追加

2020/11/03 14:50

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -99,3 +99,65 @@
99
99
  $
100
100
 
101
101
  ```
102
+
103
+ **追記**
104
+
105
+ 状態変数 s と状態 { p, q, d } で有限オートマトン風に書き直してみました。
106
+
107
+ ```C
108
+
109
+ #include <stdio.h>
110
+
111
+
112
+
113
+ enum { p = 0, q = 1, d = -1 };
114
+
115
+
116
+
117
+ int automaton(const char *str)
118
+
119
+ {
120
+
121
+ int s = p, c;
122
+
123
+ while (s != d && (c = *str++))
124
+
125
+ if (s == p && c == 'a') s = q;
126
+
127
+ else if (s == p && c == 'b') s = d;
128
+
129
+ else if (s == q && c == 'a') s++;
130
+
131
+ else if (s == q && c == 'b') s = d;
132
+
133
+ else if (s > q && c == 'a') s++;
134
+
135
+ else if (s > q && c == 'b') s = -s;
136
+
137
+ else if (s < d && c == 'a') s = d;
138
+
139
+ else if (s < d && c == 'b') s++;
140
+
141
+ return s < d;
142
+
143
+ }
144
+
145
+
146
+
147
+ int main(void)
148
+
149
+ {
150
+
151
+ char s[100];
152
+
153
+ while (printf(">> "), scanf("%99s", s) == 1)
154
+
155
+ puts(automaton(s) ? "YES" : "NO");
156
+
157
+ }
158
+
159
+ ```
160
+
161
+ しかし、状態は { p, q, d, >q, <d } であり、
162
+
163
+ q より大きい数は無数にあるので、 これを有限状態とは言えません。