Imagine que eu tenho um número infinito de problemas nos trabalhos de casa (!), Cada um com um número inteiro.
A notação de problemas matemáticos é uma notação para descrever subconjuntos do problema usando especificadores de problemas.
Uma expressão MPN pode consistir em várias coisas:
- Um único valor. Isto representa um conjunto contendo o número:
99 -> {99}
. - Uma gama simples. Este representa o conjunto contendo todos os números desde o início até ao fim do intervalo:
10~13 -> {10, 11, 12, 13}
. Se os lados esquerdo ou direito está faltando, então eles estão a ser assumida -Infinity ou Infinito respectivamente:~10 -> {x|x ≤ 10}
;~ -> ℤ
. - Uma expressão MPN, seguida por "ignorar" e outra expressão MPN. Isso representa a diferença entre os dois conjuntos:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
. - Duas expressões MPN, separadas por vírgula. Isto representa a união de dois conjuntos:
1,8~9,15~17 -> {1,8,9,15,16,17}
.
O operador "ignorar" se liga mais firmemente que o operador de vírgula, portanto 16,110~112 skip 16 -> {16,110,111,112}
(16 não está incluído no conjunto {110,111,112}
, portanto os 16 excluídos não importam).
Você também pode colocar expressões entre parênteses para desambiguação:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
Esta é a gramática:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
Sua tarefa é escrever um programa que aceite duas entradas:
- Uma expressão MPN
- Um número
e gera algum valor de verdade ou falsey, dependendo se esse problema está no conjunto descrito pela expressão MPN.
Especificações
- Você pode assumir que a primeira entrada é uma expressão MPN bem formada (ou seja, que corresponde à gramática acima)
- Os números em uma expressão MPN são sempre números inteiros. Eles podem ser negativos ou zero, mas nunca terão uma parte fracionária.
- Isso é código-golfe , então o menor envio válido (medido em bytes) vence.
- Você pode usar caracteres diferentes para
~
e,
, se desejar.
Casos de teste
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
~
e ,
, mas não para skip
.
6 skip 6,~
que acredito ter interpretado corretamente. As outras 2 respostas até agora não a satisfazem (novamente, assumindo que estou interpretando corretamente). Se eu entendi errado, corrija-o e esclareça, mas, pelo meu entendimento, ele deve corresponder a qualquer coisa (é a união de um conjunto que não corresponde a nada com um conjunto que corresponde a tudo). Esses são os tipos de casos sobre os quais eu estava falando anteriormente, que acho que poderiam ajudar muito ao testar nossas soluções.