1126 Simply Syntax

1126 -- Simply Syntax
小文字のpからz、大文字のC,D,E,I,Nからなる言語が正規であるかどうかを判定する問題。
ルールは次の通り

  1. pからzまでの一文字
  2. sが正規であるとき、'N's
  3. s,tが正規であれば、'C'st,'D'st,'E'st,'I'stのいずれか

この時のみ、正規であると判定する。
各ケースは改行で区切られており、入力は最大256文字最小1文字。入力が正規であればYES,そうでなければNOを一行に出力する。
入力文字は使用できる文字だけで構成されている、と書かれているが、実際は違うようです(WA食らった)。
GCCで121byte。

char*t,s[999];
main(a){
  for(;t=gets(s);puts(a+*t?"NO":"YES"))
    for(a=1;a&&strchr("CDEINpqrstuvwxyz",*t);a-=*t++>78)
      a+=*t<78;
}

78='N'です。
上で書いたとおり、入力文字はなんでもありっぽいので、strchr()を使ってチェックしています。

(追記)id:Ozyさんに抜かれたので追いついてみた。116byte。
index(const char*,int)はローカルのCygwinMinGWでは動作したのだけど、Compile errorに。

(さらに追記)110byte。

char*t;
main(a,b){
  for(;t=gets(b);puts(a+*t?"NO":"YES"))
    for(a=1;a&&strchr("CDEINpqrstuvwxyz",*t);a-=*t++/25-3);
}