선수로 산다, 때론 좋은 코치로
[golang] A Tour of Go - 61 연습 문제 본문
[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)
}
'개발 관련 > go' 카테고리의 다른 글
[golang] 인코딩 변환하기(euc-kr > utf-8) (0) | 2018.02.20 |
---|---|
[golang] 엘라스틱서치로 우리은행 거래내역 분석하기-엑셀파일 읽기 (0) | 2018.02.19 |
[golang] A Tour of Go - 60 연습 문제 (0) | 2018.02.13 |
[golang] A Tour of Go - 58 연습 문제 (0) | 2018.02.12 |
[golang] A Tour of Go - 56 연습 문제 (0) | 2018.02.12 |
Comments