Skip to content

Commit

Permalink
Merge pull request #522 from vaskoz/day253
Browse files Browse the repository at this point in the history
Day253
  • Loading branch information
vaskoz committed May 3, 2019
2 parents b4c3972 + d01e621 commit ea7ee8f
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,3 +263,4 @@ problems from
* [Day 249](https://github.com/vaskoz/dailycodingproblem-go/issues/514)
* [Day 251](https://github.com/vaskoz/dailycodingproblem-go/issues/517)
* [Day 252](https://github.com/vaskoz/dailycodingproblem-go/issues/519)
* [Day 253](https://github.com/vaskoz/dailycodingproblem-go/issues/521)
47 changes: 47 additions & 0 deletions day253/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package day253

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

var (
// nolint
out io.Writer = os.Stdout
)

// PrintZigZag prints k lines of a zig-zag pattern for
// the letters given.
func PrintZigZag(letters string, k int) {
lines := make([]strings.Builder, k)
pos := 0
goingUp := false
for _, r := range letters {
switch {
case pos == k:
goingUp = true
pos -= 2
case pos == -1:
goingUp = false
pos += 2
}
for i := range lines {
if i == pos {
lines[i].WriteRune(r)
} else {
lines[i].WriteRune(' ')
}
}
switch {
case goingUp:
pos--
case !goingUp:
pos++
}
}
for _, line := range lines {
fmt.Fprintln(out, line.String())
}
}
38 changes: 38 additions & 0 deletions day253/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package day253

import (
"bytes"
"testing"
)

// nolint
var testcases = []struct {
letters string
k int
expected string
}{
{"thisisazigzag", 4, "t a g\n h s z a \n i i i z \n s g \n"},
}

func TestPrintZigZag(t *testing.T) {
// don't run in parallel due to global var
for _, tc := range testcases {
buff := new(bytes.Buffer)
out = buff
PrintZigZag(tc.letters, tc.k)
if result := buff.String(); result != tc.expected {
t.Errorf("Expected \n%s, got \n%s", tc.expected, result)
}
}
}

func BenchmarkPrintZigZag(b *testing.B) {
// don't run in parallel due to global var
buff := new(bytes.Buffer)
out = buff
for i := 0; i < b.N; i++ {
for _, tc := range testcases {
PrintZigZag(tc.letters, tc.k)
}
}
}

0 comments on commit ea7ee8f

Please sign in to comment.