Patch ฟักทองแบบสุ่ม


12

ฉันกำลังเดินผ่านแพทช์ฟักทองในวันอื่น ๆ สำหรับงานเลี้ยงวันเกิดและสังเกตเห็นเถาวัลย์ฟักทองทำรูปแบบที่ดีพร้อมกับวน, วน, และหน่อ เรากำลังจะจำลองสิ่งนี้ด้วยศิลปะ ASCII บางส่วน

          (())
            \
   p--q      p-----q
  /    \    /       \
(())    b--d       (())

กฎการก่อสร้างเถา

  • มีเถาวัลย์หลักเพียงอันเดียวเท่านั้นซึ่งประกอบด้วย\ / - p q b dตัวละครเพียงอย่างเดียว
  • เถาวัลย์เดินทางจากซ้ายไปขวาผ่านหน้าจอเท่านั้น กล่าวอีกนัยหนึ่งสมมติว่าคุณเป็นมดเริ่มต้นที่ตัวอักษรเถาซ้ายสุด ในขณะที่คุณไปยังตัวละครถัดไปที่อยู่ติดกันบนเถาวัลย์หลักคุณจะต้องย้ายหนึ่งคอลัมน์ไปทางขวา - ไม่ไปทางซ้าย
  • เมื่อเถาวัลย์เปลี่ยนทิศทางp q b dต้องใช้อักขระตัวใดตัวหนึ่งในการจำลองลูป pร่วมเถาเดินทางไปทางทิศตะวันออกเฉียงเหนือที่qสำหรับไปทางทิศตะวันออกเฉียงใต้bจากทิศตะวันออกไปทางทิศตะวันออกและdจากตะวันออกไปภาคตะวันออกเฉียงเหนือ โปรดทราบว่า "ห่วง" ของจดหมายเชื่อมต่อกับเถาแนวนอนและ "ลำต้น" ของจดหมายเชื่อมต่อกับเส้นทแยงมุม
  • จุดเริ่มต้นของเถาต้องเป็นหนึ่งในpหรือb(ตัวเลือกของคุณไม่จำเป็นต้องสุ่ม) และเริ่มต้นในแนวนอน จุดจบของเถาต้องเป็นหนึ่งqหรือd(ตัวเลือกของคุณไม่จำเป็นต้องสุ่ม) และต้องจบในแนวนอน
  • โปรดทราบว่าสามารถวางลูปได้ทันทีติดกับลูปอื่น ๆ (เช่นpdเป็นซับสตริงที่ถูกต้องของเถาวัลย์) แต่นั่นอาจทำให้ยากต่อการวางฟักทองในภายหลัง คุณอาจต้องการมีหนึ่งใน- / \ทันทีหลังจากวนรอบ (ตามที่ฉันทำในตัวอย่างของฉัน) แต่ก็ไม่จำเป็น

กฎฟักทอง

  • ฟักทองประกอบด้วย แต่เพียงผู้เดียวของ(())(สตริงที่แน่นอนนี้)
  • จากเถาวัลย์หลักฟักทองมีหน่อหน่อ หน่อเหล่านี้สามารถยึดติดกับp q b dลูปได้อย่างเดียว\หรือ/ยาวและแนบกับฟักทองดังนั้น "ปลาย" ของหน่อที่อยู่ตรงกลาง
  • พวกเขาสามารถเชื่อมต่อด้านบนหรือด้านล่างเถาหลัก
  • หน่อที่สามารถเชื่อมต่อไปที่ "ซ้าย"
  • ฟักทองหนึ่งอันสามารถแนบเอาไว้ที่หน่อแต่ละอันและหน่อหนึ่งอันต่อห่วงเท่านั้น

randomness

  • เมื่อเดินทางในแนวนอนเถามีโอกาส 50% ในการดำเนินการต่อในแนวนอนมีโอกาส 25% ที่จะเลี้ยวไปทางทิศตะวันออกเฉียงเหนือและมีโอกาส 25% ในการเลี้ยวไปทางตะวันออกเฉียงใต้
  • เมื่อเดินทางในแนวทแยงมุมเถาวัลย์มีโอกาส 90% ที่จะหมุนในแนวนอนและมีโอกาส 10% ที่จะหมุนแนวทแยงมุมต่อไป
  • จะต้องมีการเลี้ยวที่เพียงพอเพื่อรองรับจำนวนอินพุตของฟักทองแม้ว่าจะอนุญาตได้มากขึ้น
  • เมื่อสร้างเถาวัลย์ฟักทองสามารถวางแบบสุ่มที่มุมใด ๆ ที่ไม่ได้ครอบครองโดยฟักทอง
  • ฟักทองไม่สามารถทับซ้อนเถาหรือฟักทองอื่น ๆ

ความท้าทาย

รับหมายเลขอินพุตส่งเอาต์พุตแพตช์ฟักทองแบบสุ่มโดยปฏิบัติตามกฎข้างต้น การรันโค้ดหลายครั้งด้วยอินพุตเดียวกันควรให้ผลลัพธ์ที่ต่างกัน แพทช์ฟักทองที่เป็นไปได้ทั้งหมดสำหรับหมายเลขอินพุตที่กำหนดควรมีโอกาส (ไม่จำเป็นต้องเท่ากัน) ที่ไม่เป็นศูนย์ซึ่งเกิดขึ้น

