参观Golang练习:rot13Reader
发布时间:2020-12-16 09:28:41 所属栏目:大数据 来源:网络整理
导读:我正在努力解决Golang游览练习 rot13Reader: 这是我的解决方案: 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
我正在努力解决Golang游览练习
rot13Reader:
这是我的解决方案: package main import ( "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’,即第一个字母.看到这个简单的字符映射: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm 所以你应该做的是在移动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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |