티스토리 뷰

Language/Go

Go. gotour 61. Rot13 Reader

out of coding 2019. 8. 14. 11:47

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

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

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

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

문제는 위와 같습니다.

 

ROT13이란?

2019/08/14 - [Program/Algorithm] - ROT13

 

ROT13

단순한 암호화 방법의 하나인데요. 알파벳에 특정하게 값을 더하여 암호화 시키는 방법입니다. wiki : https://ko.wikipedia.org/wiki/ROT13 ROT13 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과..

mrgamza.tistory.com

* 풀이

package main

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

type rot13Reader struct {
    r io.Reader
}

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 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 main() {
    s := strings.NewReader(
        "Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

 

class가 없는 구조상 struct를 만들고 그것을 swift의 extension 하는 방식처럼 구현하는게 뭔가 좀 어색하면서 재밌습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함