package main | |
import ( | |
"io" | |
"os" | |
"strings" | |
) | |
type rot13Reader struct { | |
r io.Reader | |
} | |
func (rot *rot13Reader) Read(p []byte) (n int, err error) { | |
n, err = rot.r.Read(p) | |
for i := 0; i < len(p); i++ { | |
if p[i] >= 'A' && p[i] < 'Z' { | |
p[i] = 65 + (((p[i] - 65) + 13) % 26) | |
} else if p[i] >= 'a' && p[i] <= 'z' { | |
p[i] = 97 + (((p[i] - 97) + 13) % 26) | |
} | |
} | |
return | |
} | |
func main() { | |
s := strings.NewReader("Lbh penpxrq gur pbqr!") | |
r := rot13Reader{s} | |
io.Copy(os.Stdout, &r) | |
} |
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r *rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
for sub_each := range make([]byte, n) {
b[sub_each] = rot13substitution(b[sub_each])
}
return n, err
}
func rot13substitution(b byte) byte {
var s byte
if (65 <= b) && (b <= 90) {
s = b + 13
if s > 90 {
s = 65 + (s - 91)
}
return s
}
if (97 <= b) && (b <= 122) {
s = b + 13
if s > 122 {
s = 97 + (s - 123)
}
return s
}
s = b
return s
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(p []byte) (n int, err error) {
n, err = rot.r.Read(p)
for i := 0; i < len(p); i++ {
if p[i] >= 'A' && p[i] <= 'z' {
p[i] += 13
if p[i] > 'z' {
p[i] -= 26
}
}
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
if err == nil {
for i := range b {
switch true {
case b[i] >= 97 && b[i] <= 109:
b[i] += 13
case b[i] > 109 && b[i] <= 122:
b[i] -= 13
case b[i] >= 65 && b[i] <= 77:
b[i] += 13
case b[i] > 77 && b[i] <= 90:
b[i] -= 13
}
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r rot13Reader) Read(b []byte) (int, error) {
var table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM"
n, err := r.r.Read(b)
if err == nil {
for i := 0; i < n; i++ {
var c = b[i]
if 'A' <= c && c <= 'Z' {
b[i] = table[c-'A'+13]
} else if 'a' <= c && c <= 'z' {
b[i] = table[c-'a'+39]
}
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r *rot13Reader) Read(p []byte) (n int, err error) {
n, err = r.r.Read(p)
for i := 0; i < n; i++ {
if p[i] >= 'A' && p[i] <= 'a' || p[i] >= 'a' && p[i] <= 'z' {
p[i] += 13
if p[i] > 'z' {
p[i] -= 26
}
}
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
Solution using switch cases!
func (r rot13Reader) Read(b []byte) (int, error) {
n, e := r.r.Read(b)
if e != nil {
return 0, e
}
for i := range b {
switch {
case b[i] >= 'A' && b[i] <= 'Z':
b[i] = ((b[i] - 'A' + 13) % 26) + 'A'
case b[i] >= 'a' && b[i] <= 'z':
b[i] = ((b[i] - 'a' + 13) % 26) + 'a'
default:
}
}
return n, nil
}
func (r rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
if err != nil {
return 0, err
}
// Not sure if a range over `b` is always correct.
// Can't the slice have higher length than n?
for i := 0; i < n; i++ {
c := b[i]
if ('A' <= c && c <= 'M') || ('a' <= c && c <= 'm') {
b[i] += 13
} else if ('N' <= c && c <= 'Z') || ('n' <= c && c <= 'z') {
b[i] -= 13
}
}
return n, nil
}
package main import ( "io" "os" "strings" ) type rot13Reader struct { r io.Reader } func (r rot13Reader) Read(b []byte) (int, error) { n, err := r.r.Read(b) if err == nil { for i := range b { switch true { case b[i] >= 97 && b[i] <= 109: b[i] += 13 case b[i] > 109 && b[i] <= 122: b[i] -= 13 case b[i] >= 65 && b[i] <= 77: b[i] += 13 case b[i] > 77 && b[i] <= 90: b[i] -= 13 } } } return n, err } func main() { s := strings.NewReader("Lbh penpxrq gur pbqr!") r := rot13Reader{s} io.Copy(os.Stdout, &r) }
Do not need the true
at the switch statement. By default nothing means true. Also kudos, this version is easy to read!
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(b []byte) (int, error) {
n, err := rot.r.Read(b)
if err == nil {
firstLetter := byte(0)
for i := 0; i < len(b); i++ {
if b[i] >= 'A' && b[i] <= 'Z' {
firstLetter = 'A'
} else if b[i] >= 'a' && b[i] <= 'z' {
firstLetter = 'a'
} else {
continue
}
b[i] = firstLetter + ((b[i] - firstLetter + 13) % 26)
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
My approach to increase readability and avoid code duplication
package main
import (
"io"
"os"
"strings"
)
const orig string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
const rot13table string = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm "
type rot13Reader struct {
r io.Reader
}
func buildMap() map[rune]rune {
var dict map[rune]rune
dict = make(map[rune]rune)
origRune := []rune(orig)
tableRune := []rune(rot13table)
for idx, char := range origRune {
dict[char] = tableRune[idx]
}
//fmt.Println(dict)
return dict
}
func (rot *rot13Reader) Read(b []byte) (n int, err error) {
n, err = rot.r.Read(b)
dict := buildMap()
for i := 0; i < len(b); i++ {
r2, contains := dict[rune(b[i])]
if contains {
b[i] = byte(r2)
} else {
continue
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r rot13Reader) Read(b []byte) (int,error) {
res, err := r.r.Read(b)
for i:=0;i<len(b);i++ {
if b[i] >= 'a' && b[i] <= 'z' {
b[i]-=13
if(b[i]< 'a') {
b[i]+=26
}
}
if( b[i] >= 'A' && b[i] <= 'Z') {
b[i]-=13
if(b[i]< 'A') {
b[i]+=26
}
}
}
return res, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r *rot13Reader) Read(p []byte) (n int, err error) {
n, err = r.r.Read(p)
for i, code := range p {
if 'A' <= code && code <= 'M' || 'a' <= code && code <= 'm' {
p[i] += 13
} else if 'N' <= code && code <= 'Z' || 'n' <= code && code <= 'z' {
p[i] -= 13
}
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (self rot13Reader) Read(b []byte) (int, error) {
num, err := self.r.Read(b)
if err == nil {
for i := 0; i < num; i++ {
switch {
case 'A' < b[i] && b[i] < 'Z':
b[i] = 'A' + ((b[i] - 'A' + 13) % 26)
case 'a' < b[i] && b[i] < 'z':
b[i] = 'a' + ((b[i] - 'a' + 13) % 26)
}
}
}
return num, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(b[]byte) (n int, err error){
n, err = rot.r.Read(b)
for i := 0; i < len(b); i++{
if b[i] >= 66 && b[i] <= 123 {
b[i] = b[i] + 13
if b[i] >= 123{
b[i] = b[i] - 26
}
}
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot rot13Reader) Read(p []byte) (l int, err error) {
if l, err = rot.r.Read(p); err != nil { return }
for i:=0; i<l; i+=1{
p[i] = convertToRot(13, p[i])
}
return
}
func convertToRot(rot byte, b byte) byte {
switch {
case b <= 'Z' && 'Z' - rot + 1 <= b:
return (b + rot) % ('Z' + 1) + 'A'
case b <= 'z' && 'z' - rot + 1 <= b:
return (b + rot) % ('z' + 1) + 'a'
default:
return b + rot
}
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
`package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(b []byte) (int, error) {
n, err := rot.r.Read(b)
if err != nil {
return 0, err
}
for i := 0; i < len(b); i++ {
if b[i] >= 'A' && b[i] < 'M' || b[i] >= 'a' && b[i] <= 'm' {
b[i] += 13
} else if b[i] >= 'N' && b[i] < 'Z' || b[i] >= 'n' && b[i] <= 'z' {
b[i] -= 13
}
}
return n, nil
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}`
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot rot13Reader) Read(r []byte) (int, error) {
n, err := rot.r.Read(r)
for j := range r {
if r[j] >= 'A' && r[j] <= 'z' {
if (r[j] > 'M' && r[j] <= 'Z') || (r[j] > 'm') {
r[j] -= 13
} else {
r[j] += 13
}
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
const minASCIITableLatinCode = 64
const maxASCIITableLatinCode = 122
const rot13CipherOffset = 13
type rot13Reader struct {
r io.Reader
}
func (rot13 *rot13Reader) Read(buffer []byte) (n int, err error) {
n, err = rot13.r.Read(buffer)
if err != nil {
return 0, err
}
for key, _ := range buffer {
translatedUtf8CharCode := buffer[key] + rot13CipherOffset
if translatedUtf8CharCode > maxASCIITableLatinCode {
translatedUtf8CharCode = translatedUtf8CharCode - maxASCIITableLatinCode + minASCIITableLatinCode
}
buffer[key] = translatedUtf8CharCode
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
Not sure if it's correct, but at least I tried.
package main
import (
"io"
"os"
"strings"
)
const input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
const output = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
type Rot13Reader struct {
r io.Reader
}
func (a Rot13Reader) Read(b []byte) (int, error) {
l, err := a.r.Read(b)
if err != nil {
return 0, err
}
for i := 0; i < l; i++ {
idx := strings.IndexByte(input, b[i])
if idx != -1 {
b[i] = byte(output[idx])
}
}
return l, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := Rot13Reader{s}
io.Copy(os.Stdout, &r)
}
A simple check would involve:
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot rot13Reader) Read(p []byte) (int, error) {
n, err := rot.r.Read(p)
for i := 0; i < n; i++ {
letterNum := p[i] | 32 - 'a'
switch {
case letterNum < 13:
p[i] = p[i] + 13
case 13 <= letterNum && letterNum < 26:
p[i] = p[i] - 13
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
Or in case you prefer a map lookup
var rot13table = map[byte]byte{
'A': 'N',
'B': 'O',
'C': 'P',
'D': 'Q',
'E': 'R',
'F': 'S',
'G': 'T',
'H': 'U',
'I': 'V',
'J': 'W',
'K': 'X',
'L': 'Y',
'M': 'Z',
'N': 'A',
'O': 'B',
'P': 'C',
'Q': 'D',
'R': 'E',
'S': 'F',
'T': 'G',
'U': 'H',
'V': 'I',
'W': 'J',
'X': 'K',
'Y': 'L',
'Z': 'M',
'a': 'n',
'b': 'o',
'c': 'p',
'd': 'q',
'e': 'r',
'f': 's',
'g': 't',
'h': 'u',
'i': 'v',
'j': 'w',
'k': 'x',
'l': 'y',
'm': 'z',
'n': 'a',
'o': 'b',
'p': 'c',
'q': 'd',
'r': 'e',
's': 'f',
't': 'g',
'u': 'h',
'v': 'i',
'w': 'j',
'x': 'k',
'y': 'l',
'z': 'm',
}
func (rot rot13Reader) Read(p []byte) (int, error) {
n, err := rot.r.Read(p)
for i := 0; i < n; i++ {
if c, ok := rot13table[p[i]]; ok {
p[i] = c
}
}
return n, err
}
However that takes up more code real estate.
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot rot13Reader) Read(b []byte) (int, error) {
n, err := rot.r.Read(b)
if err != nil {
return n, err
}
for i, v := range b {
if 'A' <= v && v <= 'Z' {
mod := byte('Z' + 1)
q := (v+13) / mod
b[i] = q*'A' + (v + 13) % mod
}
if 'a' <= v && v <= 'z' {
mod := byte('z' + 1)
q := (v+13) / mod
b[i] = q*'a' + (v + 13) % mod
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
It took a little bit, but I'm happy with my implementation of this one., and had fun trying to clean it up. Might have some unnecessary code. Commented with explanations.
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
// Read loops over a []byte b for the number of bytes populated (n).
// Each byte in b is replaced with its rot13 substitution cypher.
func (rot *rot13Reader) Read(b []byte) (n int, err error) {
n, err = rot.r.Read(b)
for i := 0; i < n; i++ {
b[i] = rot13Byte(b[i])
// Unexpected error handling; unsure if this would ever catch.
if err != nil {
break
}
}
return
}
// rot13Byte takes a byte and returns its rot13 substitution cypher
// if the byte corresponds to an alphabetic character.
func rot13Byte(b byte) byte {
// If the byte is capital or lowercase A - M, shift it 13 letters up.
if b >= 'A' && b <= 'M' || b >= 'a' && b <= 'm' {
return b + 13
}
// If the byte is capital or lowercase N - Z, shift it 13 letters down.
if b >= 'N' && b <= 'Z' || b >= 'n' && b <= 'z' {
return b - 13
}
return b
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
//"fmt"
)
//GIVEN INTERFACE FOR -> rot13Reader
type rot13Reader struct {
r io.Reader
}
//MY READ METHOD: (needs to return (n int, err error))
func (passedR rot13Reader) Read(p []byte) (int, error){
//FIRST GETTING VARIABLES FROM rot13Reader that was passed in.
n, err := passedR.r.Read(p)
//THEN LOOP length of p and get / change each letter (without the loop below the program works but stays the same!
for i := 0; i < len(p); i++ {
//DEPENDING ON INPUT, ADD OR SUBTRACT 13 ACCORDINGLY:
switch {
case(p[i]>='A' && p[i]<='M'):
p[i] += 13
case(p[i]>='N' && p[i]<='Z'):
p[i] -= 13
case(p[i]>='a' && p[i]<='m'):
p[i] += 13
case(p[i]>='n' && p[i]<='z'):
p[i] -= 13
default:
p[i]=p[i]
}
}
//FINALLY RETURN n and error
return n, err
}
func main() {
//MAKE A NEW STRING
s := strings.NewReader("Lbh penpxrq gur pbqr!")
//MAKE A NEW rot13Reader with string above
r := rot13Reader{s}
//now copy it?
io.Copy(os.Stdout, &r)
}
OUTPUT:
You cracked the code!
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func rot13(b byte) byte {
var a, z byte
switch {
case 'a' <= b && b <= 'z':
a, z = 'a', 'z'
case 'A' <= b && b <= 'Z':
a, z = 'A', 'Z'
default:
return b
}
return (b-a+13)%(z-a+1) + a
}
func (reader rot13Reader) Read(b []byte) (int, error) {
n, err := reader.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)
}
Easier for understanding
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (r rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
for i := 0; i < n; i++ {
switch {
case b[i] >= byte('A') && b[i] < byte('N'):
b[i] += 13
case b[i] >= byte('a') && b[i] < byte('n'):
b[i] += 13
case b[i] >= byte('N') && b[i] <= byte('Z'):
b[i] -= 13
case b[i] >= byte('n') && b[i] <= byte('z'):
b[i] -= 13
}
}
return n, err
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(p []byte) (n int, err error) {
n, err = rot.r.Read(p)
if err != nil {
return n, err
}
for i := range p {
switch {
case p[i] >= 'A' && p[i] <= 'M':
p[i] += 13
case p[i] >= 'N' && p[i] <= 'Z':
p[i] -= 13
case p[i] >= 'a' && p[i] <= 'm':
p[i] += 13
case p[i] >= 'n' && p[i] <= 'z':
p[i] -= 13
}
}
return
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
package main
import (
"io"
"os"
"strings"
)
const input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
const output = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
type rot13Reader struct {
r io.Reader
}
func (r *rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
if err != nil {
return n, err
}
for i := range b {
inputIndex := strings.Index(input, string(b[i]))
if inputIndex < 0 {
continue
}
b[i] = output[inputIndex]
}
return n, nil
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}
This takes case of the spaces and the exclamation mark in the given text.