blog

フロントエンドVIを学び直す - ステートマシン

それぞれのマシンで、計算、記憶、出力を行うことができます。...

May 28, 2020 · 4 min. read
シェア

有限ステートマシン

  • すべての状態はマシン
    • 各マシンでは、計算、記憶、出力が可能。
    • これらのマシンはすべて同じ入力を受け付けます
    • ステートマシンの各マシンはそれ自身の状態を持たず、もし関数として表現されるなら、それは
  • 純粋な機能 - 各マシンは次の状態を知っています。
    • 各マシンは次の状態を定義
    • 各マシンは入力に基づいて次の状態を決定
//各関数はステート
function state(input) //関数の引数は入力である
{
//関数内では、各状態のロジックを処理するコードを自由に書くことができる。
return next;//その値を次のステートとして返す
}
/////////以下は、//////////////の呼び出しである。
while(input) {
//入力を得る
state = state(input); //ステートマシンの戻り値を次の状態として使う。
}

II. ステートマシンを使わない文字列の処理

  • 文字列から "a "を検索します。


// 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
}
  • 文字列から "ab "を検索します。


// 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'));
  • 文字列から "abcdef" を検索します。

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'));
Read next

JSアルゴリズム学習の旅 - 配列

17.電話番号のアルファベット順の組み合わせ 2~9の数字だけを含む文字列が与えられたとき、その文字列が表すことのできるすべての文字の組み合わせを返します。 数字と文字の対応付けは以下のようになります。1はどの文字にも対応しないことに注意してください。 出力: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf...

May 27, 2020 · 4 min read