Golang中遇到这个问题你会怎么解决?
Golang中遇到这个问题你会怎么解决? 你好。
我正在尝试解决来自 Exercism.io 的一个挑战:
鲍勃是个懒散的青少年。在对话中,他的回答非常有限。
如果你问他问题,他会回答"当然。"
如果你对他大喊大叫,他会回答"哇,冷静点!"
如果你对他大喊着问问题,他会回答"冷静点,我知道我在做什么!"
如果你没有实际说什么就跟他说话,他会说"好吧。随你便!"
对其他任何情况,他都会回答"随便。"
鲍勃的对话伙伴在书面交流方面是个纯粹主义者,总是遵循英语句子标点的正常规则。
你会如何解决这个问题?
我的第一直觉是使用 strings.Contains() 查找结尾的特殊字符,因为据我理解:
如果你大喊,句子以"!“结尾
如果你提问,句子以”?“结尾
如果你大喊着提问,句子以”!?“结尾
如果你没有实际说什么就跟他说话(比如只说"鲍勃”),你可以检查单词中是否包含鲍勃。
最后,对于不匹配以上任何情况的内容,给出默认回答。
我创建了一个 switch 语句,但如果问题以"!?“结尾,switch 语句会在第一个匹配”!"的 case 处返回 true。
还有其他问题,比如如果我提问时包含鲍勃,例如"鲍勃,你倒垃圾了吗?",它可能会在鲍勃检查处返回 true,而不是在"?"检查处(如果先检查鲍勃的话)。
然后我考虑分割字符串,检查数组中的最后一个元素,看它是否等于"!"、"?"等等。 但由于必须符合正确的标点规则,句子会以"示例?“结尾,而不是"示例 ?”。
我一直在查看标准库,但到目前为止没能找到能帮助我解决这个问题的方法,所以我向你求助。 你会如何解决这个问题? 我对完成的代码不太感兴趣,更感兴趣的是解决一个你不知从何入手的问题所需的步骤。
希望我说的有点道理。
更多关于Golang中遇到这个问题你会怎么解决?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
能否请您发布一些代码?这样会更容易提供帮助。
更多关于Golang中遇到这个问题你会怎么解决?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在switch语句中,也许可以先将!?的情况放在前面。
感谢您的反馈,我没想到这会被误认为是作业 😊 我已经编辑了帖子并包含了指向 exercism.io 练习的链接。既然知道大喊大叫就是全大写,我现在会再试一次!
STPE:
我创建了一个switch语句,但遇到了一个问题:如果问题以"!?“结尾,switch语句会在第一个判断”!"时就返回true
我认为你应该对文本进行最小化的词法分析(分词器、解析器等)。使用简单的switch语句会在各种文本组合情况下失效。
你误解了这个练习的测试数据。
大喊大叫不受感叹号影响,大喊大叫仅由字母的大小写决定。
另外,请记住,当你有关于 exercism 练习的问题时,请说明你实际上正在做一个 exercism 练习。
这将让人们了解实际的测试数据和 exercism 的具体要求(如果有的话)。你现在的提问方式看起来像是一个来自学校的随机不透明的家庭作业,缺少很多数据。而那些认出这是 exercism 练习的人,可以像我前两句话那样准确指出你理解上的错误。
在Go语言中处理这种基于输入文本模式匹配的问题,通常需要结合字符串处理和条件逻辑。根据你的描述,问题的核心在于正确识别不同的输入模式并返回相应的响应。以下是一个结构化的解决方案思路和示例代码:
步骤分析
- 清理输入:去除字符串首尾的空白字符,避免干扰模式匹配。
- 检查空输入或无效输入:如果输入为空或仅包含空白字符,返回特定响应。
- 定义匹配规则:
- 大喊:全大写字母且以
!结尾。 - 提问:以
?结尾。 - 大喊着提问:全大写字母且以
?结尾(或包含!,但根据规则,标点通常不会混合)。 - 无实际内容:输入无效或仅包含无意义字符。
- 默认情况:不匹配以上任何规则。
- 大喊:全大写字母且以
- 优先级处理:确保规则按正确顺序检查,例如先检查更具体的模式(如大喊着提问),再检查一般模式。
示例代码
package bob
import (
"strings"
"unicode"
)
// Hey 返回鲍勃对输入的响应
func Hey(remark string) string {
// 清理输入,去除首尾空白
remark = strings.TrimSpace(remark)
// 检查空输入
if remark == "" {
return "Fine. Be that way!"
}
// 检查是否为大写字母(大喊)
isShout := isUpperCase(remark)
// 检查是否为提问
isQuestion := strings.HasSuffix(remark, "?")
// 检查是否为大写着提问
isShoutQuestion := isShout && isQuestion
// 按优先级处理规则
switch {
case isShoutQuestion:
return "Calm down, I know what I'm doing!"
case isShout:
return "Whoa, chill out!"
case isQuestion:
return "Sure."
default:
return "Whatever."
}
}
// isUpperCase 检查字符串是否全为大写字母(至少包含一个字母)
func isUpperCase(s string) bool {
hasLetter := false
for _, r := range s {
if unicode.IsLetter(r) {
hasLetter = true
if !unicode.IsUpper(r) {
return false
}
}
}
return hasLetter
}
关键点说明
- 字符串清理:使用
strings.TrimSpace处理输入,避免空白字符影响匹配。 - 大写检查:自定义
isUpperCase函数,确保字符串至少包含一个字母,且所有字母均为大写。这通过unicode包实现字符级检查。 - 规则优先级:在
switch语句中,先检查最具体的条件(如大喊着提问),再检查一般条件。 - 标点处理:直接使用
strings.HasSuffix检查结尾标点,符合英语标点规则(例如"Example?")。
这种方法避免了依赖strings.Contains或分割字符串的复杂性,直接基于清理后的输入和字符属性进行匹配。如果输入规则变化(例如混合标点),可调整条件逻辑。