อินพุต

จำนวนเต็มเดียวnแทนจำนวนฟักทองในแพทช์ในรูปแบบที่สะดวกใด0 < n < 256เพื่อความกระชับของรหัสที่คุณสามารถสันนิษฐานได้เข้าเป็น

เอาท์พุต

แพทช์ฟักทองที่เกิดขึ้นพิมพ์ / แสดงไปที่หน้าจอหรือส่งคืนเป็นสตริง / string-array / etc

กฎระเบียบ

  • นี่คือเพื่อให้ใช้กฎตามปกติสำหรับการเล่นกอล์ฟและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ
  • ใช้คำจำกัดความมาตรฐานของ "สุ่ม"
  • ยอมรับทั้งโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • ช่องว่างชั้นนำและต่อท้าย / ขึ้นบรรทัดใหม่เป็นทางเลือกที่สมบูรณ์แบบ

ตัวอย่าง

สำหรับการป้อนข้อมูลn = 3ต่อไปนี้เป็นตัวอย่างที่ถูกต้องของแพทช์ฟักทองตามกฎข้างต้น (คั่นด้วยบรรทัดว่างใหม่)

          (())
            \
   p--q      p-----q
  /    \    /       \
(())    b--d       (())

(()) (())
  \   /
   b-q (())
      \ /
       b-q

p-----------------------q (())
                       / \ /
                     (()) b-q
                           /
                         (())

นี่คือตัวอย่างบางส่วนไม่ถูกต้องสำหรับการป้อนข้อมูลพร้อมคำอธิบายn = 3#

    (()) (())
     /    /
p---q----q
 \
(())
# The vine continued horizontally after a loop was placed.

(()(())
  \ /
   p---q
        \
       (())
# The pumpkins are both overlapping and sprouting from the same loop.

p----------------q
 \      \         \
(())   (())      (())
# The pumpkin is attached to the middle of the vine, not at a loop.

7
และตอนนี้ออกแบบภาษา 2D โดยใช้สิ่งนี้เป็นไวยากรณ์ :)
Martin Ender

คำตอบ:


1

Python 2, 819 ไบต์

ใช้nเป็นอินพุต

วาง pumkpins ไว้ที่ 'นอก' ของมุมเสมอ (ซ้าย / ขวาแบบสุ่ม)

ขณะที่สร้างเถาวัลย์จะมีการเติมฟักทองและเมื่อมีฟักทองมากพอเถาก็จะหยุด

r=lambda:__import__('random').random()
s=1
v=[s]*4
U=[-9]
D=[-9]
i=input()
while len(U)+len(D)<i+2:s=[[0,1][r()<.9],[[0,2][r()<.5],1][r()<.5],[2,1][r()<.9]][s];exec['',[['','U+=[len(v)]'][U[-1]<len(v)-7],'',['','D+=[len(v)]'][D[-1]<len(v)-7]][v[-1]-s+1]][r()<.8];v+=[s]*[1,2][v[-1]!=s]
v+=[1]*5
m=M=s=0
for i in v:s+=i-1;m=[m,s][m>s];M=[M,s][M<s]
R=[[' ']*(M-m+5)for x in v]
m=-m+2
R[2][m]='p'
for x in range(3,len(v)-3):X=v[x-1];R[x][m]='/d p-b q\\'[v[x]*3+X];m+=v[x]-1
R[-3][m]='q'
M=[len(a)-len(a.lstrip())for a in map(''.join,R)]
R=map(list,zip(*R))
B,L,a='-/U'
K="\\"*4
W="""exec("for p in "+a+"[1:]:x=M[p];b=r()<.5;exec('R[x"+B+"1][p'+['+1]=\\""+L+"\\"','-1]=\\""+K+"\\"'][b]);i=p-[0,3][b];l='(';exec('R[x"+B+"2][i]=l;i+=1;'*2+'l=\\")\\";')*2")"""
exec W+";B,a='+D';L,K=K,L;"+W
for x in R:print''.join(map(str,x))

ตัวอย่าง:

n=4

                (())   
                 /     
                p---q  
 (())          /       
   \       p--d        
  p-q     /    \       
     \   /    (())     
      b-d              
       \               
      (())             

n=20

                            (())                                                                                             
                              \                                                                                              
                            p--q                                                                                             
                           /    \                                                                                            
                          /      b--q                                                                                        
           (())     p----d      /    \                                                                                       
  (())       \     /          (())    b-q (())                                                                               
    \         p---d                      \  \                                                                                
  p--q       /     \                      b--q                                                                               
      \     /     (())                   /    \                        (())                                           (())   
       b---d                           (())    b-q                       \                                             /     
        \                                         \          (())         p-q                                         p---q  
       (())                                        \           \         /   \                                       /       
                                                    b-----------q     p-d     b-q                            (())p--d        
                                                                 \   /       /   \                            / /    \       
                                                                  b-d      (())   b-q   (())  (())   p-q     p-d    (())     
                                                                   /                 \   /      \   /   \   /                
                                                                 (())                 b-q        p-d     b-d                 
                                                                                       \ \      /         \                  
                                                                                      (())b----d         (())                
                                                                                              /                              
                                                                                            (())                             

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