ナイトフィルグリッド


15

ナイトフィルは、ナイトチェスの駒の接続性を使用したフラッドフィルです。具体的には:

 1 1
1   1
  0
1   1
 1 1

(0は初期点、1は接続されたセルを示します)

チャレンジ

スペースと壁の2Dグリッドと初期位置を指定して、グリッドでナイトフィルを実行します。最短のコードが優先されます。

ルール

  • 入力を受け取り、任意の形式(イメージ、文字列、配列など)で出力を生成できます。入力グリッドの一部として、または別の座標として初期位置を取得できます。この説明のために、次の形式が使用されます。

    ########    # = wall
    ########    x = initial location
    ## x  ##
    ##    ##
    ########
    ##    ##
    ########
    ########
    
  • 出力は、ナイトフィルの結果が追加された入力グリッドのコピーです

  • 塗りつぶしは、スペースや壁と同じ「色」であってはなりませんが、初期位置マーカーと同じにすることができます。たとえば、上の画像の場合、有効な出力は次のようになります。

    ########    # = wall
    ########    @ = fill (could also have been x)
    ## @ @##
    ## @ @##
    ########
    ##@ @ ##
    ########
    ########
    
  • 入力グリッドのすべての側面に2セルの壁が常に含まれると仮定できます。

  • あなたは最初の場所が壁の中に決していないと仮定するかもしれません
  • あなたは、グリッドが1000x1000より大きくなることは決してないと仮定するかもしれません
  • ビルトインは問題ありません
  • 最短コード(バイト単位)が勝ちます

テストケース

すべてのテストケースで#、壁を示し、空きスペースをx示し、塗りつぶしの初期位置を示します。@出力の塗りつぶしを示します。

Input 1:

########
########
## x  ##
##    ##
########
##    ##
########
########

Output 1:

########
########
## @ @##
## @ @##
########
##@ @ ##
########
########

Input 2:

############
############
## ##    x##
## ##     ##
#####     ##
##        ##
############
############

Output 2:

############
############
## ##@@@@@##
##@##@@@@@##
#####@@@@@##
## @@@@@@@##
############
############

Input 3:

####################
####################
##  ##            ##
##  ##            ##
##  ##  ########  ##
##  ##  ########  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ########  ##
##  ##  ########  ##
##  ##        ##  ##
##  ##       x##  ##
##  ############  ##
##  ############  ##
##                ##
##                ##
####################
####################

Output 3:

####################
####################
##@@##@@@@@@@@@@@@##
##@@##@@@@@@@@@@@@##
##@@##@@########@@##
##@@##@@########@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@########@@##
##@@##@@########@@##
##@@##@@@@@@@@##@@##
##@@##@@@@@@@@##@@##
##@@############@@##
##@@############@@##
##@@@@@@@@@@@@@@@@##
##@@@@@@@@@@@@@@@@##
####################
####################

Input 4:

################
################
##           ###
##     x     ###
##  #######  ###
##  #######  ###
##  ##   ##  ###
##  ##   ##  ###
##  ##   ##  ###
##  ########  ##
##  ########  ##
##        ##  ##
##        ##  ##
################
################

Output 4:

################
################
##   @   @   ###
## @   @   @ ###
##  #######  ###
##@ ####### @###
##  ##   ##  ###
## @##   ##@ ###
##  ##   ##  ###
##@ ########@ ##
##  ########  ##
## @   @  ## @##
##   @   @##  ##
################
################

Input 5:

##############
##############
##         ###
##         ###
##         ###
##   ###   ###
##   #x#   ###
##   ###   ###
##         ###
##         ###
##         ###
##############
##############

Output 5:

##############
##############
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@###@@@###
##@@@#@#@@@###
##@@@###@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##############
##############

回答:


4

オクターブ、73バイト

function a=F(s,a)do;b=a;until(a=~s&imdilate(a,de2bi(")0#0)"-31)))==b;a+=s

オンラインデモ!

* rextesterでの実行に適用されるいくつかの変更。

壁として0&2の2D配列、初期位置として0&1の配列を受け取り、0&1&2の配列を出力する関数。


良さそうに見えpkg load ...ますが、テストフレームワークの外部で実行する場合、この必要はありませんか?明示的なインポートなしでimdilatede2biを使用できる場合は、問題ありません。
デイブ

@Dave tioにインストールされたバージョンを含む、octaveの以前のバージョンでは、パッケージをインストールして自動的にロードすることができましたが、この機能はoctaveから削除されました。参照してくださいこれを
rahnema1

