नलसाजी यादृच्छिक पथ


23

एक प्रोग्राम या फ़ंक्शन लिखें जो तीन पूर्णांक, एक चौड़ाई w, एक ऊँचाई hऔर एक कदम गणना में लेता है s। आप पिक्सेल छवि द्वारा लंबे समय तक एक गैर-आत्म-अंतःक्षिप्त यादृच्छिक चलना s चरण खींचेंगे, जहां प्रत्येक 5 से 5 पिक्सेल सेल या तो खाली (शुद्ध बेज) या इन बारह सरल "पाइप" में से एक है:5*w5*h

बढ़े हुए पाइप

ऊपर की छवि विस्तार दिखाने के लिए बढ़ाई गई है। यहां वास्तविक आकार में पाइप हैं:

पाइप

(पाइप लाइनों को अलग करने के लिए ग्रे लाइनें हैं।)

यादृच्छिक चलना एक एकल निरंतर पाइप पथ होगा जो एक पाइप एंडपॉइंट (नीचे चार पाइप प्रकारों में से एक) से शुरू होता है और दूसरे पाइप पाइप बिंदु पर समाप्त होता है।

ग्रिड wद्वारा खाली के साथ शुरू करें hऔर बेतरतीब ढंग से शुरुआती बिंदु होने के लिए एक सेल चुनें। फिर बेतरतीब ढंग से शुरू करने के लिए चार दिशाओं में से एक को चुनें और संबंधित पाइप एंडपॉइंट को ड्रा करें। यह प्रारंभिक सेल आपके चलने में पहला चरण चिह्नित करता है और हर बार जब आप एक नया सेल बनाते हैं या किसी मौजूदा को अधिलेखित करते हैं तो यह एक और कदम के रूप में गिना जाता है।

अब, बार-बार, बेतरतीब ढंग से दाएं, बाएं, या सीधे जाने के लिए चुनें, उपयुक्त पाइप सेल को ड्राइंग करें यदि चुना गया दिशा वैध है। यदि एक दिशा पूर्ण sचरण पथ के बनने तक मान्य नहीं है, तो Backtrack और फिर से चुनें । पथ को पाइप एंडपॉइंट के साथ समाप्त होना चाहिए, जो ग्रिड पर कहीं भी हो सकता है, इस पथ के आधार पर।

यह ध्यान रखना बहुत महत्वपूर्ण है कि केवल दो सीधे पाइप कोशिकाओं को ओवरराइट किया जा सकता है, और केवल विपरीत अभिविन्यास के सीधे पाइप सेल द्वारा, परिणाम एक चौराहे सेल हो सकता है। अन्यथा, सभी पाइपों को खाली कोशिकाओं में रखा जाना चाहिए।

जब एक चौराहे को खींचा जाता है, तो पथ का वह हिस्सा जो शुरुआती सेल से आगे होता है, शीर्ष पर खींचा जाना चाहिए।

यह आपके ऊपर है कि ग्रिड की आवधिक सीमा की स्थिति है या नहीं (पीबीसी), यानी कि ग्रिड के एक तरफ से निकलने वाला पाइप दूसरी तरफ निकलेगा या नहीं। पीबीसी के बिना ग्रिड की सीमा एक बाधा के रूप में गिना जाता है जिसे आप अन्य पाइपों की तरह चला सकते हैं।

विशेष स्थितियां

  • जब s0 है तो कोई पाइप नहीं खींचा जाना चाहिए और आउटपुट छवि 5*wद्वारा रिक्त होना चाहिए 5*h(अर्थात सभी बेज)।
  • जब s1 एक एकल पाइप ठूंठ हो

    बढ़े हुए पाइप ठूंठ(वास्तविक आकार: पाइप का ठूंठ)

    बेतरतीब ढंग से चुनी गई शुरुआती सेल में तैयार किया जाना चाहिए।

