这是我的解决方案:
package mainimport ( "io" "os" "strings")type rot13Reader struct { r io.Reader}func rot13(x byte) byte { switch { case x >= 65 && x <= 77: fallthrough case x >= 97 && x <= 109: x = x + 13 case x >= 78 && x <= 90: fallthrough case x >= 110 && x >= 122: x = x - 13 } return x}func (r13 *rot13Reader) Read(b []byte) (int,error) { n,err := r13.r.Read(b) for i := 0; i <= n; i++ { b[i] = rot13(b[i]) } return n,err}func main() { s := strings.NewReader("Lbh penpxrq gur pbqr!") r := rot13Reader{s} io.copy(os.Stdout,&r)}
它返回你prnpxrq tur poqr!,这意味着只有“Lbh penpxrq gur pbqr!”的第一个字.破了.我该如何破解整个句子?
解决方法 编辑:基本上你的解决方案很好并且有效,你输错了1个字符:
case x >= 110 && x >= 122:
将其更改为:
case x >= 110 && x <= 122:
您的输入和输出:
Lbh penpxrq gur pbqr!You prnpxrq tur poqr!
每个字都有变化.问题不在于只有第一个字被读取和解码,问题在于你的解码算法.
在ROT13中,如果移动超出字母范围,则必须从字母表的开头(或结尾处)开始.例如,移位’N’将是’Z’1,因此它变成’A’,即第一个字母.看到这个简单的字符映射:
ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyznopQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
所以你应该做的是在移动13之后,如果字母超出字母表,将它移动-26(英文字母中的字母数),这会产生预期的效果(在你从第一个字母开始的最后一个字母之后) ).
示例解决方案:
func rot13(x byte) byte { cAPItal := x >= 'A' && x <= 'Z' if !cAPItal && (x < 'a' || x > 'z') { return x // Not a letter } x += 13 if cAPItal && x > 'Z' || !cAPItal && x > 'z' { x -= 26 } return x}
它的输出:
You cracked the code!
试试Go Playground.
总结以上是内存溢出为你收集整理的参观Golang练习:rot13Reader全部内容,希望文章能够帮你解决参观Golang练习:rot13Reader所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)