加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

参观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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读