Su nihayetinde tanka ulaşır mı?


30

ASCII sanat dünyasında su, karma duvarlar ve harf mekanizmaları var.

Karma duvarlardan ( #tabelalar) oluşan bir odadasın :

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

Herhangi bir yönden su alabilen bir S su kaynağı ( Sişareti) ve bir E su tankı ( Eişareti) takarsınız, ancak yalnızca bir S kaynağı ve bir E tankı vardır.

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

Bu yüzden kaynağın nereye yerleştirileceğini akıllıca seçmek zorundasınız. becerilerinizi oradan çekersiniz.

Görev

Kaynak ve tank ile bir odayı temsil eden bir dizgeden oluşan bir girdi elde edersiniz:

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

Suyun nihayetinde tanka ulaşıp ulaşmadığını bulmanız gerekir. Mümkünse su, mümkünse sola ve sağa doğru akar. Su birikmiyor, çünkü yükselmiyor.

Yani, yukarıdaki girdi için sonuç şöyledir:

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

Su mutlu bir şekilde tanka ulaşır, bu yüzden gerçek bir değer vermelisin.

Fakat su tanka ulaşmazsa:

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

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

O zaman sahte bir değer vermelisin.

Suyun nihayetinde tanka ulaşıp ulaşmadığına karar vermek için bir program yazın. Kodunuz mümkün olduğu kadar kısa olmalıdır.

Varsayımlar

  • Girişin her zaman geçerli olduğunu varsayalım (tüm oda, S ve E ile birlikte alınmış dikdörtgen bir bölgedir).

  • Girdi olarak yalnızca bir oda bulunduğunu varsayalım.

Test Kılıfları

Programınız aşağıdaki test durumları için gerçek bir değer döndürmelidir:

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

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

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

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

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

Ancak, aşağıdaki test durumları için sahte bir değer:

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

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

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

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

Gerçek kategorisinde son odası ve Yanlış kategoride son odaya ikinci utanmadan edildi çalınmış ödünç Git ve Run: Koth tarafından Manu (sandbox yazı silinmiş).

True kategorisindeki son oda Martin Buttner'in Retina'daki cevabından .


Not: KOTH sanal alan yayınımı sildim, mücadeleniz çok daha iyi görünüyor :)
CommonGuy

Su herhangi bir odayı dolana kadar birikmez mi? Böylece su, yalnızca aynı odadaysa ve her zaman depoya ulaşır.
Bob,

1
Test vakalarını doğru / yanlış zorluklarda (veya az sayıda sınıfla sınıflandırma zorluklarını) biçimlendirmek için profesyonel ipucu: Test vakalarını çıktı alarak gruplayın ve from / to/ gerçekten bitlerden kaçınmak için grupları ayırın (böylece katılımcıların tüm testleri işlemesini kolaylaştırır) aynı anda davalar).
Martin Ender

1
Yani temelde Minecraft sıvı akış mantığı. Her ne kadar Minecraft'ta, gerçek test durumlarınızda 3. sıra, su yalnızca sola doğru gideceği için yanlış dönecektir.
Patrick Roberts 19

1
Bana düşen kum su fiziğini hatırlatıyor.
user253751

Yanıtlar:


15

Salyangoz , 20 bayt

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

Baskılar 0Falsey değeri ve 1truthy değeri için.

Çevrimiçi deneyin!

  • \SSbaşında maçlar
  • d aşağı yönünü ayarlar
  • {...}, 0 veya daha fazla kez ayraçlardakilerle eşleşir
  • =\##salyangozun önünde bir karakter varsa başarılı olan , ancak hareket etmeyen bir iddiadır.
  • n her iki yönde 90 derece döner
  • (...)? deseni parantez içinde 0 veya 1 kez eşleştirir
  • \ ​ boşlukla eşleşir ve salyangoz
  • !(... olumsuz bir iddia
  • t ızgaradaki herhangi bir eşleşmemiş kareye ışınlanır
  • \E maçlar E

Bu dili tek başıma derlemek istemiyorum. Bunun için çevrimiçi bir tercüman var mı?
user48538

@ zyabin101 Hayır, çevrimiçi tercüman yok.
feersum

Tamam, Dennis'i arama zamanı. : P Projektörüm nerede?
user48538


Şey, denedim , ama tüm test senaryoları için 0 ama benim için bir tane basılıyor. Neyi yanlış yapıyorum?
Dennis,

11

Kayma , 20 + 2 = 22 bayt

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

Slip hala her zamanki gibi kırıldı, ama bir kereliğine bu aslında yapabileceği bir zorluktu. Asla o kadar golf oynamak için tasarlanmadı, bu yüzden hiçbir zaman Salyangozları hiçbir zaman yenemez: P

İhtiyaç rsonlandırmak için bayrağı (Yineleme hücreleri) içerir.

Çevrimiçi deneyin . Çıktı, truthy için atılmış, sahte için boş olan yoldur.

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

6

Retina , 87 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin!

Retina'da (veya genel olarak .NET regex) 2D dizgileri işleme mümkün olduğu kadar, tam olarak özlü değil ...

açıklama

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

Bu su ile ulaşılan tüm hücreleri işaretleyen bir sel dolgusu S. Bunu, ulaşılabilen karakterleri eşleştirerek ve sonra bunları -mode Sile Tçevirerek yapar. Bu sel dolgusu her iki uzayda da gider E. +Başında çıktı değişiyor duruncaya kadar bu tekrarlar.

Gerçek regex gelince iki ayrı durum içeriyor:

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

Bu, bir boşlukla eşleşir ya Eda tam olarak bir hücrenin altındaki bir hücredir S. Dikey eşleştirme, dengeleme grupları kullanılarak geçerli satırdaki ön ekin sayılmasıyla yapılır, böylece yatay konumun aynı olmasını sağlayabiliriz. Bu, düşen su ile ilgilenir.

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

Bu çok benzer: bir eşleşir Sve varsa önceki ve sonraki karakter, karakter doğrudan altından şartıyla Sbir olduğunu# . Bu, suyun zemine yayılmasını sağlar.

İşimiz bittiğinde suyun ulaşıp ulaşmadığını belirlemek çok kolay E. Eğer öyleyse E, sel dolgusu içindeki dizeden çıkarıldı ve değilse Ede hala orada. Öyleyse Es sayısını sayalım:

M`E

Ama şimdi bu 0, truthy test davaları için (fahişeyi düşünürdüm) ve 1(truthy düşünürüm) sahte test sınavları için. Bu sonuçtaki 0s sayısını sayarak bunu kolayca tersine çevirebiliriz :

0

Bitti.


Girişinizi bir test durumu olarak ekleme.
user48538
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.