¿El agua finalmente llega al tanque?

30

En el mundo del arte ASCII, hay agua, paredes hash y mecanismos de letras.

Estás en una habitación compuesta por paredes de hachís ( #signos):

#######
#     #
#     #
#     #
# ### #
#     #
#######

Instala una fuente de agua S ( Sletrero) y un tanque de agua E ( Eletrero) que puede recibir agua desde cualquier dirección, pero solo tiene una fuente S y un tanque E.

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

Por lo tanto, debe seleccionar sabiamente dónde colocar la fuente. Ahí es donde sacas tus habilidades de .

La tarea

Obtiene una entrada que consiste en una cadena que representa una habitación con la fuente y el tanque:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

Tienes que averiguar si el agua finalmente llega al tanque. El agua fluye hacia abajo, si es posible, de lo contrario hacia la izquierda y hacia la derecha, si es posible. El agua no se acumula porque no sube.

Entonces, para la entrada anterior, el resultado es:

#######
#  *  #
#  *  #
#*****#
#*###*#
#**O**#
#######

El agua llega felizmente al tanque, por lo que debe generar un valor verdadero.

Pero si el agua no llega al tanque:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#*    #
#*    #
#* X  #
#*### #
#*****#
#######

Entonces debe generar un valor falso.

Escriba un programa para decidir si el agua finalmente llega al tanque. Su código debe ser lo más corto posible.

Supuestos

  • Suponga que la entrada siempre es válida (toda la sala es una región rectangular cerrada con S y E).

  • Suponga que solo se proporciona una habitación como entrada.

Casos de prueba

Su programa debe devolver un valor verdadero para los siguientes casos de prueba:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

#######
#  S  #
#     #
#  E  #
#     #
#     #
#######

#######
#     #
#     #
# SE  #
# ### #
#     #
#######

###############################################
#                      S                      #
#                                             #
#                                             #
#                                             #
#               ###############               #
#                                             #
#  ##################     ##################  #
#                                             #
#                                             #
#                    #####                    #
#                      E                      #
###############################################

#######
#  S  #
#     #
#     #
# ### #
#   # #
### ###
## E ##
#     #
#######

Pero un valor falso para los siguientes casos de prueba:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#     #
# SE  #
#     #
#     #
#     #
#######

#######
#     #
#  E  #
#     #
#  S  #
#     #
#######

####################################
#                                  #
#                                  #
#                                  #
#S             #                  E#
####################################

La penúltima habitación en la categoría Verdadero y la última habitación en la categoría Falso fueron robadas descaradamente de Koth: Jump and Run por Manu (quien eliminó la publicación de sandbox).

La última habitación en la categoría Verdadero es de la respuesta de Martin Buttner en Retina .

usuario48538
fuente
Nota: eliminé mi KOTH sandbox post, su desafío se ve mucho mejor :)
CommonGuy
¿No se acumula el agua hasta llenar cualquier habitación? Así, el agua siempre llega al tanque si y solo si están en la misma habitación.
Bob
1
Consejo profesional para formatear casos de prueba en desafíos verdaderos / falsos (o desafíos de clasificación con pocas clases): agrupe los casos de prueba por salida y separe los grupos para que pueda evitar los bits from / to/ realmente (lo que facilita a los participantes procesar todas las pruebas casos a la vez).
Martin Ender
1
Entonces, básicamente, la lógica de flujo de líquidos de Minecraft. Aunque en Minecraft creo que el tercero en sus casos de prueba verdaderos volvería falso ya que el agua solo iría hacia el lado izquierdo.
Patrick Roberts
1
Me recuerda a la física del agua de arena que cae.
user253751

Respuestas:

15

Caracoles , 20 bytes

\S{d(=\#n)?^#},!(t\E

Imprime 0para el valor de falsey y 1para el valor de verdad.

Pruébalo en línea!

  • \Spartidos Sal inicio
  • d establece la dirección hacia abajo
  • {...}, coincide con las cosas entre llaves 0 o más veces
  • =\#es una afirmación que tiene éxito si hay un #personaje delante del caracol, pero no lo mueve
  • n gira 90 grados en cualquier dirección
  • (...)? coincide con el patrón entre paréntesis 0 o 1 veces
  • \ ​ coincide con un espacio y mueve el caracol sobre él
  • !(... es una afirmación negativa
  • t se teletransporta a cualquier cuadrado sin igual en la cuadrícula
  • \E partidos E
Feersum
fuente
No quiero compilar este lenguaje solo. ¿Hay un intérprete en línea para esto?
user48538
@ zyabin101 No, no hay un intérprete en línea.
Feersum
Bien, es hora de llamar a Dennis. : P ¿Dónde está mi proyector?
user48538
55
i.imgur.com/dvWrAwP.png Lo hice yo mismo.
user48538
Bueno, lo he intentado , pero está imprimiendo 0 para todos los casos de prueba menos uno para mí. ¿Qué estoy haciendo mal?
Dennis
11

Slip , 20 + 2 = 22 bytes

S>( ^4|^4(?|`#)^T)*E

Así que Slip sigue tan roto como siempre, pero por una vez este fue un desafío que realmente podría hacer. Sin embargo, nunca fue realmente diseñado para ser tan golfista, por lo que nunca superará a Snails en nada: P

Necesita que la rbandera (sin celdas repetidas) termine.

Pruébalo en línea . La salida es el camino tomado por la verdad, vacío por la falsedad.

S                 Match S
>                 Rotate pointer downward
(                 Either...
 <space>^4          Match a space and point downwards
 |                  or
 ^4                 Point downwards
 (?|`#)             Match # below then reset pointer
 ^T                 Either turn left or right
)*                ... 0+ times
E                 Match E
Sp3000
fuente
6

Retina , 87 bytes

El recuento de bytes asume la codificación ISO 8859-1.

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?
M`E
0

Pruébalo en línea!

Por mucho que sea posible el procesamiento de cadenas 2D en Retina (o .NET regex en general), no es exactamente conciso ...

Explicación

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

Este es un relleno de inundación que marca todas las celdas a las que llega el agua S. Lo hace uniendo los caracteres que se pueden alcanzar y luego transliterándolos Scon T-mode. Este relleno de inundación atraviesa ambos espacios y E. Al +principio se repite esto hasta que la salida deja de cambiar.

En cuanto a la expresión regular real, contiene dos casos separados:

(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]

Esto coincide con un espacio o Eque es exactamente una celda debajo de un S. La coincidencia vertical se realiza contando el prefijo en la línea actual utilizando grupos de equilibrio para que podamos asegurarnos de que la posición horizontal sea la misma. Este se encarga de la caída del agua.

.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

Esto es muy similar: coincide con un carácter Sy, si está disponible, antes y después, siempre que el carácter directamente debajo de este Ssea ​​un #. Esto se encarga de que el agua se extienda por el suelo.

Cuando terminamos, es muy fácil determinar si el agua llegó E. Si lo hizo, entonces Ese ha eliminado de la cadena en el relleno de inundación, y si no, Etodavía está allí. Entonces, cuentemos el número de Es:

M`E

Pero ahora eso es 0(lo que consideraría falso) para los casos de prueba de verdad y 1(lo que consideraría verdadero) para los casos de prueba de falsedad. Podemos invertir esto muy fácilmente contando el número de 0s en este resultado:

0

Hecho.

Martin Ender
fuente
Agregar su entrada como un caso de prueba.
user48538