Scrivi un programma che includa una stringa di quattro caratteri ()[]
che soddisfi questi punti:
- Ogni parentesi sinistra
(
ha una parentesi destra corrispondente)
. - Ogni parentesi sinistra
[
ha una parentesi destra corrispondente]
. - Le coppie di parentesi e parentesi corrispondenti non si sovrapporranno. es.
[(])
non è valido perché le parentesi corrispondenti non sono completamente contenute tra parentesi corrispondenti, né viceversa. - Il primo e l'ultimo carattere sono una coppia di parentesi o parentesi corrispondenti. Quindi
([]([]))
e[[]([])]
sono validi ma[]([])
non lo sono.
(Una grammatica per il formato di input è <input> ::= [<input>*] | (<input>*)
.)
Ogni coppia di parentesi e parentesi corrispondenti corrisponde a un numero intero non negativo:
- I valori delle coppie tra parentesi corrispondenti sono tutti sommati . La corrispondenza vuota
()
ha valore0
. - I valori delle coppie all'interno delle parentesi corrispondenti vengono moltiplicati . La corrispondenza vuota
[]
ha valore1
.
(La somma o il prodotto di un numero è lo stesso numero.)
Ad esempio, ([](())([][])[()][([[][]][][])([][])])
può essere suddiviso e valutato come 9
:
([](())([][])[()][([[][]][][])([][])]) <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )]) <handle empty matches>
(1 0 2 0 [(1 1 1 )2 ]) <next level of matches>
(1 0 2 0 [3 2 ]) <and the next>
(1 0 2 0 6 ) <and the next>
9 <final value to output>
Un altro esempio:
[([][][][][])([][][])([][][])(((((([][]))))))] <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5 3 3 (((((2 )))))]
[5 3 3 ((((2 ))))]
[5 3 3 (((2 )))]
[5 3 3 ((2 ))]
[5 3 3 (2 )]
[5 3 3 2 ]
90 <output>
Il tuo programma deve valutare e stampare l'intero rappresentato dall'intera stringa di input. Si può presumere che l'input sia valido. Vince il codice più breve in byte.
Invece di un programma, è possibile scrivere una funzione che accetta una stringa e stampa o restituisce il numero intero.