流行ったよね、ズンドコ
完全に時期を逃しているのですが、流行ったときに書いて放置してたソースが出てきたので、投稿します。
Javaでは余りこのパターンは見かけなかった感ある。
元ネタはこれ。
Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) March 9, 2016
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
ソース
import java.util.Random;
public class ZunDokoKiyoshi {
public static void main (String args[]) {
Random random = new Random(0);
StringBuilder sb = new StringBuilder("");
while (!sb.toString().matches("^.*(ズン){4}ドコ$")) {
String current = new String[]{"ズン", "ドコ"}[random.nextInt(2)];
System.out.println(current);
sb.append(current);
}
System.out.println("キ・ヨ・シ!");
}
}
解説
- while文内で「ズン」か「ドコ」をランダムに出力
- while文内で出力した文字をStringBuilderで溜め込む
- while文の終了条件は「末尾が「ズン」連続4回の直後に「ドコ」」である(正規表現でチェック)
- while文抜けてから「キ・ヨ・シ!」を出力して〆
真っ先に思い付いたのがコレ、だった記憶。
ビット演算とかstreamとか難しいことはわがんねから、素直に自分の得意なのでやった。
StringBuilder使うなら逐次System.out.println
しなくてもいい気はする。
でもそうするとあとから改行入れるの面倒になるから逐次にした。
改行入れなくていいんならStringBuilderに全文溜め込むほうがきれいかもだ。
追記
別に溜め込む方式も面倒くさくなかったわ。
改行をStringBuilderに溜め込むときに追加するパターンの場合、改行を含む正規表現になっちゃう。
その場合は、while文の終了判定時にsb.toString().replaceAll("\n", "")
にするほうがいいと思う。
public static void main (String args[]) {
Random random = new Random(0);
StringBuilder sb = new StringBuilder("");
while (!sb.toString().matches("^.*(ズン){4}ドコ$")) {
sb.append(new String[]{"ズン", "ドコ"}[random.nextInt(2)]);
}
System.out.println(sb.toString().replaceAll("(.{2})", "$1\n") + "キ・ヨ・シ!");
}
今更気付いたんだけど、「ズン」「ドコ」5つの組み合わせの配列単位で出力すべきだった…?
まあそれにしても出力方法の違いなのでロジックの根本は変わらんけど。
2重ループにしてwhileの内側に5回配列作る分のループ突っ込んで、while文の終了判定がその配列をStringUtilsだったかArrayUtilsのjoinでつなげて正規表現で…って感じになるかな。