それぞれに整数が与えられた宿題の問題が無限にあると想像してください(!)。
数学問題表記法は、問題指定子を使用して問題のサブセットを記述するための表記法です。
MPN式は、次のもので構成されます。
- 単一の値。これは、番号を含むセットを表します
99 -> {99}
。 - シンプルな範囲。これは、範囲の最初から最後までのすべての数値を含むセットを表します
10~13 -> {10, 11, 12, 13}
。左側または右側が欠落している場合、それぞれ-InfinityまたはInfinityと見なされます~10 -> {x|x ≤ 10}
。~ -> ℤ
。 - 「スキップ」と別のMPN式が続くMPN式。これは、2つのセットの差を表します
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
。 - コンマで区切られた2つのMPN式。これは、2つのセットの和集合を表します
1,8~9,15~17 -> {1,8,9,15,16,17}
。
「スキップ」演算子はコンマ演算子よりも厳密にバインドするため、16,110~112 skip 16 -> {16,110,111,112}
16はset {110,111,112}
に含まれないため、16を除外することは問題になりません。
曖昧さをなくすために括弧で式を置くこともできます:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
これは文法です:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
あなたの仕事は、2つの入力を受け取るプログラムを作成することです。
- MPN式
- 数
そして、その問題がMPN式で記述されたセットにあるかどうかに応じて、真偽値または偽値を出力します。
仕様書
- 最初の入力が整形式のMPN式であると想定できます(つまり、上記の文法と一致する)
- MPN式の数値は常に整数です。負またはゼロにすることができますが、小数部分はありません。
- これはcode-golfであるため、最短の有効な送信(バイト単位で測定)が優先されます。
- 必要に応じて
~
と,
に異なる文字を使用できます。
テストケース
10~20 14 -> True
10~20 20 -> True
10~20 skip 14~18 17 -> False
~ skip 6 8 -> True
16,17 skip 16 16 -> True
(16,17) skip 16 16 -> False
~10,5~ 8 -> True
~10,5~ 4 -> True
6 skip 6,~ 6 -> True
~
および,
に対して、ただしに対してではありませんskip
。
6 skip 6,~
を追加しましたが、正しく解釈できたと思います。他の2つの答えはこれまでのところ満足していません(これもまた、私が正しく解釈していると仮定して)。誤解した場合は修正して明確にしてください。しかし、私の理解から、それは何にも一致するはずです(すべてに一致するセットと何も一致しないセットの和集合です)。これらは、以前に話していた種類のケースであり、ソリューションをテストするときに大いに役立つと思います。