Virus vs Antidotes code golf There is a rectangular 2D array containing viruses denoted by 'v', antidote1 denoted by 'a', and antidote2 denoted by 'b' (there are no values other than 'v', 'a' and 'b').
Antidote1 can kill neighboring viruses in horizontal and vertical directions only, but antidote2 can kill neighboring(if any) viruses in horizontal, vertical and diagonal directions.
Once the antidotes are activated, how many viruses will remain at the end?
Examples:
Input:
vv
vv

Output: 4
Input:
av
vv

Output: 1
Input:
vvv
vbv
vvv

Output: 0
Input:
bvb
bav
vab
vvv
vvb
vvv
vvv
bva
vav

Output: 3
Python 3, 131 bytes

j=''.join
g=lambda s:eval('j(s)'+4*'.replace(&quot;%s%s&quot;,&quot;%s%s&quot;)'%(*'vbbbbvbbavacvaca',))
f=lambda x:j(map(g,zip(*map(g,x)))).count('v')

Try it online!
-2 bytes thanks to Kevin Cruijssen
Explanation
Replaces all 'v' to 'b' if found next to 'b'. Next, replaces all 'v' to 'c' if found next to 'a'. A second iteration with the transposed version of the array clears all vertical and diagonal viruses. Finally, it will return the remaining number of 'v's.

Without eval:
Python 3, 134 bytes

j=''.join
g=lambda s,m='vbbbbvbbavacvaca':m and g(j(s).replace(m[:2],m[2:4]),m[4:])or s
f=lambda x:j(map(g,zip(*map(g,x)))).count('v')

Try it online!