問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
四則演算と剰余算で構成される中置記法の数式 S が文字列で与えられます。S を演算子と値に分けて出力してください。
なお、式には以下の制約が設けられています。
ある整数 a, b について
・ a / b の計算結果は小数点以下切り捨て
・ a / b において a > 0、b ≧ 0
・ a % b において a > 0、b ≧ 0
数式は以下のEBNFに従って記述されます。
EBNF
<expr> ::= <term> ( ('+'|'-') <term> )*
<term> ::= <number> ( ('*'|'/'|'%') <number> )*
<number> ::= [0-9]+
※ただし、 0 を除いて整数の先頭に 0 がある数字はないものとします。
例)000、001、023
EBNFとはBNFと正規表現の組み合わせによって記述される文法で、言語の構文を定義するために用いられます。
EBNFは非終端記号と終端記号を用いた生成規則によって記述されます。
・ 非終端記号とは
角括弧で囲まれた記号で表されたもので、ある規則で定義されるシンボルとなります。
・ 終端記号とは
実際に使用される数字、文字、文字列です。
BNFの場合は引用符 ("") によって囲まれます。
記述例は以下の通りです。
<paiza> ::= <string>;
<string> ::= <char> | <string> <char>;
<char> ::= "p" | "a" | "i" | "z";
左辺のシンボルは右辺によって定義されます。
正規表現は文字列の集合(パターン)を表す汎用的な記法です。メタ文字が定義され、その組み合わせによって文字列の部分的なマッチングを検索することができます。
メタ文字の例
・ '*'
直前の文字が 0 回以上繰り返される文字列にマッチ
・ '+'
直前の文字が 1 回以上繰り返される文字列にマッチ
・ '|'
前後の文字列の論理和を取る文字列にマッチ
・ '( )'
'('と')'の中の文字列をグループとして扱う
・ '[ ]'
'['と']'の中の文字列のいずれかにマッチ
今回の場合、式 <expr> は 1 つの <term> と 0 個以上の ( ('+'|'-') <term> ) の組み合わせで構成されており、<term> は 1 つの <number> と 0 個以上の ( ('*'|'/'|'%') <number> ) の組み合わせで構成されていることを表しています。
また、<number> は 0 から 9 のいずれかの文字が 1 つ以上連続で繋がったものです。
中置記法は、演算子を操作対象の間に記述する方法です。
例1)1+2 は 1 に 2 を足すことを意味します。
例2)123*456-789 は 123 に 456 を掛けた結果から 789 を引くことを意味します。
・ 数式 S が 1 行で与えられます。
S
整数と演算子の総数を n とします。合計で n+1 行の出力をしてください。
1 行目には式に含まれる整数と演算子の総数を出力してください。
2 行目以降の n 行には、1 行ごとに数式に含まれる整数または演算子およびそのタイプを中置記法の順に空白区切りで出力してください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
1*2-4%3
7
1 number
* operator
2 number
- operator
4 number
% operator
3 number
すべてのテストケースにおいて、数式は以下の条件をみたします。
・ S に含まれるものは整数と演算子のみ
・ S は式として正しいことが保証されている
・ 演算子の種類は '+', '-', '*', '/', '%' の 5 種類のみ
・ 1 ≦ |S| ≦ 105(|S| は S の文字数)
・ 0 ≦ 式に含まれる整数 < 106
・ 式の値は常に10-9 < 式の値 < 109 の範囲を超えない
1*2-4%3
7
1 number
* operator
2 number
- operator
4 number
% operator
3 number