Is it raining? I can't tell These are raindrops:

! | . " :


These are clouds particles:

( ) _ @ $ &amp;


I want you to verify, when given a block of text, whether or not it is raining. It is raining if, for every raindrop, there is a cloud particle somewhere above it. There must be one cloud particle for every raindrop. Output a truthy or falsy value denoting your conclusions.

Valid examples

(@@@@@@)
 ( $ &amp;  )
Q   (  )
..  .  !
 : .
  |"   !
    .




()()()
......




@_$ &amp;
errrr
h_r-5
.:. .
 "


Invalid examples

!
()




$$$$$
(   )
:::::
.....


This is a code-golf so the shortest program in characters wins.
C++11, 186 184 bytes



#include&lt;map&gt;
int i,c;int main(){std::map&lt;int,int&gt;p;while(~(c=getchar())){for(int m:{40,41,95,64,36,38})p[i]+=c==m;for(int m:{33,124,46,34,58})if(c==m&amp;&amp;!p[i]--)return 1;i=c-10?i+1:0;}}


Ungolfed

#include &lt;map&gt;
int i, c;
int main()
{
    std::map&lt;int, int&gt; p;
    while (~(c = getchar()))
    {
//        for (int m : { '(', ')', '_', '@', '$', '&amp;'})
        for (int m : { 40, 41, 95, 64, 36, 38})
            p[i] += c == m;
//        for (int m : { '!', '|', '.', '"', ':'})
        for (int m : { 33, 124, 46, 34, 58})
            if (c == m &amp;&amp; !p[i]--)
                return 1;
        i = c - '\n' ? i + 1 : 0;
    }
    return 0;
}


Basic approach, storing positions of cloud particles in a row and if rain particle is encountered, it checks whether the cloud particle is above it and decreases the counter of cloud particles in that column. The program returns 0 if it's valid and 1 otherwise.