Julia, 90 znaków
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
W przeciwieństwie do oryginalnego rozwiązania (poniżej), w celu ustalenia rozwiązania wykorzystuje się matematykę. mapfoldl(collect,hcat,split(s,"\n"))(napisane powyżej z \nzastąpionym rzeczywistym znakiem nowej linii w celu zapisania znaków) konwertuje ciąg na tablicę znaków 2d. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)tworzy tablicę liczb, gdzie 1 oznacza, że postać jest chmurą, -1, jeśli postać jest deszczem, a 0 w przeciwnym razie.
cumsum(...')oblicza skumulowane sumy wierszy (normalnie byłoby napisane cumsum(...,2), ale ponieważ od tego momentu nie dbamy o orientację, transpozycja kosztuje tylko jeden znak), a następnie all(... .>-1)sprawdza liczbę ujemną - negatywy pojawią się tylko, jeśli znak deszczu pojawia się bez poprzedzania chmurą.
Julia, 139 136 znaków
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
Ta funkcja najpierw transponuje tekst, aby wiersze stały się kolumnami i odwrotnie. Pamiętaj, że znaki nowego wiersza są obecne w kodzie w postaci rzeczywistych znaków nowego wiersza, aby zapisać jeden znak na wystąpienie.
Następnie funkcja iteracyjnie zastępuje pary chmur / kropel spacjami, a po usunięciu wszystkich takich par zwraca wartość true, jeśli pozostały jakieś krople, a fałsz w przeciwnym razie.
r"[()_@$&](.*?)[!|.\":]"- jest to wyrażenie regularne, które w leniwy sposób dopasuje pary chmura / kropla, przy czym grupa 1 zawiera wszystko między chmurą a kroplą. Następnie s"\g<1>"nakazuje mu usunięcie dopasowanej chmury i kropel, ale trzymanie rzeczy pomiędzy (konieczne, ponieważ może zawierać chmury) - \g<1>to wszystko, co zostało dopasowane w grupie 1 wyrażenia regularnego. ∩("!|.\":",t)==[]wygeneruje przecięcie kropelkowych znaków z końcowym łańcuchem, a jeśli jest pusty, to żaden z kropelkowych znaków nie jest obecny i pada deszcz.