Estas son gotas de lluvia:
! | . " :
Estas son partículas de nubes:
( ) _ @ $ &
Quiero que verifiquen, cuando se les da un bloque de texto, si está lloviendo o no. Está lloviendo si, por cada gota de lluvia, hay una partícula de nube en algún lugar por encima de ella. Debe haber una partícula de nube por cada gota de lluvia. Produzca un valor verdadero o falso que denote sus conclusiones.
Ejemplos válidos
(@@@@@@)
( $ & )
Q ( )
.. . !
: .
|" !
.
()()()
......
@_$ &
errrr
h_r-5
.:. .
"
Ejemplos inválidos
!
()
$$$$$
( )
:::::
.....
Este es un código de golf, por lo que gana el programa más corto en caracteres .
Respuestas:
APL (30)
Esta es una función que toma una matriz de caracteres como entrada y proporciona una salida booleana.
Prueba:
Explicación:
⍵∘∊¨'!|.":' '()_@$&'
: para ambos conjuntos de caracteres (lluvia y nubes) y para cada carácter en ⍵, vea si el personaje es miembro del conjunto.+⍀¨
: obtenga una suma acumulada para cada columna y cada conjunto≤/
: para cada posición en ⍵, verifique que la cantidad de gotas de lluvia no exceda la cantidad de partículas de nubes en la suma acumulada∧/∊
: devuelve el AND booleano de todos los elementos en el resultadofuente
C ++ 11,
186184 bytesSin golf
Enfoque básico, almacenando las posiciones de las partículas de la nube en una fila y si se encuentra una partícula de lluvia, verifica si la partícula de la nube está por encima y disminuye el contador de partículas de la nube en esa columna. El programa devuelve 0 si es válido y 1 de lo contrario.
fuente
c-m?0:p[i]++
conp[i]+=c==m
? ¿O eso ya no funciona en C ++ 11?Caracoles , 125
El programa genera el área de la cuadrícula (o 1 si su área es 0) si está lloviendo; de lo contrario 0. Si solo hubiera implementado clases de caracteres de estilo regex.
Versión no golfista Contiene instrucciones falsas para nubes o gotas de lluvia en lugar de escribir todas las galimatías.
\whatever
(reemplazado con.
en el programa real) significa algo que debería ser una gota de lluvia, pero en realidad puede ser cualquier cosa porque no importa si hacemos coincidir una gota de lluvia con una nube.fuente
Python 2, 121 bytes
Espera que la entrada que se rellena sea rectangular.
fuente
JavaScript ES6, 112
Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 que implementa funciones de flecha, operador extendido y cadenas de plantilla (uso Firefox)
fuente
Perl 5, 80
79, más uno para en
-E
lugar de-e
fuente
Julia, 90 personajes
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íancumsum(...,2)
, pero dado que no nos importa la orientación a partir de este momento, la transposición solo cuesta un carácter), y luegoall(... .>-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,
139136 caracteresEsta 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. Luegos"\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.fuente
h
uso con la función anónima real. De esta manera:g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))
- llamarloh
hace que sea más fácil invocarlo.