有限ステートマシン
- すべての状態はマシン
- 各マシンでは、計算、記憶、出力が可能。
- これらのマシンはすべて同じ入力を受け付けます
- ステートマシンの各マシンはそれ自身の状態を持たず、もし関数として表現されるなら、それは
- 純粋な機能 - 各マシンは次の状態を知っています。
- 各マシンは次の状態を定義
- 各マシンは入力に基づいて次の状態を決定
//各関数はステート
function state(input) //関数の引数は入力である
{
//関数内では、各状態のロジックを処理するコードを自由に書くことができる。
return next;//その値を次のステートとして返す
}
/////////以下は、//////////////の呼び出しである。
while(input) {
//入力を得る
state = state(input); //ステートマシンの戻り値を次の状態として使う。
}
II. ステートマシンを使わない文字列の処理
// 1
function indexof(string) {
let result = string.indexOf('a')
return result !== -1
}
// 2
function forof(string) {
for(let c of string){
if(c == 'a'){
return true;
}
}
return false;
}
// 3
function reg(string) {
let reg = RegExp(/a/)
return reg.test(string)
}
// 4
function search(string) {
return string.search('a') !== -1
}
// 5
function match(string) {
let reg = RegExp(/a/)
return string.match(reg) !==null
}
// 1
function indexof(string) {
let result = string.indexOf('ab')
return result !== -1
}
console.log(indexof('123abc'));
// 2
function search(string) {
return string.search('ab') !== -1
}
console.log(search('12a3bc'));
// 3
function forof(string) {
let hasA = false
for(let c of string){
if(c == 'a'){
hasA = true;
}else if (hasA && c === 'b'){
return true;
}else {
hasA = false;
}
}
}
console.log(forof('1abcdefg'));
function findString(string,tar) {
if (string.length < tar.length || typeof string !=='string' || typeof tar !== 'string' || !tar) return false;
for (let i = 0; i < string.length - tar.length-1; i++) {
let newStr = string.slice(i, i + tar.length)
if (newStr === tar) return true;
}
return false;
}
console.log(findString('012abccdef222','')) //false
console.log(findString('012ab','abcdef')) //false
console.log(findString(1234567,'abcdef')) //false
console.log(findString('012abccdef222',1234)) //false
console.log(findString('012abccdef222','abcdef')) //false
console.log(findString('012abcdef222','abcdef')) // true
II. ステートマシンを使った文字列の処理
function forof(string) {
let state = start
for(let c of string){
state = state(c)
}
return state == end
}
function start(c) {
if(c == 'a'){
return foundB;
}else{
return start;
}
}
function foundB(c) {
if(c == 'b'){
return foundC;
}else{
return start(c);
}
}
function foundC(c) {
if(c == 'c'){
return foundD;
}else{
return start(c);
}
}
function foundD(c) {
if(c == 'd'){
return foundE;
}else{
return start(c);
}
}
function foundE(c) {
if(c == 'e'){
return foundF;
}else{
return start(c);
}
}
function foundF(c) {
if(c == 'f'){
return end;
}else{
return start(c);
}
}
function end(c) {
return end
}
console.log(forof('123abaabcdefg'));
文字列の中から "abcabx "という文字を探します。
function forof(string) {
let state = start
for (let c of string) {
state = state(c)
}
return state == end;
}
// を探し始める
function start(c) {
if (c == 'a') {
return foundB;
} else {
return start;
}
}
// bを探し始める。
function foundB(c) {
if (c == 'b') {
return foundC;
} else {
return start(c);
}
}
// cを探し始める。
function foundC(c) {
if (c == 'c') {
return foundA2;
} else {
return start(c);
}
}
// a2を探し始める。
function foundA2(c) {
if (c == 'a') {
return foundB2;
} else {
return start(c);
}
}
// bを探し始める。
function foundB2(c) {
if (c == 'b') {
return foundEnd;
} else {
return start(c);
}
}
// xを探し始める
function foundEnd(c) {
if (c == 'x') {
return end;
} else {
return foundC(c);
}
}
function end(c) {
return end;
}
console.log(forof('abcabcabcabcabx'));
function forof(string) {
let state = start
for (let c of string) {
state = state(c)
}
return state == end;
}
function start(c) {
if (c == 'a') {
return foundB;
} else {
return start;
}
}
function foundB(c) {
if (c == 'b') {
return foundA2;
} else {
return start(c);
}
}
function foundA2(c) {
if (c == 'a') {
return foundB2;
} else {
return start(c);
}
}
function foundB2(c) {
if (c == 'b') {
return foundA3;
} else {
return start(c);
}
}
function foundA3(c) {
if (c == 'a') {
return foundB3;
} else {
return start(c);
}
}
function foundB3(c) {
if (c == 'b') {
return foundEnd;
} else {
return start(c);
}
}
function foundEnd(c) {
if (c == 'x') {
return end;
} else {
return foundA3(c);
}
}
function end(c) {
return end;
}
console.log(forof('ababab1abababx'));