最終的に水はタンクに到達しますか?


30

ASCIIアートの世界では、水、ハッシュウォール、および文字のメカニズムがあります。

あなたはハッシュウォール(#標識)で構成された部屋にいます:

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

S水源(Sサイン)とE水タンク(Eサイン)を設置します。これらは、あらゆる方向から水を受け取ることができますが、SソースとEタンクはそれぞれ1つしかありません。

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

そのため、ソースを配置する場所を賢く選択する必要があります。そこで、スキルを引き出します。

タスク

ソースとタンクがある部屋を表す文字列で構成される入力を取得します。

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

最終的に水がタンクに到達するかどうかを確認する必要があります。水は可能であれば流下し、可能であれば左右に流下します。上がっていないので水はたまりません。

したがって、上記の入力の結果は次のとおりです。

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

水は喜んでタンクに届くので、真実の値を出力する必要があります。

しかし、水がタンクに届かない場合:

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

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

次に、偽の値を出力する必要があります。

最終的に水がタンクに到達するかどうかを判断するプログラムを作成します。コードはできるだけ短くする必要があります。

仮定

  • 入力は常に有効であると仮定します(部屋全体はSとEで囲まれた長方形の領域です)。

  • 入力として提供される部屋は1つだけであるとします。

テストケース

プログラムは、次のテストケースに対して真の値を返す必要があります。

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

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

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

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

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

ただし、次のテストケースの偽の値:

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

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

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

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

Trueカテゴリーの最後から2番目の部屋とFalseカテゴリーの最後の部屋は、Koth:Jump and Run by Manu(sandbox postを削除した)から借りた恥知らずに盗まれました。

Trueカテゴリーの最後の部屋は、RetinaでのMartin Buttnerの回答です。


注:KOTHサンドボックスの投稿を削除しました。あなたのチャレンジはずっと良く見えます:)
CommonGuy

部屋に水が満たされるまで水は溜まりませんか?したがって、同じ部屋にいる場合に限り、水は常にタンクに到達します。
ボブ

1
true / falseチャレンジ(またはクラスが少ない分類チャレンジ)でテストケースをフォーマットするためのプロのヒント:出力ごとにテストケースをグループ化し、グループを分離して、from / to/ reallyビットを回避できるようにします(参加者がすべてのテストを簡単に処理できるようにします)一度にケース)。
マーティンエンダー

1
基本的に、Minecraftの液体フローロジックです。Minecraftでは、水は左側にしか流れないため、実際のテストケースの3番目はfalseを返すと思います。
パトリックロバーツ

1
流砂の物理学を思い出させます。
user253751

回答:


15

カタツムリ、20バイト

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

プリント0falsey値のためと1truthy値について。

オンラインでお試しください!

  • \SS開始時に一致
  • d 方向を下に設定します
  • {...}, 中かっこで0回以上一致します
  • =\##カタツムリの前にイワナがいる場合に成功するが、移動しないアサーション
  • n どちらの方向にも90度回転します
  • (...)? 括弧内のパターンに0回または1回一致します
  • \ ​ スペースに一致し、その上にカタツムリを移動します
  • !(... 否定的な主張です
  • t グリッド内の一致しない正方形にテレポートします
  • \E 一致する E

自分でこの言語をコンパイルしたくありません。このためのオンライン通訳はありますか?
user48538

@ zyabin101いいえ、オンライン通訳はありません。
feersum

さて、デニスに電話する時間です。:P私のプロジェクターはどこですか?
-user48538

5
i.imgur.com/dvWrAwP.png自分で作成しました。
user48538

さて、私は試しましたが、私のために1つを除いてすべてのテストケースで0を出力しています。何が間違っていますか?
デニス

11

スリップ、20 + 2 = 22バイト

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

だからスリップは相変わらず壊れているが、かつてこれは実際にできる挑戦だった。しかし、実際にそのようなゴルフになるように設計されたわけではないので、S:

r終了するにはフラグ(繰り返しセルなし)が必要です。

オンラインでお試しください。出力は、真偽の場合は空、偽の場合は空です。

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

網膜、87バイト

バイトカウントはISO 8859-1エンコードを前提としています。

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

オンラインでお試しください!

Retina(または一般的な.NET正規表現)で2D文字列処理が可能な限り、正確ではありません...

説明

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

これは、水で到達したすべてのセルをでマークするフラッドフィルSです。これは、到達可能な文字を照合しST-modeで文字変換することにより行われます。このフラッドフィルは、スペースとの両方を通過しますE+初めに出力が変化しなくなるまでこれを繰り返します。

実際の正規表現については、2つの個別のケースが含まれています。

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

これは、スペースに一致するか、またはのE1つ下のセルSです。水平方向の位置が同じであることを確認できるように、バランスグループを使用して現在の行のプレフィックスをカウントすることにより、垂直方向のマッチングが行われます。これは落ちる水の世話をします。

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

これは非常によく似ています:S直下の文字Sがaであるという条件で、前後の文字に一致します#。これにより、地面に沿って広がる水が処理されます。

完了したら、水が到達したかどうかを判断するのは非常に簡単Eです。もしそうなら、それEはフラッドフィルの文字列から削除され、そうでなければEまだそこにあります。の数を数えてみましょうE

M`E

しかし今では、それ0は真実のテストケースの場合1(私は偽りだと見なします)および偽のテストケースの場合(偽りだと考えます)です。0この結果のs の数を数えることにより、これを非常に簡単に反転できます。

0

できた


テストケースとして入力を追加します。
user48538
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.