Лицар-заповнити сітку


15

Лицарська заливка - це заливна заливка, що використовує зв’язок лицарської шахової фігури. Конкретно:

 1 1
1   1
  0
1   1
 1 1

(0 - початкова точка, 1s показують з'єднані комірки)

Виклик

Враховуючи 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

Інтернет-демонстрація!

* Деякі зміни, застосовані для запуску в рекстестері.

Функція, яка приймає 2d масив 0 & 2 як стінка та масив 0 & 1 як вихідне місце і виводить масив 0 & 1 & 2.


Виглядає добре, але хіба це не потрібно, pkg load ...якщо працювати поза тестовою рамкою? Якщо imdilate& de2biдоступні без явного імпорту, це добре.
Дейв

@Dave У попередніх версіях октави, включаючи версію, встановлену в tio, можна було встановити пакет, щоб він міг автоматично завантажуватися, але тепер я помітив, що ця функція видалена з октави! будь ласка, дивіться це .
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

Пітон 3 , 394 387 381 356 352 347 319 313 154 139 байт

  • 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
Я майже впевнений, що це може бути сильно гольф
містер Xcoder

2
@jacoblaw ще краще:except:0
Містер Xcoder


1
Ось трохи простіша для тестування версія TiO: Спробуйте в Інтернеті!
Дейв

1

Математика, 117 байт

Звичайна історія: потужні вбудовані, але довгі назви ...

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

Спробуйте це в пісочниці Wolfram!

Він займає два входи: спочатку - це вхідна сітка як масив 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](для першого тестового випадку). Я це відредагував у питанні - вибачте, що його не було для початку!
Не дерево
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.