Rycerz wypełnij siatkę

15

Wypełnienie rycerza to wypełnienie powodziowe przy użyciu połączenia szachy rycerza. Konkretnie:

 1 1
1   1
  0
1   1
 1 1

(0 to punkt początkowy, 1s pokazuje połączone komórki)

Wyzwanie

Biorąc pod uwagę siatkę 2D przestrzeni i ścian oraz początkową lokalizację, wypełnij siatkę rycerzem. Najkrótszy kod wygrywa.

Zasady

  • Możesz pobierać dane wejściowe i generować dane wyjściowe w dowolnym formacie (obraz, ciąg, tablica, cokolwiek). Możesz wziąć początkową lokalizację jako część siatki wejściowej lub jako osobną współrzędną. Do celów tego objaśnienia zostanie użyty następujący format:

    ########    # = wall
    ########    x = initial location
    ## x  ##
    ##    ##
    ########
    ##    ##
    ########
    ########
    
  • Wyjście jest kopią siatki wejściowej z dodanym wynikiem wypełnienia rycerza

  • Wypełnienie nie może być w tym samym „kolorze” co przestrzeń lub ściany, ale może być takie samo jak początkowy znacznik lokalizacji. Na przykład biorąc pod uwagę powyższy obraz, poprawnym wyjściem byłoby:

    ########    # = wall
    ########    @ = fill (could also have been x)
    ## @ @##
    ## @ @##
    ########
    ##@ @ ##
    ########
    ########
    
  • Możesz założyć, że siatka wejściowa zawsze będzie zawierać ścianę 2-komórkową ze wszystkich stron

  • Możesz założyć, że początkowa lokalizacja nigdy nie będzie w ścianie
  • Możesz założyć, że siatka nigdy nie będzie większa niż 1000 x 1000
  • Wbudowane są w porządku
  • Najkrótszy kod (w bajtach) wygrywa

Przypadki testowe

We wszystkich przypadkach testowych #oznacza ścianę, oznacza pustą przestrzeń i xwskazuje początkową lokalizację wypełnienia. @oznacza wypełnienie wyjściowe.

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:

##############
##############
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@###@@@###
##@@@#@#@@@###
##@@@###@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##############
##############
Dave
źródło
Nieco spokrewniony.
Martin Ender

Odpowiedzi:

4

Oktawa, 73 bajty

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

Demo online!

* Niektóre zmiany zastosowane do uruchomienia w rextesterze.

Funkcja, która przyjmuje tablicę 2d 0 i 2 jako ścianę oraz tablicę 0 i 1 jako lokalizację początkową i generuje tablicę 0 i 1 i 2.

rahnema1
źródło
Wygląda dobrze, ale czy nie jest to konieczne, pkg load ...gdy jest uruchamiany poza środowiskiem testowym? Jeśli imdilate& de2bisą dostępne bez wyraźnego importu, to w porządku.
Dave
@Dave W poprzednich wersjach oktawy, w tym wersji zainstalowanej w tio, można było zainstalować pakiet, aby mógł się ładować automatycznie, ale teraz zauważyłem, że ta funkcja została usunięta z oktawy! zobacz to .
rahnema1
Słusznie. Tak długo, jak celujesz w wersję, która -autozostała wcześniej usunięta, nie ma problemu, i przypuszczam, że ta odpowiedź nie używa żadnych nowych funkcji.
Dave
3

JavaScript (ES6), 116 bajtów

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>

Na podstawie mojej odpowiedzi na Wykrywanie nieudanych zamków . Wypełnia za pomocą xs.

Neil
źródło
Czy możesz dodać testowy fragment / link?
officialaimm
2

Python 3 , 394 387 381 356 352 347 319 313 154 139 bajtów

  • 154 bajty po zliczeniu tylko funkcji podstawowej, a nie funkcji dotyczącej formatowania we / wy
  • zapisano 7 bajtów: dzięki @Jacoblaw i @ Mr.Xcoder: except:0
  • zapisano 28 bajtów !!!: Dzięki @ovs: pozbyłem się try: exceptbloku i kilku innych golfów
  • Dzięki @Dave za piękny moduł testowy.
  • zapisane 6 bajtów: g[(a,b)]jak tylkog[a,b]
  • @nore zapisał 15 bajtów !!! :
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

Wypróbuj online!

Officialaimm
źródło
1
możesz except:passzamiast tego zrobić ?
jacoblaw
1
Jestem całkiem pewien, że można to mocno
pograć w
2
@joboblaw jeszcze lepiej:except:0
Pan Xcoder
1
Oto nieco łatwiejsza do przetestowania wersja TiO: Wypróbuj online!
Dave
1

Mathematica, 117 bajtów

Zwykła historia: potężne wbudowane, ale długie nazwy…

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

Wypróbuj w piaskownicy Wolfram!

Wymaga dwóch danych wejściowych: najpierw jest siatka wejściowa jako tablica 0s (dla ścian) i 1s (dla spacji), a następnie pojedyncza liczba całkowita dla pozycji początkowej, znaleziona przez numerację siatki wzdłuż rzędów od góry do dołu, np.

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

Możesz wywołać funkcję jak HighlightGraph[...~Prepend~h]&[{{0,0,...,0}, {0,0,...,0}, ..., {0,0,...,0}}, 20].

KnightTourGraphFunkcji tworzy się wykres z wierzchołkami odpowiadającej pozycji w siatce i krawędzie odpowiadające ważnych ruchów Knight, potem podjąć Subgraphwierzchołków, które nie są ściany i znaleźć ConnectedComponentswierzchołka wyjściowego. Dane wyjściowe to wykres (pokazany obrócony o 90º w kierunku przeciwnym do ruchu wskazówek zegara) z nieściennymi wierzchołkami zaznaczonymi na czerwono, a wypełnione wierzchołki zaznaczonymi na żółto. Na przykład dla pierwszego przypadku testowego dane wyjściowe wyglądają następująco:

Dane wyjściowe dla przypadku testowego 1: wykres z zaznaczonymi niektórymi obszarami

Nie drzewo
źródło
To z pewnością wygląda na najtrudniejszy do przetestowania! Czy mógłbyś dodać przykład tego, jak wywołać go w piaskownicy, dla tych z nas, którzy nie dotykali Mathematiki od czasów uniwersyteckich? Moje próby f=... f[{0,...,0;0,...,0}, 19]i tym podobne zawiodły.
Dave
@Dave, możesz wywołać funkcję za pomocą 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](dla pierwszego przypadku testowego). Zredagowałem to w pytaniu - przepraszam, nie było na początek!
Nie drzewo,