それが立ち往生するまで壁に続く蛇で迷路を埋めます


21

迷路をヘビで満たしてください(動けなくなるまで)。

ヘビ

ヘビは、EASTを指す所定の開始点で開始します。それはすぐに、常に壁やその体の一部を持っていることによって移動LEFTその頭の(「左手の法則壁フォロワーその頭の周りのすべての4つの方向が占有されているので、それが立ち往生なるまで、」)。(注:立ち往生しているヘビは、到達可能なすべてのスペースを埋めることはできませんが、それは目標ではありません!)

チャレンジ

2Dテキストの形式で迷路を入力として受け入れるプログラムまたは関数を作成します。

  • 入力は、文字列のリスト、改行を含む単一の文字列、ファイルなど、合理的な形式で入力できます。
  • 迷路には、壁( " #")、空のスペース( " ")、および1つの開始点( " o")があります。
  • 選ぶことができます

    • 最初と最後の行と列が完全に壁であると仮定します。
    • または、すべての入力が暗黙の壁の外層を持つと見なされると仮定します
  • 開始点のすぐ上に壁(または暗黙の壁)があり(NORTH)、ヘビが東または南方向に有効な開始移動を行うことができると仮定できます。

  • テキストに他の文字が存在しないと仮定できます(入力に必要な場合は改行を除きます)。
  • すべての行が同じ長さであると想定できます。

そして、出力として「塗りつぶされた迷路」を印刷/返し、スタックした瞬間のヘビのスナップショットを返します。

  • ヘビの体は、次のセグメントが>v<^どこにあるかを指し示す文字で表されます
  • ヘビの開始点は、開始時の方向(>すぐに方向転換oする必要がない限り" " ")またはキャラクター(一貫性のある必要はありません)のいずれかです。
  • ヘビの終点はoキャラクターです

得点

通常のゴルフ:最短のコードが勝つ

in:
#################################
#                    o          #
#                               #
#     ##       ###       ##     #
#    ##     ##     ##     ##    #
#    ##     ##     ##     ##    #
#    ##      ##   ##      ##    #
#   ##       ##   ##       ##   #
#   ##         ###         ##   #
#    ##       #####       ##    #
#    ##       #####       ##    #
#    ##        ###        ##    #
#     ##                 ##     #
#                               #
#                               #
#################################

out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^   ##>>>>>>v###o>>>>>v##   vv#
#^^  ##>^   ##>>>>^##   >v##  vv#
#^^  ##^    ##     ##    v##  vv#
#^^  ##^     ##   ##     v##  vv#
#^^ ##>^     ##   ##     >v## vv#
#^^ ##^<       ###       v<## vv#
#^^  ##^      #####      v##  vv#
#^^  ##^      #####      v##  vv#
#^^  ##^<      ###      v<##  vv#
#^^   ##^<<<<<<<<<<<<<<<<##   vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################

アニメーション(説明のため):

ここに画像の説明を入力してください

編集:疑わしいときは、ヘビは1ブロック離れた壁にジャンプするのではなく、角に続いて、既に置かれている壁に「左手を置いておく」必要があることに注意してください。

ここに画像の説明を入力してください

ジョナサン・アランがそれを育ててくれたことに感謝し、Draco18sは上記のスナップショットを説明してくれました。

その他の例

in:
####################
#               o# #  
#                ###
#                  #
#      ##          #
#                ###
####################

out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^   v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
#         o    #####  
#              #####
#                  #
#                 ##
####################

out:
####################
#         >>>>v#####
#             v#####
#             >>>>o#
#                 ##
####################
in:
################
#o             #
#   ########## #
# #          # #
# #          # #
# #          # #
# #  #       # #
# #          # #
# #          # #
# #          # #
# ############ #
#              #
################

out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^#    vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################

GIFの例では、パターンに入ったときに、空のスペースの他の部分を埋めるために戻らないのはなぜですか?左に曲がってから、左に曲がってから、左に曲がり、次に下に曲がってから曲がることができましたが、ヘビは代わりにまっすぐに曲がりました。目標は、できるだけ多くのスペースをヘビで埋めるか、「壁にぶつかったときに右に曲がり、右に2回曲がったら終わる」戦略だけに従うことですか?
マジックタコOct

2
@MagicOctopusUrnどの時点であいまいさがわかるかわかりません。しかし、あなたの質問に答えるための目標は、できるだけ多くのスペースを埋めることではありません。ただし、アルゴリズム(「ウォールフォロワー」)は「右に1回、または不可能な場合は2回」だけではありません。左に壁のないヘビが見つかった場合は、左に曲がる必要があります(「左を維持」壁に/手で」)
ニコラサップ

(申し訳ありませんが、アルゴリズムの要約を読み間違えました)
Nicola Sap

2
@ジョナ:正しい。単一の確定的なパスがあり、最適ではありません。@値インク:はい。@ jonathanallan私はあいまいさを見るのに苦労していますが、それは私だけかもしれません。私のバージョンの壁追従アルゴリズムは、左に障害物がなければ[最初に評価]、左に曲がる、または右に曲がって[次に評価]壁にぶつからない限り、方向を維持します。可能な場合、またはゲームオーバー。
ニコラサップ

1
GIFを分析して、最終状態がそうであった理由を理解する必要がありました。最終的な表示フレームからではなく、直前の状態からは明らかです:i.stack.imgur.com/kj67V.pngこれが人々の役に立つことを願っています。
Draco18s

回答:


8

94 68バイト

F²⊞υSW¬⁼§υ⁰§υ±¹⊞υS≔⪫υ¶θPθ…θ⌕θo≔⁰θW№KV «≧⁺⊖⌕E³§KV⁺θκ θ✳§rdluθ§>v<^θ»o

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

F²⊞υSW¬⁼§υ⁰§υ±¹⊞υS≔⪫υ¶θ

入力を文字列に丸lurみします。これは、あまり便利でない入力形式を使用することで回避できます。

Pθ…θ⌕θo

カーソルを動かさずに入力を印刷してから、oもう一度下まで印刷して、カーソルがその下にくるようにします。

≔⁰θ

現在の方向を初期化します。

W№KV «

ある方向に空きスペースが残っている間に繰り返します。

≧⁺⊖⌕E³§KV⁺θκ θ

ヘビが左に曲がることができるか、または右に曲がる必要があるかを計算します。コード≦⊖θW¬⁼§KVθ ≦⊕θは同じバイト数でこれに対しても機能しますが、それ0は正しいのではなくアップと見なされるため、残りのコードを調整する必要があります。

✳§rdluθ§>v<^θ

適切なボディキャラクターを適切な方向に出力します。

»o

頭を復元します。これはPo、代わりにループを通過するたびにカーソルを移動せずにヘッドを印刷するように書くこともできます(ただし、これにより、同じバイトカウントでループを暗黙的に閉じることができます)。


7

Pythonの2273の 253 242バイト

ArBoのおかげで-11バイト

g=input()
d=0
t=lambda g,k=1:'\n'.join(map(''.join,zip(*g.split('\n')[::k])[::-k]))
h='o '
while 1:
 l,r=t(g,-1),t(g)
 if h in l:g=l;d-=1
 elif h in g:g=g.replace(h,'>v<^'[d%4]+'o')
 elif h in r:g=r;d+=1
 else:break
exec-d%4*'g=t(g);'
print g

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

これは、文字列を検索することで機能し、迷路にある場合はに'o '置き換え'[>v<^]o'ます。

回転した迷路でも同じチェックが行われ、文字列がなくなったときに塗りつぶされた迷路が印刷されます。

この関数t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))は、グリッドを回転するために使用されます


