L'eau atteint-elle finalement le réservoir?

30

Dans le monde de l'art ASCII, il y a de l'eau, des murs de hachage et des mécanismes de lettres.

Vous êtes dans une pièce composée de murs de hachage ( #panneaux):

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

Vous installez une source d'eau S ( Spanneau) et un réservoir d'eau E ( Epanneau) qui peut recevoir de l'eau de n'importe quelle direction, mais vous n'avez qu'une source S et un réservoir E.

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

Vous devez donc choisir judicieusement où placer la source. C'est là que vous retirez vos compétences de .

La tâche

Vous obtenez une entrée composée d'une chaîne représentant une pièce avec la source et le réservoir:

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

Vous devez savoir si l'eau atteint finalement le réservoir. L'eau coule, si possible, sinon à gauche et à droite, si possible. L'eau ne s'accumule pas car elle ne monte pas.

Ainsi, pour l'entrée ci-dessus, le résultat est:

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

L'eau atteint joyeusement le réservoir, vous devez donc produire une valeur vraie.

Mais si l'eau n'atteint pas le réservoir:

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

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

Ensuite, vous devez sortir une valeur falsifiée.

Écrivez un programme pour décider si l'eau atteint finalement le réservoir. Votre code doit être aussi court que possible.

Hypothèses

  • Supposons que l'entrée est toujours valide (toute la pièce est une région rectangulaire fermée avec le S et l'E).

  • Supposons qu'une seule pièce soit fournie en entrée.

Cas de test

Votre programme doit renvoyer une valeur véridique pour les cas de test suivants:

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

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

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

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

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

Mais une valeur fausse pour les cas de test suivants:

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

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

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

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

L'avant-dernière salle de la catégorie True et la dernière salle de la catégorie False ont été volées sans vergogne à Koth: Jump and Run by Manu (qui a supprimé le post sandbox).

La dernière salle de la catégorie True provient de la réponse de Martin Buttner dans Retina .

user48538
la source
Remarque: j'ai supprimé mon message KOTH sandbox, votre défi semble beaucoup mieux :)
CommonGuy
L'eau ne s'est-elle pas accumulée jusqu'à ce qu'elle remplisse une pièce? Ainsi, l'eau atteint toujours le réservoir si et seulement si elle se trouve dans la même pièce.
Bob
1
Astuce de pro pour formater les cas de test en vrais / faux défis (ou défis de classification avec peu de classes): regroupez les cas de test par sortie et séparez les groupes afin d'éviter les bits from / to/ vraiment (ce qui facilite le traitement des tests par les participants cas à la fois).
Martin Ender
1
Donc, fondamentalement, la logique d'écoulement liquide Minecraft. Bien que dans Minecraft, je pense que le 3ème de vos vrais cas de test retournerait faux car l'eau n'irait que vers le côté gauche.
Patrick Roberts
1
Ça me rappelle la physique de l'eau de sable tombant.
user253751

Réponses:

15

Escargots , 20 octets

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

Imprime 0pour la valeur falsey et 1pour la valeur véridique.

Essayez-le en ligne!

  • \Smatchs Sau départ
  • d fixe la direction vers le bas
  • {...}, correspond à la substance entre accolades 0 fois ou plus
  • =\#est une assertion qui réussit s'il y a un #omble chevalier devant l'escargot, mais qui ne le déplace pas
  • n tourne à 90 degrés dans les deux sens
  • (...)? correspond au motif entre parenthèses 0 ou 1 fois
  • \ ​ correspond à un espace et y déplace l'escargot
  • !(... est une affirmation négative
  • t se téléporte vers n'importe quel carré inégalé de la grille
  • \E allumettes E
feersum
la source
Je ne veux pas compiler cette langue moi-même. Y a-t-il un interprète en ligne pour cela?
user48538
@ zyabin101 Non, il n'y a pas d'interprète en ligne.
feersum
D'accord, il est temps d'appeler Dennis. : P Où est mon projecteur?
user48538
5
i.imgur.com/dvWrAwP.png Je l'ai fait moi-même.
user48538
Eh bien, j'ai essayé , mais il imprime 0 pour tous les cas de test, mais un pour moi. Qu'est-ce que je fais mal?
Dennis
11

Caleçon , 20 + 2 = 22 octets

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

Donc, Slip est toujours aussi cassé que jamais, mais pour une fois, c'était un défi qu'il pouvait réellement relever. Il n'a jamais été vraiment conçu pour être aussi golfique, donc il ne battra jamais les escargots à quoi que ce soit: P

A besoin de r indicateur (pas de cellules répétitives) pour se terminer.

Essayez-le en ligne . La sortie est le chemin emprunté pour la vérité, vide pour la fausseté.

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
la source
6

Rétine , 87 octets

Le nombre d'octets suppose un codage ISO 8859-1.

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

Essayez-le en ligne!

Autant le traitement de chaînes 2D est possible dans Retina (ou l'expression régulière .NET en général), il n'est pas exactement concis ...

Explication

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

C'est un remblai qui marque toutes les cellules atteintes par l'eau S. Il le fait en faisant correspondre les caractères pouvant être atteints, puis en les translittérant Savec T-mode. Ce remblai traverse à la fois les espaces et E. Au +début, cela se répète jusqu'à ce que la sortie cesse de changer.

Quant à l'expression rationnelle réelle, elle contient deux cas distincts:

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

Cela correspond à un espace ou Equi est exactement une cellule sous un S. La correspondance verticale se fait en comptant le préfixe sur la ligne actuelle à l'aide de groupes d'équilibrage afin que nous puissions nous assurer que la position horizontale est la même. Celui-ci s'occupe des chutes d'eau.

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

Ceci est très similaire: il correspond à un Set le cas échéant le caractère avant et après, à condition que le caractère directement sous l' Sest# . Cela prend soin de l'eau qui se répand sur le sol.

Lorsque nous avons terminé, il est très facile de déterminer si l'eau a atteint E. Si c'est le cas, alors Ea été supprimé de la chaîne dans le remplissage, et sinon, il Eest toujours là. Comptons donc le nombre de Es:

M`E

Mais maintenant, c'est 0(ce que je considérerais comme de la fausse) pour des cas de test véridiques et 1(que je considérerais comme vrai) pour des cas de test de fausseté. On peut inverser cela très facilement en comptant le nombre de 0s dans ce résultat:

0

Terminé.

Martin Ender
la source
Ajout de votre entrée comme cas de test.
user48538