# artemkorsakov's solution

## to Proverb in the Java Track

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

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

You can run all the tests for an exercise by entering

``````\$ gradle test
``````

## Submitting Incomplete Solutions

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

### ProverbTest.java

``````import org.junit.Ignore;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

public class ProverbTest {

@Test
public void zeroWordsAreGiven() {
String[] words  = new String[0];
String proverb  = new Proverb(words).recite(),
expected = "";

assertThat(proverb, is(expected));
}

@Ignore("Remove to run test")
@Test
public void singlePieceOfProverb() {
String[] words  = new String[]{"nail"};
String proverb  = new Proverb(words).recite(),
expected = "And all for the want of a nail.";

assertThat(proverb, is(expected));
}

@Ignore("Remove to run test")
@Test
public void twoPiecesOfProverb() {
String[] words  = new String[]{"nail", "shoe"};
String proverb  = new Proverb(words).recite(),
expected = "For want of a nail the shoe was lost.\n" +
"And all for the want of a nail.";

assertThat(proverb, is(expected));
}

@Ignore("Remove to run test")
@Test
public void shortChainOfConsequences() {
String[] words  = new String[]{"nail", "shoe", "horse"};
String proverb  = new Proverb(words).recite(),
expected = "For want of a nail the shoe was lost.\n" +
"For want of a shoe the horse was lost.\n" +
"And all for the want of a nail.";

assertThat(proverb, is(expected));
}

@Ignore("Remove to run test")
@Test
public void fullProverb() {
String[] words  = new String[]{"nail", "shoe", "horse", "rider", "message", "battle", "kingdom"};
String proverb  = new Proverb(words).recite(),
expected = "For want of a nail the shoe was lost.\n" +
"For want of a shoe the horse was lost.\n" +
"For want of a horse the rider was lost.\n" +
"For want of a rider the message was lost.\n" +
"For want of a message the battle was lost.\n" +
"For want of a battle the kingdom was lost.\n" +
"And all for the want of a nail.";

assertThat(proverb, is(expected));
}

@Ignore("Remove to run test")
@Test
public void fourPiecesModernizedProverb() {
String[] words  = new String[]{"pin", "gun", "soldier", "battle"};
String proverb  = new Proverb(words).recite(),
expected = "For want of a pin the gun was lost.\n" +
"For want of a gun the soldier was lost.\n" +
"For want of a soldier the battle was lost.\n" +
"And all for the want of a pin.";

assertThat(proverb, is(expected));
}

}``````
``````class Proverb {
private String[] words;

Proverb(String[] words) {
this.words = words;
}

String recite() {
if (words.length == 0) {
return "";
}

StringBuilder result = new StringBuilder();
for (int i = 0; i < words.length - 1; i++) {
result.append(String.format("For want of a %1\$s the %2\$s was lost.\n", words[i], words[i + 1]));
}
result.append(String.format("And all for the want of a %s.", words[0]));
return result.toString();
}

}``````