3

ゼリー72 56バイト

œṣ€⁾o j€ṛị“v<^>”;”oʋ,
UZ$ṛ¡+ƭ€Ɱ3r5¤ç/€ḟ$Ḣß$ṛ¹?
,0ÇZU$ṛ¡/

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

入力を文字列のリストとして取得し、最後の蛇を含む文字列のリストを返す完全なプログラム。TIOのフッターは、改行で区切られた単一の文字列を目的の入力に変換し、最後に改行を復元します。これは単に便宜上のものです。

実装は非常に異なりますが、@ RodのPython 2の回答で使用されている方法に多少触発されたソリューションです。



3

T-SQL 2008クエリ、373 371 366バイト

優先リストがあり、常に左、まっすぐ、右にずるずるしています。その優先順位を、常に後ろ、左、まっすぐ、右にずるずるに変更しました。スリザリングバックは常にブロックされるため、優先順位は最初のスリザーを除いて同じです。スネークを最初に下げる(C = 4)ことにより、バックスリザーリング時にスリッピーにしようとします。この小さなスタントで2バイト節約できました。〜-〜-c%4に1を追加する必要がなかったからです。

読みやすくするために2つの改行を挿入しました

DECLARE @ varchar(8000)=
'################
#o             #
#   ########## #
# #          # #
# #          # #
# #          # #
# #  #       # #
# #          # #
# #          # #
# #          # #
# ############ #
#              #
################';

