A Tour of Go 60 Exercise: Rot13 Reader

演習: ROT13 換字式暗号をすべてのアルファベットの文字に適用します。


 良く解らなかったので、答え見ながら書いた*1

Google Code Archive - Long-term storage for Google Code Project Hosting.

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

func rot13(i byte) byte {
    var a,z byte
	
    switch {
    case 'a' <= i && i <= 'z':
        a,z = 'a','z'
    case 'A' <= i && i <= 'Z':
        a,z = 'A','Z'
    default:
        return i
    }
    return (i-a+13)%(z-a+1)+a
}

func (r *rot13Reader) Read(p []byte) (n int, err error) {
    n, err = r.r.Read(p)
    
    for i := 0; i<n; i++ {
        p[i] = rot13(p[i])
    }
    
    return 
}

func main() {
    s := strings.NewReader(
        "Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

*1:コピペ><