선수로 산다, 때론 좋은 코치로

[golang] A Tour of Go - 61 연습 문제 본문

개발 관련/go

[golang] A Tour of Go - 61 연습 문제

godsman 2018. 2. 13. 18:30

[golang] A Tour of Go - 61 연습 문제

A Tour of Go 연습: Rot13 Reader - https://go-tour-kr.appspot.com/#61

어떤 식으로든 스트림을 수정하여 다른 io.Reader 를 감싸는 io.Reader 는 흔한 패턴입니다. 

예컨대, gzip.NewReader 함수는 io.Reader (gzip으로 압축된 데이터의 스트림) 를 가지고, io.Reader (압축 해제된 데이터의 스트림) 를 구현한 `*gzip.Reader`를 반환합니다. 

ROT13 치환 암호화를 모든 알파벳 문자에 적용함으로써 스트림을 수정하며 io.Reader 를 구현하고 io.Reader 로 부터 읽는 rot13Reader 를 구현하십시오. 

rot13Reader 타입은 당신을 위해 제공됩니다. 이 타입의 Read 함수를 구현함으로써 io.Reader 을 만들어 보십시오. 

go 언어는 내부에 연결되어 있는 함수를 재정의하는 방법을 사용합니다. 이런 프로그래밍 방법에 대해서는 좀더 스터디가 필요합니다.

ROT13 치환 암호화는 입력 알파벳을 13만큼 이동시킨 것으로, a -> a+13 = n, b -> b+13 = o로 치환합니다. 알파벳 z가 넘어갈 경우에는 다시 a 부터 시작하도록 순환합니다. p -> p+13 = z+3 = c

wikipedia의 설명과 그림을 보면 쉽게 이해할 수 있습니다.


package main

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

type rot13Reader struct {
r io.Reader
}

func rot13byte(sb byte) byte {
s := rune(sb)
if s >= 'a' && s <= 'm' || s >= 'A' && s <= 'M' {
sb += 13
}
if s >= 'n' && s <= 'z' || s >= 'N' && s <= 'Z' {
sb -= 13
}

return sb
}

func (rot13 rot13Reader) Read(data []byte) (len int, err error) {
len, err = rot13.r.Read(data)
for i := 0; i < len; i++ {
data[i] = rot13byte(data[i])
}

return
}

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


Comments