Julia, 90 personajes
s->all(cumsum(map(i->i∈"!|.\":"?-1:i∈"()_@\$&",mapfoldl(collect,hcat,split(s,"
")))').>-1)
A diferencia de la solución original (a continuación), esto usa las matemáticas para determinar la solución. mapfoldl(collect,hcat,split(s,"\n"))
(escrito arriba con \n
reemplazado por una nueva línea real para guardar caracteres) convierte la cadena en una matriz 2D de caracteres. map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
crea una matriz de números, con 1 si el personaje es una nube, -1 si el personaje es lluvia y 0 en caso contrario.
cumsum(...')
calcula las sumas acumuladas de las filas (normalmente se escribirían cumsum(...,2)
, pero dado que no nos importa la orientación a partir de este momento, la transposición solo cuesta un carácter), y luego all(... .>-1)
verifica un número negativo; los negativos solo ocurrirán si un carácter de lluvia aparece sin ser precedido por un personaje de nube.
Julia, 139 136 caracteres
s->(t=join(mapfoldl(i->split(i,""),.*,split(s,"
")),"
");while t!=(t=replace(t,r"[()_@$&](.*?)[!|.\":]",s"\g<1>"))end;∩("!|.\":",t)==[])
Esta función primero transpone el texto para que las filas se conviertan en columnas y viceversa. Tenga en cuenta que las nuevas líneas están presentes en el código en forma de nuevas líneas reales, para guardar un carácter por instancia.
Luego, la función reemplaza iterativamente los pares de nubes / gotas con espacios, y una vez que se eliminan todos estos pares, devuelve verdadero si quedan gotas y falso en caso contrario.
r"[()_@$&](.*?)[!|.\":]"
- esta es una expresión regular que emparejará pares de nubes / gotas de una manera perezosa, con el grupo 1 que contiene todo entre nube y gota. Luego s"\g<1>"
le dice que elimine las nubes y las gotas coincidentes, pero que mantenga las cosas en el medio (lo que es necesario ya que puede contener nubes); esto \g<1>
es lo que coincida en el grupo 1 de la expresión regular. ∩("!|.\":",t)==[]
generará la intersección de los caracteres de gota con la cadena final, y si está vacía, entonces ninguno de los caracteres de gota está presente y está lloviendo.