Sha256: 781c31bb74a8f2c20e7dd212211f3b56768c5bd7c4ac921393f62fcd78dfe707

Contents?: true

Size: 1.23 KB

Versions: 80

Compression:

Stored size: 1.23 KB

Contents

package railfence

import (
	"sort"
)

type pair struct {
	index, value int
	letter       byte
}

func pattern(rails, size int) []pair {
	var pairs []pair
	var v, direction = 0, 1
	for i := 0; i < size; i++ {
		pairs = append(pairs, pair{index: i, value: v})
		v += direction
		if v == 0 {
			direction = 1
		} else if v == rails-1 {
			direction = -1
		}
	}
	return pairs
}

func sortedPattern(rails, size int) []pair {
	fence := pattern(rails, size)
	sort.Slice(fence, func(i, j int) bool {
		f1, f2 := fence[i], fence[j]
		return f1.value < f2.value || (f1.value == f2.value && f1.index < f2.index)
	})
	return fence
}

// Encode encodes given message with given rails
func Encode(msg string, rails int) string {
	fence := sortedPattern(rails, len(msg))
	var encoded []byte
	for _, p := range fence {
		encoded = append(encoded, msg[p.index])
	}
	return string(encoded)
}

// Decode decodes given message with given rails
func Decode(msg string, rails int) string {
	fence := sortedPattern(rails, len(msg))
	for i := range msg {
		fence[i].letter = msg[i]
	}
	sort.Slice(fence, func(i, j int) bool { return fence[i].index < fence[j].index })
	var decoded []byte
	for _, p := range fence {
		decoded = append(decoded, p.letter)
	}
	return string(decoded)
}

Version data entries

80 entries across 80 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.179 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.178 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.177 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.176 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.175 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.174 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.173 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.172 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.171 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.170 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.169 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.167 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.166 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.165 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.164 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.163 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.162 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.161 tracks/go/exercises/rail-fence-cipher/example.go
trackler-2.2.1.160 tracks/go/exercises/rail-fence-cipher/example.go