Apex에서 준도 코키 요시 DFA를 만들었습니다.

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('!');
    } 

}

실행 결과



재귀 함수 버전





루프 버전



좋은 웹페이지 즐겨찾기