けっこうだ。-auto削除される前のバージョンをターゲットにしている限り、問題はありません。この答えは新しい機能を使用しないと思います。
デイブ

3

JavaScript(ES6)、116バイト

f=(s,l=s.search`
`,t=s.replace(eval(`/(x| )([^]{${l-2}}(....)?|[^]{${l+l}}(..)?)(?!\\1)[x ]/`),'x$2x'))=>s==t?s:f(t)

v=(s,l=s.search`
`)=>!/^(#+)\n\1\n[^]*x[^]*\n\1\n\1$/.test(s)|s.split`
`.some(s=>s.length-l|!/^##.+##$/.test(s))&&`Invalid Input`
textarea{font-family:monospace}
<textarea rows=11 cols=33 oninput=o.value=v(this.value)||f(this.value)></textarea><textarea rows=11 cols=33 id=o reaodnly></textarea>

失敗した城の検出に対する私の答えに基づいています。xs を使用して塗りつぶします。


テストスニペット/リンクを追加できますか?
officialaimm

2

Python 3394 387 381 356 352 347の319 313 154 139バイト

  • I / Oフォーマットに関する関数ではなく、コア関数のみをカウントした後の154バイト
  • 7バイト節約:@Jacoblawと@ Mr.Xcoderに感謝: except:0
  • 28バイト節約しました!!!:@ovsのおかげで:try: exceptブロックや他のいくつかのゴルフを取り除きました
  • 美しいテストモジュールを提供してくれた@Daveに感謝します。
  • 6バイト保存: g[(a,b)]ちょうどg[a,b]
  • @noreは15バイトを保存しました!!!
def x(g,a,b,m):
 if(a,b)in g and"!">g[a,b]or m:
  g[a,b]="@"
  for i in 1,2,-1,-2:
   for j in 3-abs(i),abs(i)-3:g=x(g,a+i,b+j,0)
 return g

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


1
except:pass代わりにできますか?
jacoblaw

1
私は、これは重くgolfedできることをかなり確信している
氏Xcoder

2
@jacoblawさらに良い:except:0
Xcoder氏


1
以下に、テストが簡単なTiOのバージョンを示します。オンラインで試してみてください!
デイブ

1

Mathematica、117バイト

通常のストーリー:強力なビルトインだが長い名前…

HighlightGraph[g,ConnectedComponents[h=Subgraph[g=KnightTourGraph@@Dimensions@#,Flatten@#~Position~1],#2]~Prepend~h]&

Wolframサンドボックスで試してみてください!

入力は2つあります:最初は0s(壁用)と1s(スペース用)の配列としての入力グリッド、次に開始位置の単一の整数です。上から下に行に沿ってグリッドに番号を付けることで見つけられます。

1  2  3  4  5
6  7  8  9  10
11 12 13 14 ...

のような関数を呼び出すことができますHighlightGraph[...~Prepend~h]&[{{0,0,...,0}, {0,0,...,0}, ..., {0,0,...,0}}, 20]

このKnightTourGraph関数は、グリッド内の位置に対応する頂点と有効なナイトの動きに対応するエッジを持つグラフを作成します。次にSubgraph、壁ではない頂点を取得しConnectedComponents、開始頂点を見つけます。出力はグラフで(反時計回りに90度回転して表示)、壁以外の頂点が赤で強調表示され、塗りつぶされた頂点が黄色で強調表示されます。たとえば、最初のテストケースの場合、出力は次のようになります。

テストケース1の出力:一部の領域が強調表示されたグラフ


まあ、これは確かにテストするのが最も難しいように見えます!大学時代からMathematicaに触れていない私たちのために、サンドボックスでそれを呼び出す方法の例を追加してもらえますか?私の試みf=... f[{0,...,0;0,...,0}, 19]と同様のものは惨めに失敗しました。
デイブ

@Dave、HighlightGraph[g,ConnectedComponents[h=Subgraph[g=KnightTourGraph@@Dimensions@#,Flatten@#~Position~1],#2]~Prepend~h]&[{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,1,1,1,1,0,0},{0,0,1,1,1,1,0,0},{0,0,0,0,0,0,0,0},{0,0,1,1,1,1,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}},20](最初のテストケースの場合)で関数を呼び出すことができます。私はそれを質問に編集しました-申し訳ありませんが、そもそもそこにはありませんでした!
木ではない
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.