この非公開の質問のタイトルを見たとき、私はそれが面白いコードゴルフチャレンジのように見えると思いました。そのため、次のように紹介します。
チャレンジ:
算術式を考慮すると、プログラム、発現またはサブルーチン書き込みインフィックス表記法、等1 + 2、に同一の発現出力ポストフィックス表記、すなわち1 2 +。
(注:1月前半に同様の課題が投稿されました。 ただし、この個別の課題を正当化するために2つのタスクの詳細が十分に異なっていると感じます。また、下のすべてを入力した後、他のスレッドにのみ気づいたので、むしろただ捨てるだけではありません。)
入力:
入力は、以下からなる有効中置演算式から成る番号(非負整数は一つ以上の桁のシーケンスとして表される)、バランスのとれた括弧グループ化された部分式を示すために、4つの中置バイナリ演算子 +、-、*および/。これらはどれも、無視する必要のある任意の数のスペース文字で区切ることができます(そして式全体を囲むことができます)。1
正式な文法が好きな人のために、有効な入力を定義する簡単なBNFのような文法を以下に示します。簡潔にするため、文法にはオプションのスペースは含まれていません。スペースは、2つのトークン(数字の中の数字以外)の間にある場合があります。
expression := number | subexpression | expression operator expression
subexpression := "(" expression ")"
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
1スペースの存在が解析に影響を与える可能性がある唯一のケースは、2つの連続した数字を区切る場合です。ただし、演算子で区切られていない2つの数値は有効な中置式では発生しないため、このケースは有効な入力では発生しません。
出力:
出力は、入力と同等の後置式でなければなりません。出力式は、次の文法(スペースを含む)2のように、数字と演算子のみで構成され、隣接するトークンの各ペア間に単一のスペース文字が含まれている必要があります。
expression := number | expression sp expression sp operator
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
sp := " "
2簡単にするために、numberこの文法の生成では、以下の規則によって出力が禁止されている場合でも、先頭にゼロを付けて数字を認めています。
演算子の優先順位:
括弧がない場合、次の優先順位規則が適用されます。
- 演算子
*および/は、+およびより優先順位が高くなり-ます。 - 演算子
*と/は、互いに同等の優先順位を持っています。 - 演算子
+と-は、互いに同等の優先順位を持っています。 - すべての演算子は左結合です。
たとえば、次の2つの式は同等です。
1 + 2 / 3 * 4 - 5 + 6 * 7
((1 + ((2 / 3) * 4)) - 5) + (6 * 7)
そして、両方とも次の出力を生成するはずです。
1 2 3 / 4 * + 5 - 6 7 * +
(これらは、同じ優先順位のルールは、C言語のように、そこから派生ほとんどの言語である。彼らはおそらく、あなたが小学校で教えられたルールに似ているの相対的な優先のため、おそらく除く外*と/。)
その他の規則:
与えられた解が式またはサブルーチンである場合、入力が提供され、出力が単一の文字列として返される必要があります。ソリューションが完全なプログラムである場合、標準入力から中置式を含む行を読み取り、後置バージョンを含む行を標準出力に出力する必要があります。
入力の数字には、先行ゼロが含まれる場合があります。出力の数字には先行ゼロがあってはなりません(数字0を除き、これはとして出力されます
0)。何らかの方法で式を評価または最適化することは期待されていません。特に、演算子が連想的、可換的、または他の代数的アイデンティティを必ずしも満たすと仮定すべきではありません。つまり、あなたがその例が想定するべきではない
1 + 2と等しい2 + 1か、ということ1 + (2 + 3)イコール(1 + 2) + 3。あなたは、入力中の数字は2超えていないことを仮定してもよい31 = 2147483647 1を- 。
これらのルールは、正しい出力が入力によって一意に定義されるようにすることを目的としています。
例:
以下に、いくつかの有効な入力式と対応する出力をフォームで示します"input" -> "output"。
"1" -> "1"
"1 + 2" -> "1 2 +"
" 001 + 02 " -> "1 2 +"
"(((((1))) + (2)))" -> "1 2 +"
"1+2" -> "1 2 +"
"1 + 2 + 3" -> "1 2 + 3 +"
"1 + (2 + 3)" -> "1 2 3 + +"
"1 + 2 * 3" -> "1 2 3 * +"
"1 / 2 * 3" -> "1 2 / 3 *"
"0102 + 0000" -> "102 0 +"
"0-1+(2-3)*4-5*(6-(7+8)/9+10)" -> "0 1 - 2 3 - 4 * + 5 6 7 8 + 9 / - 10 + * -"
(少なくとも、これらすべてが正しいことを願っています。手作業で変換を行ったので、間違いが入り込んだかもしれません。)
明確にするために、次の入力はすべて無効です。それらが与えられた場合、ソリューションが何をするかは問題ではありません(もちろん、たとえば、エラーメッセージを返す方が、無限のメモリを消費するよりもいいです):
""
"x"
"1 2"
"1 + + 2"
"-1"
"3.141592653589793"
"10,000,000,001"
"(1 + 2"
"(1 + 2)) * (3 / (4)"
1 2 3 4 + *ますか?
1 2 3 4 +「1 + 2 + 3 + 4」を意味します。