LoginSignup
4
1

More than 5 years have passed since last update.

Apex でズンドコキヨシDFA作った

Last updated at Posted at 2016-03-21

Qiiteを眺めていたら、Apexでズンドコキヨシまとめに参加されている方がいらっしゃったので便乗します!

ズンドコ with Apex by @sho7650

言語解析的にDFAで

コンパイラを作っていた時の知識が役にたちました。
ズンドコのトークンによって状態遷移していくDFAを作成する事で、現在の状態の把握と次の状態の取得を簡略化しています。

ちなみに再帰関数バージョンは Tail Recursion になっているので、ループでの実行にした方が良いと思われ。キヨシより先にスタックオーバーフローが来るかも!

ZunDokoKiyoshi.apxc
public class ZunDokoKiyoshi {
    public Enum ZDState {Z, ZZ, ZZZ, ZZZZ, ZZZZD}
    public static Map<Set<Object>, ZDState> dfa = new Map<Set<Object>, ZDState>{ 
        new Set<Object>{null,         'ズン'} => ZDState.Z,
        new Set<Object>{ZDState.Z,    'ズン'} => ZDState.ZZ, 
        new Set<Object>{ZDState.ZZ,   'ズン'} => ZDState.ZZZ,
        new Set<Object>{ZDState.ZZZ,  'ズン'} => ZDState.ZZZZ, 
        new Set<Object>{ZDState.ZZZZ, 'ドコ'} => ZDState.ZZZZD
    };

    // 再帰関数バージョン         
    public static void zundokoRecursion(ZDState state){
        if(state == ZDState.ZZZZD){
            System.debug('!');
        } else {
            String token = Math.random() > 0.5 ? 'ズン' : 'ドコ';
            System.debug(token);
            zundokoRecursion(dfa.get(new Set<Object>{state, token}));
        }
    }             

    // ループバージョン
    public static void zundokoLoop(){
        for(ZDState state = null; state != ZDState.ZZZZD;){
            String token = Math.random() > 0.5 ? 'ズン' : 'ドコ';
            System.debug(token);
            state = dfa.get(new Set<Object>{state, token});
        }
        System.debug('!');
    } 

}

実行結果

再帰関数バージョン

スクリーンショット 2016-03-21 20.48.46.png

ループバージョン

スクリーンショット 2016-03-21 20.47.58.png

4
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
4
1