# artemkorsakov's solution

## to Proverb in the Go Track

Published at Feb 21 2019 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

For want of a horseshoe nail, a kingdom was lost, or so the saying goes.

Given a list of inputs, generate the relevant proverb. For example, given the list `["nail", "shoe", "horse", "rider", "message", "battle", "kingdom"]`, you will output the full text of this proverbial rhyme:

``````For want of a nail the shoe was lost.
For want of a shoe the horse was lost.
For want of a horse the rider was lost.
For want of a rider the message was lost.
For want of a message the battle was lost.
For want of a battle the kingdom was lost.
And all for the want of a nail.
``````

Note that the list of inputs may vary; your solution should be able to handle lists of arbitrary length and content. No line of the output text should be a static, unchanging string; all should vary according to the input given.

## Running the tests

To run the tests run the command `go test` from within the exercise directory.

If the test suite contains benchmarks, you can run these with the `--bench` and `--benchmem` flags:

``````go test -v --bench . --benchmem
``````

Keep in mind that each reviewer will run benchmarks on a different machine, with different specs, so the results from these benchmark tests may vary.

## Further information

For more detailed information about the Go track, including how to get help if you're having trouble, please visit the exercism.io Go language page.

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### cases_test.go

``````package proverb

// Source: exercism/problem-specifications
// Commit: e86e97a proverb: apply "input" policy
// Problem Specifications Version: 1.1.0

type proverbTest struct {
description string
input       []string
expected    []string
}

var stringTestCases = []proverbTest{
{
description: "zero pieces",
input:       []string{},
expected:    []string{},
},
{
description: "one piece",
input:       []string{"nail"},
expected:    []string{"And all for the want of a nail."},
},
{
description: "two pieces",
input:       []string{"nail", "shoe"},
expected:    []string{"For want of a nail the shoe was lost.", "And all for the want of a nail."},
},
{
description: "three pieces",
input:       []string{"nail", "shoe", "horse"},
expected:    []string{"For want of a nail the shoe was lost.", "For want of a shoe the horse was lost.", "And all for the want of a nail."},
},
{
description: "full proverb",
input:       []string{"nail", "shoe", "horse", "rider", "message", "battle", "kingdom"},
expected:    []string{"For want of a nail the shoe was lost.", "For want of a shoe the horse was lost.", "For want of a horse the rider was lost.", "For want of a rider the message was lost.", "For want of a message the battle was lost.", "For want of a battle the kingdom was lost.", "And all for the want of a nail."},
},
{
description: "four pieces modernized",
input:       []string{"pin", "gun", "soldier", "battle"},
expected:    []string{"For want of a pin the gun was lost.", "For want of a gun the soldier was lost.", "For want of a soldier the battle was lost.", "And all for the want of a pin."},
},
}``````

### proverb_test.go

``````package proverb

import (
"fmt"
"testing"
)

func TestProverb(t *testing.T) {
for _, test := range stringTestCases {
actual := Proverb(test.input)
if fmt.Sprintf("%q", actual) != fmt.Sprintf("%q", test.expected) {
t.Fatalf("Proverb test [%s], expected [%s], actual [%s]", test.input, test.expected, actual)
}
}
}

func BenchmarkProverb(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, test := range stringTestCases {
Proverb(test.input)
}
}
}``````
``````package proverb

import "fmt"

// Proverb generates the relevant proverb.
func Proverb(rhyme []string) []string {
result := make([]string, len(rhyme))
for i := 0; i < len(rhyme)-1; i++ {
result[i] = GetNotLastRow(rhyme[i], rhyme[i+1])
}
if len(rhyme) > 0 {
result[len(result)-1] = GetLastRow(rhyme[0])
}
return result
}

// GetNotLastRow returns not last row of the proverb.
func GetNotLastRow(first string, second string) string {
return fmt.Sprintf("For want of a %s the %s was lost.", first, second)
}

// GetLastRow returns last row of the proverb.
func GetLastRow(str string) string {
return fmt.Sprintf("And all for the want of a %s.", str)
}``````