読者です 読者をやめる 読者になる 読者になる

パソコン甲子園3

Program

そういえばパソコン甲子園ってハード的要素何も無いのに何で「パソコン」甲子園なんだろう?素直にプログラム甲子園でいいよな。
まぁ、そんなどうでもいいことは置いといて、今日も2006年のパソコン甲子園の本選の問題(PDF)を解いてみる。今日は7問目。

問題の概略は、
「文字だけで出来たヘビがどちらのパターンか判断するプログラムを作れ」
で、ヘビのパターンは、

A
「>'」の後に「=」が1個以上並んだ後、「#」をはさんで前と同じ数の「=」の後に「~」で終了
B
「>^」の後に「Q=」が1個以上並んだ後、「~~」で終了

の2パターン、これ以外ならNAと表示する。

・・・もろ正規表現で解けますね。正規表現に直接落とせるレベルで解説されてるから、かなり簡単な問題。

パターン 正規表現
A ^>'(=+)#\1~$
B ^>\^(Q=)+~~$

あとはこれをプログラムに組み込むだけ、と。

import java.io.*;
import java.util.regex.*;

public class Q07 {
    private static final Pattern patternA  = Pattern.compile("^>'(=+)#\\1~$");
    private static final Pattern patternB  = Pattern.compile("^>\\^(Q=)+~~$");
    
    public static enum SnakeType {
        A, B, NA;
        public static SnakeType which(String snake) {
            if (patternA.matcher(snake).matches()) return A;
            if (patternB.matcher(snake).matches()) return B;
            return NA;
        }
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = null;
        try {
            in = new BufferedReader(
                new InputStreamReader(System.in));
            
            int num = Integer.parseInt(in.readLine());
            SnakeType[] results = new SnakeType[num];
            for (int i = 0; i < num; i++) {
                String snake = in.readLine();
                results[i] = SnakeType.which(snake);
            }
            for (SnakeType result : results)
                System.out.println(result);
        } finally {
            if (in != null) in.close();
        }
    }
}

はてさて、この解法は出題者の意図したものなのだろうか?パソコン甲子園に使える言語はC/C++JavaVB.NETで、もちろん標準以外のライブラリは使用できないはずなので、この問題はJavaVB.NETを使うとマジで有利*1。本戦でこれはひどいんじゃないかなぁ、と思うんだけど・・・

*1:この問題はかなり顕著な例だけど、他の問題にしたって標準ライブラリの豊富なJavaVB.NETは有利に思える。