LoginSignup
2
1

More than 3 years have passed since last update.

【Java】正規表現でズンドコキヨシ

Last updated at Posted at 2020-02-04

流行ったよね、ズンドコ

完全に時期を逃しているのですが、流行ったときに書いて放置してたソースが出てきたので、投稿します。
Javaでは余りこのパターンは見かけなかった感ある。

元ネタはこれ。


ソース

ZunDokoKiyoshi.java
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("キ・ヨ・シ!");
    }
}

解説

  1. while文内で「ズン」か「ドコ」をランダムに出力
  2. while文内で出力した文字をStringBuilderで溜め込む
  3. while文の終了条件は「末尾が「ズン」連続4回の直後に「ドコ」」である(正規表現でチェック)
  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でつなげて正規表現で…って感じになるかな。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1