Julia, 90 caratteri
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
A differenza della soluzione originale (di seguito), utilizza la matematica per determinare la soluzione. mapfoldl(collect,hcat,split(s,"\n"))(scritto sopra con \nsostituito con una nuova riga effettiva per salvare i caratteri) converte la stringa in una matrice 2d di caratteri. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)crea una matrice di numeri, con 1 se il personaggio è una nuvola, -1 se il personaggio è pioggia e 0 altrimenti.
cumsum(...')calcola le somme cumulative delle righe (normalmente verrebbero scritte cumsum(...,2), ma dal momento che non ci preoccupiamo dell'orientamento da questo punto in poi, la trasposizione costa solo un carattere) e quindi all(... .>-1)verifica la presenza di un numero negativo - i negativi si verificano solo se un carattere pioggia appare senza essere preceduto da un personaggio cloud.
Julia, 139 136 caratteri
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
Questa funzione prima traspone il testo in modo che le righe diventino colonne e viceversa. Si noti che le nuove righe sono presenti nel codice sotto forma di nuove righe effettive, per salvare un carattere per istanza.
La funzione sostituisce quindi in modo iterativo le coppie cloud / droplet con spazi e, una volta rimosse tutte queste coppie, restituisce true se sono presenti goccioline rimanenti e false in caso contrario.
r"[()_@$&](.*?)[!|.\":]"- questa è una regex che abbinerà le coppie cloud / droplet in modo pigro, con il gruppo 1 che contiene tutto tra cloud e droplet. Quindi gli s"\g<1>"dice di rimuovere la nuvola e le goccioline abbinate, ma tieni le cose in mezzo (necessario in quanto può contenere nuvole) - \g<1>è tutto ciò che è stato abbinato nel gruppo 1 della regex. ∩("!|.\":",t)==[]genererà l'intersezione dei caratteri della goccia con la stringa finale, e se è vuota, nessuno dei caratteri della goccia è presente e piove.