Представьте, что у меня есть бесконечное количество домашних заданий (!), Каждому из которых дано целое число.
Math Problem Notation - это нотация для описания подмножеств проблемы с использованием спецификаторов проблемы.
Выражение MPN может состоять из нескольких вещей:
- Единственное значение. Это представляет собой набор , содержащий номер:
99 -> {99}
. - Простой ассортимент. Это представляет собой набор , содержащий все цифры от начала до конца диапазона:
10~13 -> {10, 11, 12, 13}
. Если левые или правые части отсутствуют, то они считаются -Infinity или бесконечность соответственно:~10 -> {x|x ≤ 10}
;~ -> ℤ
, - Выражение MPN, за которым следует «пропуск» и другое выражение MPN. Это представляет собой разность двух множеств:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
. - Два выражения MPN, разделенные запятой. Это представляет собой объединение двух множеств:
1,8~9,15~17 -> {1,8,9,15,16,17}
.
Оператор «пропустить» связывает более тесно, чем оператор запятой, поэтому 16,110~112 skip 16 -> {16,110,111,112}
(16 не входит в набор {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>
Ваша задача - написать программу, которая принимает два входа:
- Выражение MPN
- Число
и выводит некоторое истинное или ложное значение в зависимости от того, находится ли эта проблема в наборе, описанном выражением MPN.
Характеристики
- Вы можете предположить, что первый вход является правильно сформированным выражением MPN (то есть соответствует грамматике выше)
- Числа в выражении MPN всегда являются целыми числами. Они могут быть отрицательными или нулевыми, но никогда не будут иметь дробной части.
- Это код-гольф , поэтому выигрывает самое короткое действительное представление (измеряется в байтах).
- Вы можете использовать разные символы для
~
и,
, если хотите.
Тестовые случаи
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 ответа пока не удовлетворяют его (опять же, при условии, что я правильно интерпретирую). Если я неправильно понял, пожалуйста, исправьте это и уточнить, но, насколько я понимаю, оно должно соответствовать чему угодно (это объединение набора, который ничего не соответствует, с набором, который соответствует всем). Это те случаи, о которых я говорил ранее, которые, как мне кажется, могут очень помочь при тестировании наших решений.