अन्य जानकारी

  • आप मान सकते हैं कि sऐसा सबसे कम है, w*hइसलिए हमेशा एक रास्ता संभव होगा। (हालांकि चौराहों के कारण लंबे रास्ते संभव हैं।)
  • wऔर hहमेशा सकारात्मक रहेंगे।
  • सभी यादृच्छिक विकल्प समान रूप से यादृच्छिक होना चाहिए । उदाहरण के लिए, जब आप समस्या को आसान बनाते हैं, तब भी जब आपको संभव हो तो चौराहों को बनाने से बचना चाहिए। छद्म यादृच्छिक संख्या जनरेटर की अनुमति है।
  • किसी भी तीन अलग-अलग रंगों का उपयोग काले, नीले और बेज रंग के स्थान पर किया जा सकता है।
  • आपकी आउटपुट छवियां बढ़ाई जा सकती हैं ताकि वे वास्तव 5*w*kमें 5*h*kपिक्सेल द्वारा हों जहां kएक सकारात्मक पूर्णांक हो। (आपके द्वारा पोस्ट किए गए किसी भी उदाहरण को बढ़ाने की सलाह दी जाती है भले ही आपकी k1.)
  • किसी भी सामान्य दोषरहित छवि फ़ाइल प्रारूप का उपयोग किया जा सकता है और छवि को एक फ़ाइल में सहेजा जा सकता है, प्रदर्शित किया जा सकता है, या स्टडआउट करने के लिए कच्चे को उखाड़ा जा सकता है।

बाइट्स में सबसे छोटा कोड जीतता है।

उदाहरण

(सभी बढ़े हुए 500%)

यदि इनपुट है w=2, h=1, s=0तो आउटपुट हमेशा रहेगा:

यदि इनपुट है w=2, h=1, s=1तो आउटपुट समान अवसर के साथ इन चित्रों में से एक होगा:

यदि इनपुट है w=2, h=1, s=2तो आउटपुट होगा

या संभवतः

यदि ग्रिड को PBC माना जाता है।

(ध्यान दें कि रास्ता शुरू करने से दूसरा कदम असंभव हो जाएगा।)


w=3, h=2, s=6PBC के लिए यहाँ कुछ संभावित आउटपुट दिए गए हैं :


w=3, h=3, s=9PBC को संभालने के लिए यहाँ एक संभावित आउटपुट है :

ध्यान दें कि चौराहे को दो चरणों के रूप में गिनने के कारण पथ को सभी कक्षों को कवर करने की आवश्यकता नहीं थी। इसके अलावा, हम यह अनुमान लगा सकते हैं कि चौराहे के ओवरपास को बाद में खींचा गया है, क्योंकि कॉर्नर एंडपॉइंट शुरुआती सेल था। इस प्रकार हम यादृच्छिक विकल्पों के अनुक्रम का अनुमान लगा सकते हैं जो किए गए थे:

start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end

अंत में, यहाँ के उदाहरण हैं w=4, h=5, s=20और w=4, h=5, s=16:


1
पूरा विचार सिर्फ एक यादृच्छिक चलना है, है ना?
अक्काका

पंक्ति 2: You will be drawing a non-self-intersecting random walk... यह आत्म-प्रतिच्छेद है या नहीं?
edc65

@ChristianIrwan वास्तव में ठीक नहीं है। रैंडम वॉक आमतौर पर अपने आप को डबल बैक कर सकता है, या खुद को बिल्कुल भी इंटरसेक्ट नहीं कर सकता। यह एक अनूठा मामला है क्योंकि चौराहों को बनाया जाता है, लेकिन वे एक ही मैदान को फिर से तैयार करने के रूप में नहीं गिनते हैं। और हाँ यह एक आस्की-कला प्रारूप या कुछ और हो सकता है लेकिन मुझे अच्छी दिखने वाली छवियां बनाने का विचार पसंद है।
केल्विन के

2
@ChristianIrwan मैंने पहले ही उत्तर दिया था कि जब मैंने कहा था "और हाँ यह आस्की-कला प्रारूप या कुछ और हो सकता है लेकिन मुझे अच्छी दिखने वाली छवियां बनाने का विचार पसंद है।" मैं एससीआई-कला को शामिल नहीं करने का चयन करता हूं।
केल्विन के शौक

1
क्या "समुद्री मील" की अनुमति है?
10:27 पर एड

जवाबों:


4

सीजेम, 274

