Julia, 90 caractères
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
Contrairement à la solution d'origine (ci-dessous), celle-ci utilise les mathématiques pour déterminer la solution. mapfoldl(collect,hcat,split(s,"\n"))
(écrit ci-dessus avec \n
remplacé par une nouvelle ligne réelle pour enregistrer les caractères) convertit la chaîne en un tableau 2D de caractères. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
crée un tableau de nombres, avec 1 si le personnage est un nuage, -1 si le personnage est pluie et 0 sinon.
cumsum(...')
calcule les sommes cumulées des lignes (serait normalement écrit cumsum(...,2)
, mais comme nous ne nous soucions plus de l'orientation à partir de ce moment, la transposition ne coûte qu'un caractère), puis all(... .>-1)
vérifie un nombre négatif - les négatifs ne se produiront que si un caractère pluie apparaît sans être précédé d'un caractère de nuage.
Julia, 139 136 caractères
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
Cette fonction transpose d'abord le texte pour que les lignes deviennent des colonnes et vice-versa. Notez que les sauts de ligne sont présents dans le code sous la forme de sauts de ligne réels, pour enregistrer un caractère par instance.
La fonction remplace ensuite de manière itérative les paires nuage / gouttelette par des espaces, et une fois que toutes ces paires sont supprimées, elle renvoie true s'il reste des gouttelettes et false sinon.
r"[()_@$&](.*?)[!|.\":]"
- il s'agit d'une expression régulière qui associera les paires nuage / gouttelette de manière paresseuse, le groupe 1 contenant tout entre le nuage et la gouttelette. Puis lui s"\g<1>"
dit de supprimer le nuage et les gouttelettes correspondants, mais gardez les choses entre les deux (nécessaire car il peut contenir des nuages) - \g<1>
c'est tout ce qui a été mis en correspondance dans le groupe 1 de l'expression régulière. ∩("!|.\":",t)==[]
générera l'intersection des caractères de gouttelette avec la chaîne finale, et si elle est vide, alors aucun des caractères de goutte n'est présent et il pleut.