首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何写状态机来计算笑脸的计数?

如何写状态机来计算笑脸的计数?
EN

Stack Overflow用户
提问于 2021-10-29 14:56:16
回答 1查看 679关注 0票数 0

我已经解决了这个问题数着笑脸

给定数组(arr)作为参数,完成函数countSmileys,该函数应该返回笑脸总数。 笑脸规则:

  • 每个笑脸都必须有一双有效的眼睛。眼睛可以标记为:;
  • 笑脸可以有鼻子,但不必这样做。鼻子的有效字符是-~
  • 每一张笑脸都必须有一张微笑的嘴,嘴上必须标记着)D

除提及的字符外,不允许添加其他字符。

有效笑脸示例: :) :D ;-D :~) 无效笑脸: ;( :> :} :]

示例

countSmileys(‘:),’';(',';}',':-D');//应该返回2;countSmileys(';D',‘:(’,‘:)’;~‘);//应该返回3;countSmileys(';',*’,':$',‘’;//应该返回1;

Note

如果出现空数组,则返回0。您将不会使用无效的输入进行测试(输入总是一个数组)。面部的顺序(眼睛,鼻子,嘴巴)元素总是一样的。

然后,当我查看解决方案时,我发现很多人使用regexp。然后编写一个状态机来实现regexp并解决这个问题。但我失败了。这是我的密码:

代码语言:javascript
复制
function countSmileys(smileys) {
  let state = smileyHasValidEye;
  return smileys.filter(smiley => {
    for (let s of [...smiley]) {
      state = state(s);
    }
    return state === true;
  }).length;
}

function smileyHasValidEye(s) {
  if (s === ':' || s === ';') {
    return smileyHasValidNose;
  }
  return smileyHasValidEye;
}

function smileyHasValidNose(s) {
  if (s === '-' || s === '~') {
    return smileyHasValidMouth;
  }
  return smileyHasValidMouth(s);
}

function smileyHasValidMouth(s) {
  if (s === ')' || s === 'D') {
    return true;
  }
  return;
}

console.log(countSmileys([':)', ';(', ';}', ':-D']));

我得到的错误是:

代码语言:javascript
复制
state = state(s);
              ^

TypeError: state is not a function

然后我调试了我的代码,我发现这个过程没有输入smileyHasValidNose函数。那我不知道原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-29 15:14:04

问题是,在微笑之间,您并没有真正地重置state。因此,下一个笑脸状态将是true,您不能调用它(它不是一个函数)。

您可以为state使用一个局部变量,将其重置为第一个函数(第一步)。

代码语言:javascript
复制
function countSmileys(smileys) {
  let firstStep = smileyHasValidEye;
  return smileys.filter(smiley => {
    let state = firstStep;
    for (let s of [...smiley]) {
      state = state(s);
    }
    return state === true;
  }).length;
}

function smileyHasValidEye(s) {
  if (s === ':' || s === ';') {
    return smileyHasValidNose;
  }
  return smileyHasValidEye;
}

function smileyHasValidNose(s) {
  if (s === '-' || s === '~') {
    return smileyHasValidMouth;
  }
  return smileyHasValidMouth(s);
}

function smileyHasValidMouth(s) {
  if (s === ')' || s === 'D') {
    return true;
  }
  return;
}

console.log(countSmileys([':)', ';(', ';}', ':-D']));

但是,如果字符串中除了笑脸(或笑笑的一部分)之外还有更多的字符串,则此代码将出错。

如果没有检测到笑脸,我会将smileyHasValidMouth更改为返回false。只是为了在这里更加一致..。

代码语言:javascript
复制
function smileyHasValidMouth(s) {
  if (s === ')' || s === 'D') {
    return true;
  }
  return false;
}

如果找到一个非函数的值,则调整循环以提前退出。

代码语言:javascript
复制
    for (let s of [...smiley]) {
      state = state(s);
      if(typeof state !== 'function') return state;
    }

代码语言:javascript
复制
function countSmileys(smileys) {
  let firstStep = smileyHasValidEye;
  return smileys.filter(smiley => {
    let state = firstStep;
    for (let s of [...smiley]) {
      state = state(s);
      if (typeof state !== 'function') return state;
    }
  }).length;
}

function smileyHasValidEye(s) {
  if (s === ':' || s === ';') {
    return smileyHasValidNose;
  }
  return smileyHasValidEye;
}

function smileyHasValidNose(s) {
  if (s === '-' || s === '~') {
    return smileyHasValidMouth;
  }
  return smileyHasValidMouth(s);
}

function smileyHasValidMouth(s) {
  if (s === ')' || s === 'D') {
    return true;
  }
  return false;
}

console.log(countSmileys([':~(', ':>', ':D', ':(', ':o>', ';)', ':)']));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69770950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档