เติมเขาวงกตด้วยงูที่ตามมาจนกระทั่งกำแพงติด


21

ทำให้งูเต็มเขาวงกตใด ๆ (จนกว่าจะได้รับการติด)

งู

งูเริ่มต้นที่จุดที่กำหนดเริ่มต้นชี้EAST มันเคลื่อนที่โดยมีกำแพงหรือส่วนใดส่วนหนึ่งของร่างกายไปที่หัวซ้ายทันที(" ผู้ติดตามผนังกฎซ้ายมือ) ") จนกระทั่งมันติดอยู่เพราะทั้งสี่ทิศทางรอบหัวของมันถูกยึดครอง (หมายเหตุ: งูที่ติดอยู่อาจไม่สามารถเติมเต็มทุกพื้นที่ที่เข้าถึงได้ แต่นั่นไม่ใช่เป้าหมาย!)

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับเขาวงกตเป็นอินพุตในรูปแบบของข้อความ 2D:

  • อินพุตสามารถอยู่ในรูปแบบที่สมเหตุสมผล: เช่นรายการสตริงสตริงเดี่ยวที่มีบรรทัดใหม่ไฟล์
  • เขาวงกตมีผนัง (" #") พื้นที่ว่าง (" ") และจุดเริ่มต้นหนึ่งจุด (" o")
  • คุณสามารถเลือกที่จะ

    • อาจสมมติว่าแถวแรกและแถวสุดท้ายและคอลัมน์เป็นผนังทั้งหมด
    • หรือสมมติว่าทุกอินพุตถือว่ามีผนังชั้นนอกโดยปริยาย
  • คุณสามารถสันนิษฐานได้ว่าจุดเริ่มต้นมีกำแพง (หรือผนังโดยปริยาย) ที่อยู่เหนือมันโดยตรง (NORTH) และงูสามารถเคลื่อนที่เริ่มต้นที่ถูกต้องในทิศทาง EAST หรือ SOUTH

  • คุณสามารถสันนิษฐานได้ว่าไม่มีตัวอักษรอื่น ๆ อยู่ในข้อความ (ยกเว้นการขึ้นบรรทัดใหม่หากข้อมูลของคุณต้องการ)
  • คุณสามารถสันนิษฐานได้ว่าทุกบรรทัดมีความยาวเท่ากัน

และพิมพ์ / ส่งคืน "เขาวงกตที่เต็มไป" เป็นเอาต์พุตด้วยสแนปชอตของงูในขณะที่มันติดอยู่ :

  • ร่างกายของงูนั้นมีตัวละครที่>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 ช่วงตึก

ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณ Jonathan Allan ที่นำมันขึ้นมาและ 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 เมื่อมันเข้าสู่รูปแบบเหตุใดจึงไม่เปลี่ยนกลับไปเติมในส่วนอื่น ๆ ของช่องว่างเปล่า มันเป็นไปได้แน่นอนที่จะเลี้ยวซ้ายจากนั้นขึ้นแล้วจากนั้นกลับลงมาแล้วย้อนกลับไปรอบ ๆ แต่งูเลือกตรงลง เป็นเป้าหมายที่จะเติมเต็มช่องว่างให้มากที่สุดเท่าที่เป็นไปได้กับงูหรือทำตาม "เลี้ยวขวาเมื่อพบกับกำแพงและสิ้นสุดถ้าเลี้ยวขวาสองครั้ง"?
Magic Octopus Urn

