อัศวินเติมกริด


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 ด้านทุกด้านเสมอ

  • คุณอาจสันนิษฐานว่าตำแหน่งเริ่มต้นจะไม่อยู่ในกำแพง
  • คุณอาจสมมติว่ากริดจะไม่ใหญ่กว่า 1,000x1000
  • Builtins เป็นเรื่องปกติ
  • รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

ในทุกกรณีทดสอบ#หมายถึงผนังหมายถึงพื้นที่ว่างและ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

ฟังก์ชันที่รับอาร์เรย์ 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


คุณสามารถเพิ่มตัวอย่าง / ลิงค์ทดสอบได้หรือไม่
อย่างเป็นทางการเมื่อ

2

Python 3 , 394 387 381 356 352 347 319 313 154 139 ไบต์

  • 154 ไบต์หลังจากนับเฉพาะฟังก์ชั่นหลักและไม่ใช่ฟังก์ชั่นที่เกี่ยวข้องกับการจัดรูปแบบ I / O
  • บันทึกแล้ว 7 ไบต์: ขอบคุณ @Jacoblaw และ @ Mr.Xcoder: except:0
  • บันทึกแล้ว 28 ไบต์ !!!: ขอบคุณ @ovs: กำจัดสิ่งtry: exceptกีดขวางและสนามกอล์ฟอื่น ๆ
  • ขอบคุณ @Dave สำหรับโมดูลทดสอบที่สวยงาม
  • บันทึกแล้ว 6 ไบต์: g[(a,b)]เช่นเดียวกับg[a,b]
  • @ ไม่มีบันทึก 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
ฉันค่อนข้างมั่นใจว่าสิ่งนี้สามารถเล่นกอล์ฟได้อย่างมาก
Mr. 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!

มันต้องใช้สองอินพุต: แรกคือกริดอินพุตเป็นอาร์เรย์ของ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.