Imagina que tengo un número infinito de problemas de tarea (!) Cada uno con un número entero.
La notación de problemas matemáticos es una notación para describir subconjuntos del problema utilizando especificadores de problemas.
Una expresión MPN puede constar de varias cosas:
- Un solo valor. Esto representa un conjunto que contiene el número:
99 -> {99}
. - Un rango simple. Esto representa el conjunto que contiene todos los números desde el comienzo hasta el final de la gama:
10~13 -> {10, 11, 12, 13}
. Si los lados izquierdo o derecho se pierden, entonces se supone que son -Infinity o infinito, respectivamente:~10 -> {x|x ≤ 10}
;~ -> ℤ
. - Una expresión MPN, seguida de "omitir" y otra expresión MPN. Esto representa la diferencia de los dos conjuntos:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
. - Dos expresiones MPN, separadas por una coma. Esto representa la unión de dos conjuntos:
1,8~9,15~17 -> {1,8,9,15,16,17}
.
El operador "omitir" se une más fuerte que el operador de coma, por lo tanto 16,110~112 skip 16 -> {16,110,111,112}
(16 no está incluido en el conjunto {110,111,112}
, por lo que el 16 excluyente no importa).
También puede poner expresiones entre paréntesis para la desambiguación:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
Esta es la gramática:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
Su tarea es escribir un programa que tome dos entradas:
- Una expresión MPN
- Un número
y genera algún valor verdadero o falso dependiendo de si ese problema está en el conjunto descrito por la expresión MPN.
Especificaciones
- Puede suponer que la primera entrada es una expresión MPN bien formada (es decir, que coincide con la gramática anterior)
- Los números en una expresión MPN son siempre enteros. Pueden ser negativos o cero, pero nunca tendrán una parte fraccional.
- Este es el código de golf , por lo que gana el envío válido más corto (medido en bytes).
- Puede usar diferentes caracteres para
~
y,
, si lo desea.
Casos de prueba
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
~
y ,
, pero no para skip
.
6 skip 6,~
que creo que he interpretado correctamente. Las otras 2 respuestas hasta ahora no lo satisfacen (nuevamente, suponiendo que estoy interpretando correctamente). Si no he entendido bien, corríjalo y aclare, pero, según tengo entendido, debería coincidir con cualquier cosa (es la unión de un conjunto que no coincide con nada con un conjunto que coincide con todo). Estos son los tipos de casos de los que hablaba anteriormente que creo que podrían ayudar mucho al probar nuestras soluciones.