パソコン甲子園3
そういえばパソコン甲子園ってハード的要素何も無いのに何で「パソコン」甲子園なんだろう?素直にプログラム甲子園でいいよな。
まぁ、そんなどうでもいいことは置いといて、今日も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++、Java、VB.NETで、もちろん標準以外のライブラリは使用できないはずなので、この問題はJavaかVB.NETを使うとマジで有利*1。本戦でこれはひどいんじゃないかなぁ、と思うんだけど・・・