q~:K;:B;:A;{0aA*aB*:M5*5f*:I;K{[Bmr:QAmr:P]5f*:R;3Ym*{R.+:)2{1$0=I=2$W=@tI@0=@t:I;}:F~}/R2f+1FK({MQ=P=:EY4mr:D#&1{{MQMQ=PE2D#+tt:M;}:G~7,1>[W0_1_0_W]2/D=:Off*{[QP]5f*2f+.+_:H1F_OW%.+2FOW%.m2F}/H2FO~P+:P;Q+:Q;MQ=P=:E_5YD2%-*=!JK2-=+*1{D2+4%:D;G}?}?}fJ]}0?}g'P2NA5*SI,N2NI:+N*

इसे ऑनलाइन आज़माएं

पीबीसी का उपयोग करता है, पीजीएम प्रारूप में आउटपुट। आप :+ब्राउज़र में एक अच्छे दृश्य आउटपुट प्राप्त करने के लिए अंत के पास निकाल सकते हैं ।

यह बड़े इनपुट के लिए बहुत धीमा है, खासकर यदि चरण गणना क्षेत्र के करीब है।

इनपुट के लिए उदाहरण परिणाम 4 3 10(बढ़ा हुआ 500%):

उदाहरण

संक्षिप्त विवरण:

सामान्य दृष्टिकोण है:

  • सफल होने तक निम्नलिखित सभी चरणों को दोहराएं:
  • 2 मैट्रिसेस को इनिशियलाइज़ करें: एक रिकॉर्डिंग जो प्रत्येक सेल में साइड इस्तमाल की जा रही है, और एक इमेज के लिए
  • अगर s = 0, हम कर रहे हैं, और:
  • एक यादृच्छिक सेल चुनें और एक वर्ग बनाएं, फिर निम्नलिखित s-1 बार करें:
  • एक यादृच्छिक दिशा चुनें; यदि वह पक्ष पहले से ही उपयोग किया जाता है, तो विफल हो जाता है और शुरू हो जाता है
  • उपयोग के रूप में साइड को चिह्नित करें और छवि में वास्तविक पाइप खींचें (लंबाई 6 के 3 आसन्न रेखाएं खींचना, सही शुरू करना "चालू सेल के केंद्र पिक्सेल" के बाद, फिर पाइप के अंत में एक डॉट जोड़ना)
  • वर्तमान स्थिति को अपडेट करें (अगले सेल पर जाएं)
  • जांचें कि क्या सेल खाली है या यह एक वैध क्रॉसिंग है; यदि नहीं, तो असफल हो जाओ और शुरू करो
  • इस सेल में प्रयुक्त विपरीत दिशा में साइड को चिह्नित करें, फिर लूप जारी रखें

1

QBasic, 517 516 बाइट्स

RANDOMIZE TIMER
SCREEN 9
INPUT w,h,s
1CLS
IF s=0GOTO 9
x=5*INT(RND*w)
y=5*INT(RND*h)
GOSUB 7
FOR k=1TO s-1
r=INT(RND*4)+1
a=x+5*((r=2)-(r=4))
b=y+5*((r=1)-(r=3))
c=(POINT(a,b+2)*POINT(a+4,b+2)+POINT(a+2,b)*POINT(a+2,b+4))*(0=POINT((a+x)\2+2,(b+y)\2+2))
IF((0=POINT(a+2,b+2))+c)*(a>=0)*(b>=0)*(a<5*w)*(b<5*h)=0GOTO 1
x=a
y=b
GOSUB 7
o=1AND r
p=x-2+3*o-5*(r=2)
q=y+1-3*o-5*(r=1)
u=p+3-o
v=q+2+o
LINE(p,q)-(u,v),7,B
LINE(p+o,q+1-o)-(u-o,v-1+o),1
NEXT
9IF c GOTO 1
END
7LINE(x+1,y+1)-(x+3,y+3),7,B
PSET(x+2,y+2),1
RETURN
  • ले जाता है w, hऔर sउपयोगकर्ता इनपुट से, अल्पविराम से अलग।
  • आउटपुट स्क्रीन पर तैयार किया गया है। जबकि कार्यक्रम एक समाधान के लिए खोज कर रहा है, तो आप आंशिक समाधान अतीत को टिमटिमाते हुए देख सकते हैं।
  • आवधिक सीमा शर्तों का उपयोग नहीं करता है। मुझे पाइप को जोड़ने और पाइप के आधे हिस्से के एक तरफ होने की चिंता किए बिना और दूसरी तरफ आधे के बिना पाइप को जोड़ने के लिए परीक्षण करना आसान लगा।

यहाँ दृष्टिकोण प्रत्येक कदम पर एक यादृच्छिक दिशा की कोशिश करना है और शुरुआत से शुरू करना है अगर यह एक अमान्य कदम है। हम दिशाओं के अनुसार पाइपों को खींचते हैं, और POINTहमारी वैधता की स्थिति के लिए स्क्रीन पर बिंदुओं का परीक्षण करने के लिए उपयोग करते हैं। एक चाल वैध है अगर यह ग्रिड की सीमाओं के बाहर नहीं जाती है और:

  1. स्थानांतरित सेल खाली है; या
  2. दोनों
    1. स्थानांतरित सेल में सीधे या क्षैतिज या लंबवत रूप से पाइप गुजरता है
    2. नया पाइप अनुभाग एक मौजूदा पाइप अनुभाग को दोगुना नहीं करता है

जैसा aditsu के CJam जवाब , इस कोड को बहुत धीमी है, और हो सकता है दिमाग numbingly धीमी गति से अगर sका एक महत्वपूर्ण अंश है w*h। मेरे QB64 सेटअप पर, यह 5,5,19काफी शीघ्रता से उत्तर के साथ आता है , लेकिन मुझे प्रतीक्षा करने के लिए तैयार होने में अधिक समय लगता है 5,5,20

यदि आप बड़े / अधिक सघन उदाहरणों को चलाना चाहते हैं, तो यहां गहराई-पहली खोज का उपयोग करते हुए मेरा मूल दृष्टिकोण है । यह एक अधिक 300 अतिरिक्त बाइट्स की कीमत पर अधिक कुशल है।

RANDOMIZE TIMER
SCREEN 9
INPUT w,h,s
DIM t(s),m(s)
0
FOR z=1TO s
t(z)=-1
NEXT
i=5*INT(RND*w)
j=5*INT(RND*h)
k=1
1CLS
IF s=0GOTO 9
x=i
y=j
GOSUB 7
FOR z=1TO k-1
r=m(z)
GOSUB 6
x=a
y=b
GOSUB 7
o=1AND r
p=x-2+3*o-5*(r=2)
q=y+1-3*o-5*(r=1)
u=p+3-o
v=q+2+o
LINE(p,q)-(u,v),7,B
LINE(p+o,q+1-o)-(u-o,v-1+o),1
NEXT
IF c*(k=s)THEN k=k-1:GOTO 1 ELSE IF k=s GOTO 9
IF k<1GOTO 0
IF t(k)>=0GOTO 4
t(k)=0
f=30
WHILE f
r=INT(RND*4)+1
IF f AND 2^r THEN t(k)=t(k)*5+r:f=f-2^r
WEND
4r=t(k)MOD 5
m(k)=r
t(k)=t(k)\5
GOSUB 6
c=(POINT(a,b+2)*POINT(a+4,b+2)+POINT(a+2,b)*POINT(a+2,b+4))*(0=POINT((a+x)\2+2,(b+y)\2+2))
IF((0=POINT(a+2,b+2))+c)*(a>=0)*(b>=0)*(a<5*w)*(b<5*h)THEN k=k+1 ELSE IF t(k)>0GOTO 4 ELSE t(k)=-1:k=k-1
GOTO 1
6a=x+5*((r=2)-(r=4))
b=y+5*((r=1)-(r=3))
RETURN
7LINE(x+1,y+1)-(x+3,y+3),7,B
PSET(x+2,y+2),1
RETURN
9

इनपुट के लिए उदाहरण आउटपुट 10, 10, 100, वास्तविक आकार:10x10 यादृच्छिक नलसाजी

एक अभी भी अधिक सजावटी संस्करण में पाया जा सकता है इस सार । इसके अलावा, असंगठित और पूरी तरह से टिप्पणी की गई है, यह एक स्थिर कारक द्वारा आउटपुट को बढ़ाता है और चरणों के बीच एक सेट देरी के लिए अनुमति देता है, जिससे आप काम पर डीएफएस एल्गोरिथ्म देख सकते हैं। यहाँ एक उदाहरण चलाया गया है:

कार्रवाई में डीलक्स प्लंबिंग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.