参观Golang练习:rot13Reader

参观Golang练习:rot13Reader,第1张

概述我正在努力解决Golang游览练习 rot13Reader: 这是我的解决方案: package mainimport ( "io" "os" "strings")type rot13Reader struct { r io.Reader}func rot13(x byte) byte { switch { case x >= 65 我正在努力解决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    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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1267748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存