2
@ MagicOctopusUrn ฉันไม่แน่ใจว่าฉันเข้าใจในสิ่งที่จุดที่คุณเห็นความคลุมเครือ แต่เพื่อตอบคำถามของคุณเป้าหมายไม่ได้เติมช่องว่างให้มากที่สุด อย่างไรก็ตามอัลกอริทึม ("ผู้ติดตามผนัง") ไม่ใช่แค่ "เลี้ยวขวาหนึ่งครั้งหรือหากไม่สามารถทำได้สองครั้ง": หากงูพบว่าตัวเองไม่มีกำแพงทางด้านซ้ายมันจะต้องเลี้ยวซ้ายแทน (รักษา "ซ้ายไว้" มือ "บนกำแพง / บนตัวของมันเอง)
Nicola Sap

(ขออภัยฉันเข้าใจผิดอัลกอริทึมของคุณ)
Nicola Sap

2
@ jonah: ถูกต้อง มีเส้นทางที่กำหนดได้เพียงทางเดียวและไม่เหมาะสม @ value ink: ใช่ @ jonathanallan ฉันต่อสู้เพื่อดูความคลุมเครือ แต่อาจเป็นเพียงฉัน อัลกอรึทึมการติดตามผนังรุ่นของฉันคือ: รักษาทิศทางของคุณจนกว่าคุณจะไม่มีสิ่งกีดขวางทางซ้ายของคุณอีกต่อไป [ประเมินก่อน] ซึ่งในกรณีนี้เลี้ยวซ้ายหรือคุณชนกำแพง [ประเมินสอง] ซึ่งกรณีเลี้ยวขวา ถ้าเป็นไปได้หรือเล่นเกมมากกว่า
Nicola Sap

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≔⪫υ¶θ

Slurp อินพุตเป็นสตริง สิ่งนี้สามารถหลีกเลี่ยงได้โดยใช้รูปแบบอินพุตที่สะดวกน้อยกว่า

Pθ…θ⌕θo

พิมพ์อินพุตโดยไม่เลื่อนเคอร์เซอร์จากนั้นพิมพ์oใหม่อีกครั้งเพื่อให้เคอร์เซอร์อยู่ด้านล่าง

≔⁰θ

เริ่มต้นทิศทางปัจจุบัน

W№KV «

ทำซ้ำในขณะที่ยังมีพื้นที่ว่างในบางทิศทาง

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

คำนวณว่างูสามารถเลี้ยวซ้ายหรือว่าถูกบังคับให้เลี้ยวขวา รหัส≦⊖θW¬⁼§KVθ ≦⊕θยังใช้งานได้กับการนับจำนวนไบต์เดียวกันแม้ว่ามันจะพิจารณา0ว่าเป็นแทนขวาดังนั้นส่วนที่เหลือของรหัสจะต้องปรับเปลี่ยน

✳§rdluθ§>v<^θ

เอาท์พุทตัวละครที่เหมาะสมในทิศทางที่เหมาะสม

»o

ฟื้นฟูส่วนหัว สิ่งนี้สามารถเขียนได้เหมือนPoที่พิมพ์หัวโดยไม่ต้องเลื่อนเคอร์เซอร์แต่ละครั้งที่ผ่านการวนรอบแทน (แต่การทำเช่นนี้จะทำให้การปิดลูปโดยปริยายสำหรับจำนวนไบต์เดียวกัน)


7

Python 2 , 273 253 242 ไบต์

-11 ไบต์ขอบคุณ ArBo

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 จะแปลงสตริงขึ้นบรรทัดใหม่หนึ่งบรรทัดให้เป็นอินพุตที่ต้องการและเรียกคืนบรรทัดใหม่ในตอนท้าย นี่เป็นเพียงเพื่อความสะดวก

โซลูชันค่อนข้างได้แรงบันดาลใจจากวิธีที่ใช้โดยคำตอบ Python 2 ของ @ Rodถึงแม้ว่าการใช้งานจะแตกต่างกันมาก


3

Ruby , 126 118 ไบต์

-8 ไบต์บันทึกไว้โดยการใช้งานที่ไม่เหมาะสม+=แทนที่จะค้นหาด้วยตนเองoอีกครั้งหลังจากเปลี่ยนตำแหน่งแล้ว

->s{d=[q=1,1+l=s=~/$/,-1,~l];i=s=~/o/;(s[i]=">v<^"[q];s[i+=d[q]]=?o)while q=[~-q%4,q,-~q%4].find{|e|s[i+d[e]]==' '};s}

ลองออนไลน์!


3

แบบสอบถาม T-SQL 2008, 373 371 366 ไบต์

ฉันมีรายการลำดับความสำคัญเลื่อนซ้ายเสมอตรงขวา ฉันเปลี่ยนลำดับความสำคัญนั้นเป็นเลื่อนไปทางซ้ายซ้ายตรงขวาเสมอ Slithering back จะถูกบล็อกเสมอดังนั้นลำดับความสำคัญยังคงเหมือนเดิมยกเว้น slither แรก โดยการลดงูลงในขั้นต้น (C = 4) มันจะพยายามเลื้อยขึ้นเมื่อ backslithering การแสดงความสามารถเล็ก ๆ นี้ช่วยฉัน 2 ไบต์ เพราะฉันไม่ต้องการเพิ่ม 1 ถึง ~ - ~ -c% 4

ฉันแทรกตัวแบ่ง 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

กด Ctrl-T ก่อนดำเนินการในสตูดิโอจัดการเซิร์ฟเวอร์ MS-SQL ซึ่งจะแสดงผลลัพธ์เป็นข้อความ

ลองออนไลน์


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))

ลองออนไลน์!

-11 ไบต์ขอบคุณ ArBo
-4 ไบต์ขอบคุณ Jonathan Frech


คุณสามารถกอล์ฟ initialisation ของX, YและFไปX=0,1,0,-1;F,*Y=*X,0ถ้าฉันไม่ผิด นอกจากนี้ยังมีimport*ค่าใช้จ่ายที่คุณไบต์มากกว่าที่จะช่วยประหยัด
ArBo

@ArBo โอ้ฉันคิดว่ามันประหยัดฮ่า ๆ ยังเป็นสิ่งที่ค่อนข้างฉลาดขอบคุณ!
HyperNeutrino

*g,=map(...)ฉันคิดว่าคุณสามารถบันทึกไบต์ด้วย และsys.stdin.readlines()อาจจะทำงานได้อย่างไร
Andras Deak

1
input()หรือคุณอาจจะสามารถบันทึกไม่กี่ไบต์โดยสมมติให้มีการป้อนข้อมูลบรรทัดเดียวและการใช้
Andras Deak

1
if C=="o"~> if"o"==C, if g[r+X[L]][c+Y[L]]==" ", elif g[r+X[F]][c+Y[F]]>" ", if g[r-X[L]][c-Y[L]]>" "ตาม
Jonathan Frech

1

05AB1E , 54 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

ลองออนไลน์!

พอร์ตของการแก้ปัญหาหลาม 3 HyperNeutrino ของ ตอนนี้ฉันทำไปแล้วฉันคิดว่าบางทีฉันควรจะแก้ปัญหา Python 2 ของ Rod แทน แต่ฉันใช้เวลาไปกับเรื่องนี้มากเกินไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.