WITH s as(SELECT 0i,4c,@ m 
UNION ALL
SELECT~-i,x,stuff(stuff(m,~-a+x/3*2+(x-3)%2*s,1,'o')
,a,1,char(59+x+~x%2*11*~x))FROM(SELECT
charindex(' ',replicate(stuff(substring(m,~-a,3),2,1,substring(m,a+~s,1))+
substring(m,a-~s,1)+'~',2),-~-~c%4)%5x,*FROM(SELECT*,charindex('o',m)a,charindex('
',M)S FROM S)Q)L
WHERE x>0)SELECT top 1m FROM s
ORDER BY i
OPTION(MAXRECURSION 0)

これをオンラインで実行するには、若干の調整が必要でした。投稿されたバージョンはMS-SQLサーバー管理スタジオで実行されます。

MS-SQLサーバー管理スタジオで実行する前にCtrl-Tを押すと、結果がテキストとして表示されます。

オンラインで試す


2
私はこれがどのように機能するかを反転する考えは持っていませんが、機能することを確認できます。素晴らしい仕事!
BradC

@BradC確認と賛辞をありがとう。最近、SQLソリューションはあまり愛されていません。
t-clausen.dk

1

Python 3、343バイト

import sys
X=0,1,0,-1
F,*Y=*X,0
L=3
g=[*map(list,sys.stdin.read().split("\n"))]
e=enumerate
r,c=[[r,c]for r,R in e(g)for c,C in e(R)if"o"==C][0]
while 1:
	if" "==g[r+X[L]][c+Y[L]]:F,L=L,~-L%4
	elif" "<g[r+X[F]][c+Y[F]]:
		if" "<g[r-X[L]][c-Y[L]]:g[r][c]="o";break
		L,F=F,-~F%4
	g[r][c]=">v<^"[F];r,c=r+X[F],c+Y[F]
for r in g:print("".join(r))

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

ArBoのおかげで-11バイト
ジョナサンフレッチのおかげで-4バイト


あなたはゴルフの初期化をすることができXYそしてFへのX=0,1,0,-1;F,*Y=*X,0私は間違っていない場合。また、import*節約するよりも多くのバイトがかかります。
ArBo

@ArBoああ、私はそれがいくつかの笑を救っていると思った。また、それはかなり賢いです、ありがとう!
ハイパーニュートリノ

でバイトを節約できると思います*g,=map(...)。そして、sys.stdin.readlines()おそらく動作しますか?
アンドラスディーク

1
あるいは、単一行の入力を想定してを使用することで、おそらく数バイトを節約できますinput()
アンドラスディーク

1
if C=="o"〜> if"o"==Cif g[r+X[L]][c+Y[L]]==" "elif g[r+X[F]][c+Y[F]]>" "if g[r-X[L]][c-Y[L]]>" "それに応じて。
ジョナサンフレッチ

1

05AB1E54 52 バイト

[S¶¡øí3FDíø})J€»¼D¾èU¼.Δ.¼„o ©å}DÄiXqë®">^<v"¾è'o«.;

単一の複数行文字列としてのI / Oの両方。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

[                      # Start an infinite loop:
 S                     #  Split the multi-line string into a list of characters
                       #  (which will use the implicit input in the first iteration)
  ¶¡                   #  Then split by newlines
    øí                 #  Rotate the matrix once clockwise
      3F               #  Loop 3 times:
        D              #   Create a copy of the matrix
         íø            #   And rotate this copy once counterclockwise
       })              #  After the loop: wrap all four matrices into a list
 J                     #  Join each inner-most character-list to string-lines again
  €»                   #  And join each inner list of lines by newlines again
    ¼                  #  Increase variable `c` by 1 (variable `c` is 0 by default)
     D¾<è              #  Index the updated variable `c` in a copy of the list of matrices
                       #  (note that indexing wraps around in 05AB1E)
         U             #  Pop and store it in variable `X`
    ¼                  #  Then increase variable `c` again
                     #  Find the first multi-line string in the list which is truthy for:
                     #   Decrease variable `c` by 1 first
        o             #   Push string "o "
           ©           #   Store this string in variable `®` (without popping)
            å          #   Check if the current multi-line string contains this "o "
    }D                 #  Duplicate the result (results in -1 if none were truthy/found)
      Äi               #  If no result was found:
        X              #   Push variable `X`
         q             #   And stop the program, after which this multi-line string of
                       #   variable `X` is output implicitly as result
       ë               #  Else:
         ">^<v"¾è      #   Get the `c`'th character in string ">^<v"
                       #   (note that indexing wraps around in 05AB1E)
                 'o«  '#   Append a trailing "o" to this character
        ®           .; #   And replace the first variable `®` ("o ") in the 
                       #   multi-line string with this

0

Pyth、161バイト

J.zK[Z1Z_1)=Y+tKZVlJFTl@JNIq@@JNT\oA[NT;=N3=TZ#Iq@@J+G@KN+H@YNd=TN=N%tN4.?In@@J+G@KT+H@YTdIn@@J-G@KN-H@YNd XJGX@JGH\oB=NT=T%hT4)) XJGX@JGH@">v<^"TA(+G@KT+H@YT;jJ

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

HyperNeutrinoのPython 3ソリューションのポート。これで作業が完了したので、RodのPython 2ソリューションを代わりに移植すべきだったのではないかと考えていますが、すでにこれに時間をかけすぎています。

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