Immagina di avere un numero infinito di problemi a casa (!) Ognuno con un numero intero.
Math Problem Notation è una notazione per la descrizione di sottoinsiemi del problema utilizzando gli identificatori del problema.
Un'espressione MPN può consistere in diverse cose:
- Un singolo valore Questo rappresenta un insieme contenente il numero:
99 -> {99}
. - Una gamma semplice. Questo rappresenta l'insieme contenente tutti i numeri dall'inizio alla fine dell'intervallo:
10~13 -> {10, 11, 12, 13}
. Se i lati sinistro o destro sono mancanti, allora si presume che siano rispettivamente -Infinity o infinito:~10 -> {x|x ≤ 10}
;~ -> ℤ
. - Un'espressione MPN, seguita da "skip" e un'altra espressione MPN. Questo rappresenta la differenza tra i due gruppi:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
. - Due espressioni MPN, separate da una virgola. Questo rappresenta l'unione di due insiemi:
1,8~9,15~17 -> {1,8,9,15,16,17}
.
L'operatore "salta" si lega più strettamente dell'operatore virgola, quindi 16,110~112 skip 16 -> {16,110,111,112}
(16 non è incluso nel set {110,111,112}
, quindi i 16 esclusi non contano.)
Puoi anche mettere espressioni tra parentesi per chiarire le ambiguità:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
Questa è la grammatica:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
Il tuo compito è scrivere un programma che accetta due input:
- Un'espressione MPN
- Un numero
e genera un valore di verità o falsità a seconda che il problema si trovi nell'insieme descritto dall'espressione MPN.
specificazioni
- Puoi presumere che il primo input sia un'espressione MPN ben formata (cioè che corrisponda alla grammatica sopra)
- I numeri in un'espressione MPN sono sempre numeri interi. Possono essere negativi o zero, ma non avranno mai una parte frazionaria.
- Questo è code-golf , quindi vince l'invio valido più breve (misurato in byte).
- Puoi usare caratteri diversi per
~
e,
, se lo desideri.
Casi test
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 ,
, ma non per skip
.
6 skip 6,~
che credo di aver interpretato correttamente. Le altre 2 risposte finora non lo soddisfano (di nuovo, supponendo che io stia interpretando correttamente). Se ho frainteso, correggilo e chiariscilo, ma dalla mia comprensione, dovrebbe corrispondere a tutto (è l'unione di un set che non corrisponde a un set che corrisponde a tutto). Questi sono i tipi di casi di cui parlavo prima che penso possano aiutare molto quando testiamo le nostre soluzioni.