【Java】任意文字列でラブ注入

# はじめに

https://twitter.com/Sheeeeepla/status/1554028833942441984

本記事ではTwitterで見かけた上記の問題を解くプログラムをご紹介します。

ただし、普通にJavaで解く方法については既に先駆者様がいらっしゃる（[こちらの記事](https://qiita.com/na0y/items/1f5ed3ce215297d70d3a)）ので、今回は任意の文字列を受け取るメソッドを実装し、上記の問題を解いてみました。

# 実装の方針
上記の問題を以下のように変換します。

> 文字列の配列 `wordList` からランダムに要素を標準出力し続け、『その並びが文字列 `text` を `n` 回繰り返したもの』に一致したときに「`lastWord`」と標準出力して終了するプログラムを作成せよ

すなわち、「ドドスコスコスコ」のような具体的な文字列ではなく、任意の文字列を受け取って動作するメソッドを実装し、そこに「ドドスコスコスコ」などのパラメータを渡すことで問題文の動作を実現します。

なお、以下のような入力は考慮しないものとします（コードが冗長になるので）。

* 0または負の繰り返し回数
* `null`、空文字、空の配列またはコレクション
* 上記を要素にもつ配列またはコレクション

# 結論
以下のような `MultipleWordPrinter` クラスを実装しました。
メインとなるのは `run` メソッドで、こちらに `wordList` や `text` などの条件を渡すことでドドスコスコスコしてくれます。

## 追記
コメントでのご指摘を受けて、コードを大幅に修正しました。ありがとうございます。
主な変更点は以下の通りです。
* 目標文字列と出力文字列のデータ型を `List<String>` から `String` に変更
* リスト操作メソッドの削除

```java:
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class MultipleWordPrinter {

	// wordListの要素をランダムに出力し、textをtimes回繰り返した文字列が出力されたらlastWordを出力して終了する
	public static void run(List<String> wordList, String text, int times, String lastWord) {
		String purposeStr = IntStream.range(0, times).mapToObj(i->text).collect(Collectors.joining());
		String printStr = "";
		var rand = new Random();

		// 初期化
		while(printStr.length() < purposeStr.length()) {
			String word = wordList.get(rand.nextInt(wordList.size()));
			printStr += word;

			System.out.print(word);
		}

		//はみ出た分を切り取る
		if(printStr.length() > purposeStr.length()) {
			printStr = printStr.substring(printStr.length() - purposeStr.length());
		}

		// purposeStrと一致する文字列が出力されるまで実行
		while(!printStr.equals(purposeStr)) {
			String word = wordList.get(rand.nextInt(wordList.size()));
			printStr += word;
			printStr = printStr.substring(word.length()); //はみ出た分を切り取る

			System.out.print(word);
		}

		// 締めの言葉
		System.out.println(lastWord);
	}

}
```

```java:実行結果
スコドドスコスコスコドドドドドドドドドドドドスコスコドドドドドドドドドドドドスコドドスコドドスコスコドドドドスコスコドドスコドドドドドドドドドドドドスコドドドドドドスコスコスコスコドドドドドドドドドドドドスコスコスコスコドドドドスコスコドドスコドドスコスコドドスコスコドドドドスコドドスコスコドドドドドドドドドドドドドドドドドドドドドドスコスコドドスコスコドドスコスコドドドドドドドドドドスコスコスコドドドドドドドドドドスコドドスコスコドドスコスコドドスコドドドドスコスコドドドドドドドドスコスコドドドドスコスコドドスコドドスコスコドドスコドドドドドドスコスコドドスコドドスコドドスコドドスコドドスコスコスコスコスコドドドドスコスコドドドドスコスコドドスコスコドドドドスコドドドドスコスコスコドドドドスコスコスコドドスコスコスコスコドドドドドドスコスコスコスコドドドドドドスコドドドドスコスコスコドドドドスコドドスコドドドドスコスコスコドドスコスコドドドドスコドドドドスコドドスコドドスコスコドドスコスコスコスコドドドドスコスコスコドドスコドドスコドドドドスコドドドドスコスコスコスコスコスコドドドドスコドドドドスコスコスコスコドドスコドドスコスコスコスコスコドドスコドドスコスコドドドドドドドドドドドドドドドドスコドドドドドドドドドドスコドドスコドドドドスコドドスコドドドドスコスコスコドドスコスコスコスコドドスコドドドドドドスコスコドドスコドドドドドドスコスコスコドドスコドドスコスコスコスコドドスコドドドドスコスコドドドドドドスコスコスコドドドドスコドドドドスコドドスコスコスコスコドドドドスコドドスコドドスコスコスコスコスコドドドドドドスコドドドドドドドドスコスコスコスコドドドドスコスコドドスコスコドドスコドドスコドドドドドドドドスコスコスコドドスコドドスコドドスコスコドドスコスコスコスコドドスコドドドドドドスコドドドドドドドドスコドドスコスコドドドドスコスコスコドドドドスコドドスコスコスコスコスコドドスコドドドドスコスコドドスコスコドドスコスコスコドドスコドドスコスコドドスコドドスコスコスコドドドドスコスコドドスコドドスコスコドドスコスコドドスコドドドドスコスコドドドドドドスコドドスコドドスコドドドドドドスコスコドドスコドドドドドドスコスコドドスコスコスコスコドドドドスコスコスコドドドドドドスコドドスコドドスコドドスコドドスコスコスコドドドドドドスコスコスコスコスコスコドドドドドドスコドドスコスコスコドドドドスコスコスコドドスコスコスコスコスコスコドドドドドドスコドドスコスコドドドドドドスコドドドドスコドドドドスコドドドドスコスコスコドドドドスコスコスコスコスコドドドドドドスコドドドドドドスコドドスコスコドドドドドドスコスコドドスコスコスコドドドドドドスコドドスコスコスコドドドドドドスコドドドドスコスコドドスコスコドドスコドドドドスコスコスコドドスコスコスコドドドドドドスコスコドドドドドドスコドドスコドドスコスコスコスコドドドドドドスコドドスコスコドドスコドドスコスコスコドドドドスコスコドドドドスコドドドドスコドドスコドドスコスコドドスコスコスコドドスコドドスコドドドドスコドドドドドドスコスコドドドドドドスコスコスコドドドドドドスコドドドドドドスコドドスコドドスコドドスコドドドドドドドドスコドドスコドドスコドドスコドドドドスコドドスコドドドドスコドドスコスコスコドドスコスコスコスコスコドドスコスコドドドドスコスコドドスコスコドドスコドドスコスコドドドドドドドドスコスコドドスコスコスコスコスコドドスコドドドドドドドドスコドドスコスコドドスコドドスコスコドドドドドドドドスコドドスコスコドドスコスコドドスコドドドドスコドドドドドドスコスコドドドドドドスコドドドドドドドドドドスコドドドドドドスコドドスコスコドドドドスコドドドドスコスコスコスコスコドドスコスコドドドドスコドドドドスコドドスコスコドドドドスコドドドドドドドドスコドドスコドドスコドドスコドドスコスコスコドドスコスコスコスコスコスコドドドドスコスコスコドドスコスコドドスコドドドドドドスコドドスコスコスコドドドドスコドドスコドドスコスコスコドドスコスコスコスコスコドドスコスコドドスコスコスコスコスコスコスコドドドドスコドドドドスコスコスコスコスコスコドドスコスコスコドドドドドドスコスコドドドドドドスコドドスコドドスコドドスコドドドドスコドドドドドドスコドドスコスコスコドドドドスコドドスコドドドドドドドドドドドドスコドドスコドドドドドドドドスコスコスコスコスコドドスコスコドドスコドドスコドドスコドドスコスコスコスコスコスコスコスコスコスコドドスコドドドドドドスコドドスコスコドドドドスコスコドドスコドドスコドドドドドドスコドドドドスコドドドドスコドドドドスコスコドドドドドドドドスコスコスコスコドドドドスコスコスコスコドドドドドドドドドドドドドドドドスコスコドドドドスコスコドドスコドドスコスコドドスコドドドドスコドドドドドドドドドドスコスコスコスコスコスコドドスコスコドドスコスコスコドドスコドドスコスコドドスコドドドドスコスコドドスコスコスコスコドドドドドドドドドドスコスコドドスコスコスコドドスコスコスコスコドドドドスコドドドドドドドドスコスコドドドドスコスコドドドドスコドドスコドドドドスコスコドドドドドドドドドドスコドドドドドドドドスコスコドドスコスコスコスコドドドドドドスコスコスコドドドドドドドドスコスコドドドドドドスコスコスコドドドドスコスコドドスコドドドドドドスコスコドドドドスコドドドドドドドドスコスコスコドドドドドドスコスコスコドドドドドドスコドドスコスコスコスコスコドドドドドドドドスコドドドドドドスコスコドドドドスコスコドドドドスコスコスコドドドドドドスコドドスコスコスコドドスコドドスコスコスコスコスコドドドドスコドドドドスコスコドドドドスコドドドドスコスコスコドドスコスコドドドドドドスコドドスコドドドドスコスコドドドドスコスコドドスコドドスコスコスコスコドドドドスコスコドドスコスコスコスコスコドドスコドドスコスコドドスコドドスコドドドドドドスコスコスコスコスコドドドドスコドドドドスコドドドドドドドドスコスコドドスコスコドドドドドドドドスコドドドドスコドドドドドドスコドドドドドドドドスコドドドドスコスコスコスコスコドドスコスコドドスコドドドドスコドドスコドドドドスコドドスコドドスコスコスコスコスコスコスコスコドドドドドドスコスコドドスコスコスコドドスコドドスコドドドドドドドドドドドドスコドドドドドドドドスコドドドドスコドドドドスコスコスコドドスコスコドドドドドドドドスコスコドドスコドドドドスコスコドドスコスコドドスコスコドドドドスコドドスコスコドドドドスコスコドドスコドドドドスコドドスコドドスコドドドドドドドドスコドドスコドドドドドドスコスコドドドドドドスコドドスコドドドドスコスコスコスコスコドドドドスコスコスコドドドドドドドドドドスコスコスコドドスコドドスコスコドドドドスコスコスコドドドドドドドドスコスコスコスコドドドドドドドドスコスコドドスコスコスコスコドドドドスコドドドドスコドドドドスコドドドドドドスコドドスコドドドドスコドドドドスコスコスコスコドドドドドドドドスコドドスコスコドドドドドドドドドドスコドドドドドドスコスコドドドドドドドドスコドドスコドドドドドドスコスコドドドドスコドドドドスコスコドドスコスコドドドドドドスコスコドドドドドドドドドドスコスコドドドドドドドドスコスコドドドドスコドドドドスコスコスコドドドドドドスコスコドドスコドドドドドドドドドドドドスコドドスコスコスコドドドドスコスコスコドドスコドドドドスコドドドドスコスコスコドドスコドドスコスコスコスコドドスコドドスコドドドドドドスコドドドドドドドドドドスコスコスコドドスコドドドドスコドドドドスコドドスコスコスコドドドドスコスコスコスコドドドドドドスコスコスコドドスコドドスコスコスコスコスコドドスコドドドドドドスコドドスコドドスコドドドドドドスコスコドドドドスコドドスコドドスコスコドドスコドドドドドドドドスコドドドドスコスコドドスコドドスコドドドドドドドドスコスコスコスコドドドドスコスコスコスコドドスコスコドドスコスコスコスコドドスコドドドドスコドドスコドドドドスコスコドドドドドドドドドドドドドドドドスコドドスコドドドドスコドドスコドドスコドドスコスコドドドドスコスコドドドドスコスコドドスコドドスコスコスコスコドドドドドドドドドドドドスコスコドドスコスコスコスコスコドドドドスコスコスコスコドドドドスコドドスコドドドドドドスコスコドドドドスコスコスコスコドドスコスコドドスコドドスコドドドドドドドドドドドドスコドドスコスコドドドドドドドドドドスコドドスコドドドドスコスコドドドドスコドドドドドドスコドドドドドドスコドドスコスコドドドドスコドドドドドドドドスコドドドドドドスコスコスコスコスコドドスコスコドドドドスコドドドドドドドドドドドドスコスコドドドドスコドドドドスコドドスコスコドドドドスコドドドドスコドドスコドドスコドドドドドドドドスコドドスコドドスコドドスコドドドドドドドドドドスコドドスコドドスコスコドドドドドドドドドドドドスコスコスコスコドドドドドドドドスコドドドドスコドドスコドドドドドドドドドドドドスコドドスコスコスコスコスコドドドドスコスコドドスコスコスコスコスコドドドドドドドドドドドドドドスコスコドドドドスコスコスコドドドドドドスコドドスコスコスコドドスコドドドドドドスコドドドドドドドドスコスコドドドドスコドドドドスコドドスコスコドドドドスコスコドドスコドドスコスコドドドドスコスコドドドドドドドドスコスコスコドドドドスコスコドドスコスコスコスコスコスコドドドドドドスコスコスコドドドドスコスコスコドドスコスコスコスコスコドドドドドドドドスコドドドドドドスコドドスコドドスコドドスコドドスコスコドドスコドドドドスコドドスコスコスコスコドドドドドドスコドドドドドドドドスコスコスコスコドドドドスコドドドドドドドドドドスコスコスコスコドドスコドドドドドドスコスコスコドドドドドドドドスコスコスコドドスコスコスコスコドドスコドドスコスコドドドドドドドドスコスコスコスコドドドドスコドドドドスコドドスコスコスコスコスコスコスコドドスコスコスコドドドドドドドドドドスコスコドドスコスコスコスコドドスコスコスコドドドドドドドドスコスコドドドドドドスコスコスコドドスコスコスコドドスコドドドドドドドドドドドドドドドドドドスコドドドドスコドドスコスコスコスコスコドドドドドドドドスコドドスコスコドドスコドドスコドドドドドドスコドドスコドドスコドドスコドドドドスコドドスコドドドドスコドドスコドドドドスコスコスコドドスコドドスコスコドドドドスコドドドドスコドドドドドドドドスコドドドドスコスコスコスコスコスコドドドドスコスコドドスコスコドドスコスコドドドドスコスコスコドドスコスコドドスコドドドドドドドドドドスコスコスコドドスコドドドドドドスコドドスコドドスコドドスコドドスコスコドドドドドドスコドドスコドドドドドドスコスコスコドドドドスコスコドドスコスコドドスコスコスコドドスコドドドドドドドドドドスコスコドドドドドドスコスコスコスコドドドドドドドドドドスコスコドドドドドドスコスコドドドドドドドドスコドドドドスコスコドドスコドドスコスコドドドドスコドドスコドドドドドドドドスコドドドドスコスコスコドドスコドドドドスコスコドドドドスコスコドドスコドドスコドドドドドドドドドドスコスコドドスコスコドドドドドドスコスコスコドドスコドドドドドドドドドドスコスコドドスコドドドドドドドドドドドドスコドドスコドドドドドドドドドドスコスコドドスコドドドドスコドドスコスコスコスコスコドドスコドドスコスコスコドドドドスコドドドドドドドドスコドドスコドドドドスコドドドドドドスコスコスコドドドドスコスコドドドドスコドドドドスコスコドドドドドドドドスコスコドドスコドドドドドドスコスコスコドドスコスコドドスコスコドドスコスコドドドドスコスコスコスコスコスコドドスコスコスコドドスコスコドドドドドドドドスコドドドドドドスコスコスコスコスコスコドドドドスコスコスコスコスコスコドドスコスコドドドドドドスコスコドドドドドドスコスコスコスコスコスコドドドドドドドドスコドドドドスコドドスコスコドドスコドドスコスコドドスコスコスコスコスコスコスコスコドドスコスコスコドドドドドドドドドドスコドドドドスコドドスコスコスコスコドドスコスコスコドドドドスコドドドドドドスコスコドドドドスコドドドドスコスコドドスコドドドドスコスコスコスコスコドドスコスコスコドドドドスコドドドドスコスコスコドドスコドドドドスコスコスコスコドドドドドドドドスコドドドドスコドドドドドドスコドドスコスコスコドドドドドドスコスコスコスコスコドドドドドドスコスコスコスコドドドドスコドドスコスコスコスコスコドドスコドドスコドドドドスコドドスコスコスコドドスコドドスコスコスコドドスコスコスコスコドドスコドドドドドドスコスコドドスコドドスコスコスコスコドドスコドドスコドドドドドドスコドドドドドドスコスコスコドドドドドドドドスコスコスコスコスコドドドドドドドドドドドドドドスコスコスコスコスコスコドドスコスコスコスコスコドドスコドドドドドドスコドドドドスコスコスコスコドドドドスコドドスコスコドドスコスコスコスコドドドドドドスコドドドドドドドドドドスコドドスコドドドドスコスコドドドドドドスコドドスコスコスコスコスコスコドドドドドドスコスコドドドドスコドドドドドドスコドドスコドドスコスコスコスコスコドドドドスコスコスコドドドドスコドドドドドドドドドドドドスコドドスコスコドドドドスコドドスコスコスコスコスコスコドドドドドドスコスコスコドドドドスコスコドドドドドドドドドドスコドドドドスコドドドドスコスコスコドドスコドドドドドドスコドドスコドドスコスコスコドドドドスコスコドドドドスコスコドドスコスコスコスコドドスコドドスコスコドドスコスコドドドドドドスコスコスコドドスコスコドドスコスコスコスコドドドドドドドドスコドドドドドドドドスコスコドドドドスコドドスコスコドドスコスコドドドドドドドドスコドドドドスコドドドドスコドドスコドドドドスコドドスコドドドドドドドドドドスコスコドドドドスコスコスコスコドドスコスコスコドドスコスコスコドドスコスコドドスコスコドドスコスコスコドドスコドドスコスコドドスコスコドドスコドドドドスコスコドドスコドドドドスコドドスコドドスコドドドドドドドドドドドドスコスコドドドドスコドドスコスコスコスコドドスコドドスコスコドドスコドドスコスコスコドドドドスコドドドドドドドドドドドドドドドドスコスコスコスコスコドドドドドドスコドドドドスコドドスコドドドドスコドドドドスコスコドドドドスコスコスコスコスコスコスコスコドドスコスコスコスコドドスコドドスコドドスコドドスコドドスコスコスコスコスコドドドドドドスコドドドドスコドドスコドドドドドドドドドドドドドドスコスコドドスコドドスコドドドドドドスコドドドドドドスコスコスコスコドドスコドドスコスコドドスコスコドドスコドドスコスコドドドドドドドドドドドドドドスコドドドドスコドドスコドドドドスコスコスコドドドドスコスコドドスコスコドドスコスコドドスコドドスコスコスコドドスコドドドドスコドドドドスコスコドドドドスコスコスコドドスコドドドドドドスコスコスコスコスコスコスコドドドドドドドドドドドドスコドドドドスコドドドドスコスコドドドドスコスコドドスコドドドドドドスコスコスコドドドドスコスコスコスコスコスコスコドドスコドドドドドドスコスコスコドドスコドドスコドドドドドドドドドドスコドドドドスコスコドドドドドドドドドドスコスコドドドドスコスコスコドドドドドドドドスコドドスコドドスコスコドドスコスコスコスコスコドドスコドドドドスコドドスコスコスコスコドドスコドドドドスコスコスコドドドドスコドドドドスコドドスコドドドドスコスコスコドドスコスコドドドドドドスコドドドドスコスコドドドドドドドドスコドドドドスコスコドドドドドドドドスコドドスコスコスコスコスコドドドドスコドドスコスコスコドドドドドドドドスコスコスコドドスコスコスコドドスコドドスコドドスコドドドドドドスコスコスコドドスコドドドドドドスコスコスコドドスコスコスコスコドドスコスコドドスコドドドドスコドドスコスコドドドドスコドドスコドドスコドドドドドドスコスコスコスコドドドドドドドドドドスコスコドドスコスコドドドドスコスコドドドドスコドドスコドドドドドドドドドドスコドドドドスコスコスコスコドドドドドドスコスコスコドドスコスコスコドドスコドドドドドドドドスコドドスコスコドドスコスコスコスコドドスコドドスコスコドドドドドドドドドドスコスコスコドドドドスコスコドドスコドドドドスコドドドドスコドドスコスコスコスコスコドドスコドドスコスコスコスコドドスコスコドドスコスコドドスコスコスコスコドドドドスコスコドドドドスコドドドドスコスコスコスコドドスコスコスコドドスコドドドドスコドドスコスコドドドドスコドドドドスコスコドドドドドドドドドドドドドドスコドドスコドドドドドドスコスコスコスコスコスコスコスコドドドドスコスコドドスコドドドドスコドドドドスコドドドドドドスコスコドドスコスコドドスコドドスコドドドドスコドドスコドドドドスコスコドドドドドドスコドドスコドドドドスコドドスコスコスコスコスコスコスコドドドドスコドドドドスコスコスコドドスコスコドドドドドドドドドドドドスコスコスコドドドドスコスコドドスコスコドドスコドドスコスコスコドドスコスコスコスコドドスコドドドドスコスコドドドドスコスコスコドドドドスコドドスコスコスコスコスコドドスコドドスコスコスコドドスコスコドドドドドドドドスコドドスコドドドドスコスコドドスコスコドドスコスコドドドドスコドドスコスコドドドドドドドドドドドドドドドドドドドドドドスコスコスコスコドドドドスコスコドドスコドドスコスコドドドドドドスコスコスコスコスコドドスコドドドドスコスコスコスコスコドドスコドドスコスコスコスコスコドドスコドドスコスコドドドドドドドドドドドドスコスコドドスコスコドドスコドドスコドドドドスコスコドドドドドドスコスコドドスコスコドドドドスコスコスコスコドドスコドドスコスコスコドドドドスコスコスコドドスコスコスコドドドドドドドドスコスコスコスコスコスコドドスコスコドドスコドドドドスコスコドドスコドドスコスコスコドドドドドドスコスコスコスコドドドドスコスコスコスコドドドドスコドドドドスコスコドドスコドドドドスコドドスコドドスコスコスコスコスコスコスコスコドドスコスコスコドドドドスコドドドドスコドドドドドドスコスコドドドドドドドドドドドドスコドドドドドドスコスコスコスコドドドドドドドドスコドドスコドドドドスコドドスコドドスコドドドドスコドドドドドドドドドドドドドドドドドドドドドドスコスコスコドドドドスコスコスコスコドドスコスコスコスコスコスコスコスコドドドドドドスコドドドドドドスコスコドドドドスコドドドドドドドドスコドドドドスコスコスコドドドドドドドドドドスコスコドドドドスコスコスコドドドドスコドドスコドドドドスコドドスコドドドドスコドドドドスコドドドドスコドドドドドドドドスコスコドドドドドドドドドドスコスコドドドドスコドドドドスコスコドドドドドドドドスコドドドドスコスコドドスコドドスコドドスコドドスコスコドドスコスコドドドドドドドドドドドドスコスコドドドドドドドドドドスコドドドドスコスコスコスコドドドドスコドドドドスコスコドドドドスコドドドドドドスコスコスコスコドドドドスコドドドドスコスコドドスコドドドドドドドドスコスコドドドドドドドドスコスコスコスコドドスコスコドドドドドドドドドドドドスコスコドドドドスコドドドドスコドドスコドドドドスコスコドドスコスコドドドドドドスコスコドドスコドドスコドドスコドドスコスコドドドドスコスコドドスコスコスコドドスコスコスコスコスコドドドドドドスコスコドドドドスコドドドドスコスコスコドドスコドドドドスコドドスコドドドドスコドドドドスコスコドドドドドドドドスコスコドドスコドドドドスコドドドドスコスコドドドドスコスコドドスコスコドドスコスコスコドドドドスコスコドドスコドドスコスコドドスコドドドドドドドドドドスコスコドドスコドドスコドドドドスコドドドドスコスコドドスコドドドドドドドドスコスコドドドドスコスコスコスコドドドドスコドドドドスコスコドドドドドドスコスコドドスコドドドドスコドドスコドドスコドドスコドドスコドドスコドドスコスコドドドドドドドドドドスコスコドドドドドドドドスコドドドドドドドドドドスコスコドドドドドドドドスコドドスコドドスコスコドドドドドドドドスコスコドドドドスコスコスコスコスコドドスコドドドドドドスコドドスコドドドドスコドドスコスコスコスコスコスコスコドドドドスコドドドドドドスコスコドドスコドドドドドドスコスコドドドドドドドドスコスコドドドドドドスコドドドドドドスコドドドドドドスコスコスコスコスコスコドドドドスコスコドドドドドドスコドドドドスコスコスコドドスコスコスコスコスコドドスコドドドドドドドドドドスコドドスコスコスコドドドドドドドドドドスコドドドドドドスコスコドドドドスコドドドドドドスコスコスコドドドドスコドドドドスコドドドドドドドドドドドドスコドドドドスコドドドドスコドドドドドドドドドドスコドドドドドドドドスコスコドドスコドドドドスコドドスコドドドドドドドドスコドドドドドドスコスコドドドドドドスコスコドドスコドドスコスコドドドドドドスコドドドドスコドドドドドドスコドドスコドドドドドドスコドドドドドドドドドドドドドドドドスコスコスコスコスコスコスコスコドドスコスコドドドドドドドドスコスコスコドドスコドドスコスコドドドドスコスコドドドドスコスコスコスコスコスコスコスコドドスコスコスコドドスコスコドドドドスコドドスコスコドドドドドドドドドドスコドドドドスコスコドドドドスコスコドドドドスコスコドドスコドドスコスコドドスコスコスコスコドドドドスコスコスコドドドドスコスコドドスコドドドドドドスコドドドドスコドドドドドドスコスコドドスコドドドドドドドドスコドドドドスコドドスコドドスコスコドドドドドドスコドドドドドドスコドドドドドドスコスコドドドドドドドドスコスコドドスコスコスコスコドドスコドドドドスコドドスコドドスコスコドドスコスコドドドドドドドドスコドドドドスコドドドドスコスコドドスコスコスコスコスコスコスコスコスコスコドドドドスコドドスコドドドドドドドドドドスコスコスコドドドドドドドドスコスコドドドドドドスコドドドドスコスコドドドドスコドドドドスコドドドドスコスコドドドドドドドドスコスコスコスコスコスコドドスコドドドドドドスコドドスコスコドドドドドドドドドドドドスコスコスコドドドドスコスコスコドドドドスコスコドドドドドドドドスコスコドドスコスコスコスコスコドドドドスコドドスコドドスコスコスコスコスコドドスコスコスコスコドドスコスコスコスコドドスコスコスコスコスコドドドドドドドドスコスコスコスコドドドドドドスコドドスコドドスコドドスコドドドドドドドドスコドドスコドドドドドドスコスコドドスコスコスコスコスコスコドドドドドドドドスコスコスコスコドドスコスコドドスコスコドドドドドドスコドドドドドドドドドドドドドドスコスコドドドドスコドドドドスコスコドドスコスコスコスコスコスコドドスコスコドドドドスコドドスコドドスコドドスコドドドドスコドドドドドドスコスコスコドドドドスコスコスコスコドドドドスコスコドドスコスコスコドドスコスコスコドドスコスコスコラブ注入♡
```

# 解説
`run` メソッドは以下の順番で処理を行います。

1. `text` を `times` 個並べて結合し、 `purposeStr` を生成する
1. `wordList` からランダムに出力した文字列を記憶する `printStr` を用意する
1. `printStr` の長さが `purposedStr` と同じになるまでランダムにワードを出力する（初期化）
1. ランダムに出力したワードを `printStr` の末尾に追加し、先頭の要素を削除する。これを `printStr` と `purposedStr` が一致するまで繰り返す
1. `lastWord` を出力して終了する

手順1. では `IntStream` を利用して `times` 個の `text` を作成し、それを `Collectors.joining()` で結合します。
`for` 文でも書けますが、3行くらい必要になるのでこちらの書き方にしました。

また、手順4. のアルゴリズムについては、冒頭で紹介した[先駆者様のコード](https://qiita.com/na0y/items/1f5ed3ce215297d70d3a)を参考にさせて頂きました。
「長さ固定ならリングバッファみたいに実装した方が良いのでは？」とか色々考えてみたのですが、標準出力が重すぎてほとんど誤差だったので、結局素直な実装に落ち着きました。

# 本実装のメリット
今回実装したメソッドはパラメータ（引数）で実行条件を受け取ります。
なので、以下のように問題文と異なった入力を与えても正常に動作します。

```java:実行例2
import java.util.List;

public class Test {

	public static void main(String[] args) {
		MultipleWordPrinter.run(List.of("オ", "レ", "ー", "オレ"), "オーレオレ", 1, "マツケンサンバ");

	}

}
```
```java:実行結果2
ーレオレオレオレオレレオオレオオレレレオレーオオレオーレオオオレーレレレオレオレーレオレオレオオレーレオレオレーレーオレオーーーーーオーオーーオレオレオレーーーオレオオレレレオレオオレオレオオレオオレオレーオオレーオレオレレオーーーオオレレオオレオレオレオレレオレーレオーオレーーーオーーーオオオーオオオオオーーオーオレオオーーオーオレーーレーオレーーーーオレオオーオーレオーオレオレオレオレーオオレオレレオレレレーーレオレオレオレオレオレオレーオレーオオオレーオレオオレーーオレオレレレレーーオレーオレレーオレーオレオレレーオオーオレオーーオレレーオレーレーレレーオレオレレオレーオオレオレオレーーーオレレオレオレオレレレレレオオレレオレーオレオレオレオオレオオオレオレオレオオレオオレオレオレレオレオレオーオレオレーオーオレレオレレーレオレオオオオレオレーーレオーオレレオレレレオレーーーオレレオレオレオレレーオオオレーレレレオレーーーオレレーレオオレーレレオーオレレオレオオオーーーレオーーレレーオーオレレオレレオレオレーーーーレレーオレーオオレオレレーオーレレオレオレオレオーーレーオレレオレレオレレレーーーオオレーオレレーーオレーーーオレーオーオレオーオレレオレーーーオレオレレーーオレオレーオオオオレレーオレオーーーーレーオレオレオレオレーオレオオレオレーオレーオオレオレオレーーオレーオオレーレオオレオレーーオレオオオーオーオレオレレオーオレオレーオオレオレオオオオレオレーレーオレーオレレーレオレオレオーーレレレオレーレーオーオオレレオレレオレオレオレオレーオレーオレオオレオオレオオレオレレオレオレーレオオレレオオレオオレオオレーレオレレオレオオオレレオレーーーオレオレオオオレーーオレオオオレレオレーーオオーオオレオレオレオレオオレレーレーオレレオオレオーオレオレオレレオレオオレレオレレオレレオオレーオオレオレーオレオレレオーオレーレオーーオレーオレオレレーオレーレレオオーレオレマツケンサンバ
```

問題そのものを解く上では余分な機能ですが、実際の開発等を想定するならばこのような実装もありなのかなと思います。

特定のパラメータに依存しない実装は、修正や機能追加に強いというメリットがあります。

少ないコードで様々なデータ・シチュエーションに対応できる ...... そんな一種のエレガントさを秘めているのが、抽象的なプログラミングの魅力です。

今回の実装はそこまで抽象的でもないですが、インターフェースとかジェネリクスとか、突き詰めると奥が深い（そして便利な）ので、気になった方はぜひぜひ調べてみてください。