4-रास्ता चौराहा जनरेटर


26

यहाँ एक 4-चौराहे के ASCII- कला है:

     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |
-----+-----+-----
     |     |     
- - -|     |- - -
     |     |     
-----+-----+-----
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |

(ध्यान दें कि क्षैतिज सड़कें 3 पंक्तियों वाली कैसे लंबी होती हैं, जबकि ऊर्ध्वाधर सड़कें 5 कॉलम चौड़ी होती हैं। यह आयताकार फ़ॉन्ट के कारण, सौंदर्य संबंधी कारणों के लिए है।)

आपकी चुनौती इस ASCII कला का उत्पादन करना है। हालांकि, जैसा कि मुझे यकीन है कि आप सभी जानते हैं, हर चौराहे पर हर एक दिशा में एक सड़क नहीं है। यह विशेष चौराहा जाता है NESW, लेकिन कुछ चौराहे जा सकते हैं, उदाहरण के लिए NW:

     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |
-----+-----+
     |     |
- - -|     |
     |     |
-----+-----+

या यह हो सकता है SWE:

-----+-----+-----
     |     |     
- - -|     |- - -
     |     |     
-----+-----+-----
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |

या यह भी जा सकता है E, बस एक ही दिशा (हालांकि आप शायद ही इस चौराहे को कॉल कर सकते हैं , लेकिन अत्यधिक पांडित्य से बचने की कोशिश करें):

     +-----+-----
     |     |     
     |     |- - -
     |     |     
     +-----+-----

आपको एक प्रोग्राम या फ़ंक्शन लिखना होगा जो आसानी से इनमें से किसी भी संयोजन को उत्पन्न कर सकता है । अधिक विशेष रूप से, आपकी चुनौती एक प्रोग्राम या फ़ंक्शन लिखना है जो NESWइनपुट के रूप में दिशाओं की एक स्ट्रिंग लेता है, जिसमें इनपुट और आउटपुट शामिल हैं या उन दिशाओं में इंगित करने वाले सड़कों के साथ एक चौराहे की इस ASCII कला को लौटाता है। ये निर्देश किसी भी क्रम में दिखाई दे सकते हैं, लेकिन इनपुट नहीं होगा के अलावा कोई भी वर्ण हो N, E, S, या W। यदि आप चाहें, तो आप इसके बजाय इनपुट को कम करने का अनुरोध कर सकते हैं, लेकिन आपको अपने उत्तर में इसे निर्दिष्ट करना होगा। आप यह भी मान सकते हैं कि सभी इनपुट में कम से कम एक दिशा होगी।

पिछले उदाहरण में प्रत्येक पंक्ति पर प्रमुख स्थान थे, क्योंकि पश्चिम में कोई सड़क नहीं है। यदि आपके पास पश्चिम जाने वाली सड़क नहीं है, तो ये प्रमुख स्थान वैकल्पिक हैं। यह:

+-----+-----
|     |     
|     |- - -
|     |     
+-----+-----

एक स्वीकार्य आउटपुट भी होगा। इसी तरह, अगर Nया Sचला गया है , तो वहाँ जगह खाली लाइनों वैकल्पिक हैं। एक अनुगामी न्यूलाइन की अनुमति है, और अनुगामी रिक्त स्थान की अनुमति है जब तक कि आउटपुट नेत्रहीन समान है।

आप किसी भी उचित प्रारूप में इनपुट और आउटपुट ले सकते हैं, जैसे एसटीडीआईएन / एसटीडीयूएसटी, कमांड लाइन आर्ग्स, फाइल्स, फंक्शन आर्ग्युमेंट्स / रिटर्न वैल्यूज आदि।

हमेशा की तरह, यह , इसलिए जिस भी भाषा का आप उपयोग करना चाहते हैं, उसमें सबसे कम संभव उत्तर प्राप्त करने का प्रयास करें!

नमूना IO:

NESW:

     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |
-----+-----+-----
     |     |     
- - -|     |- - -
     |     |     
-----+-----+-----
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |


NS:

|  |  |
|     |
|  |  |
|     |
|  |  |
+-----+
|     |
|     |
|     |
+-----+
|  |  |
|     |
|  |  |
|     |
|  |  |

S:

+-----+
|     |
|     |
|     |
+-----+
|  |  |
|     |
|  |  |
|     |
|  |  |

EW:

-----+-----+-----
     |     |     
- - -|     |- - -
     |     |     
-----+-----+-----

SE:
+-----+-----
|     |     
|     |- - -
|     |     
+-----+-----
|  |  |
|     |
|  |  |
|     |
|  |  |

अनुगामी रिक्त स्थान की भी अनुमति दी जाती है (यदि Eउदाहरण के लिए वहाँ नहीं है )? यदि कोई है Nया नहीं तो खाली लाइनों की अगुवाई कर रहे हैं S?
ग्रेग मार्टिन

@GregMartin हाँ, उन की अनुमति है। मेरा संपादन देखें।
DJMcMayhem

अस्पष्ट रूप से संबंधित, आपने मुझे इस कोड की याद
दिलाई

जवाबों:


10

जावास्क्रिप्ट (ईएस 6), 190 187 185 बाइट्स

यह 17x15 मैट्रिक्स पर पुनरावृत्ति करके इस ASCII कला चरित्र प्रति चरित्र का निर्माण करने का एक प्रयास है। इसलिए, आउटपुट हमेशा 17 कॉलम की 15 पंक्तियों से बना होता है, जो बीच में केंद्रित सड़कों के चौराहे के साथ होता है।

p=>eval("for(y=15,s='';y--;s+=`\n`)for(x=17;x--;)s+=' |-+'[+[a=y>4,b=y<10,c=x>4,d=x<12].every((c,i)=>c|p.search('SNEW'[i])+1)&&!((z=x-8||y&1|a&b)&&z*z-9)+2*!((z=y-7||x&1|c&d)&&z*z-4)]")

असहमति और टिप्पणी की

for(y = 15, s = ''; y--; s += `\n`)   // iterate on y, from 14 to 0 / append line feeds
  for(x = 17; x--;)                   // iterate on x, from 16 to 0
    s += ' |-+' [                     // append next character to string
      +[ a = y > 4,                   // a = outside South area?
         b = y < 10,                  // b = outside North area?
         c = x > 4,                   // c = outside East area?
         d = x < 12 ]                 // d = outside West area?
      .every((c, i) =>                // for each area, see if either:
        c |                           //   - we're currently outside it
        p.search('SNEW' [i]) + 1      //   - or it's an allowed area (p = function param.)
      )                               // if all tests pass, add a:
      &&                              //   - vertical bar (encoded as 1) if:
      !((z = x - 8 || y & 1 | a & b)  //     - x=8, y is even and we're not in the middle
      && z * z - 9)                   //     - OR x=5 OR x=11 (<=> (x-8)*(x-8) = 9)
      + 2 *                           //   - horizontal bar (encoded as 2) if:
      !((z = y - 7 || x & 1 | c & d)  //     - y=7, x is even and we're not in the middle
      && z * z - 4)                   //     - OR y=5 OR y=9 (<=> (y-7)*(y-7) = 4)
    ]                                 // (vertical + horizontal = 3, which leads to '+')

मैट्रिक्स

नीचे कोड में उपयोग किए गए निर्देशांक के साथ मैट्रिक्स है।

मैट्रिक्स

डेमो

निम्नलिखित स्निपेट किसी भी सड़क विन्यास की कोशिश करने की अनुमति देता है।

let f =
p=>eval("for(y=15,s='';y--;s+=`\n`)for(x=17;x--;)s+=' |-+'[+[a=y>4,b=y<10,c=x>4,d=x<12].every((c,i)=>c|p.search('SNEW'[i])+1)&&!((z=x-8||y&1|a&b)&&z*z-9)+2*!((z=y-7||x&1|c&d)&&z*z-4)]")

function update() {
  document.getElementById("o").innerHTML = f(document.getElementById("s").value);
}
update();
<input id="s" size=4 value="NSEW" oninput="update()">
<pre id="o" style="font-size:9px"></pre>


8

PowerShell v3 +, 226 204 192 191 बाइट्स

param([char[]]$a)($n=0..4|%{($x=' '*5*($b=87-in$a))+('|  |  |',($w='|     |'))[$_%2]})*(78-in$a)
($z=($y='-'*5)*$b+"+$y+"+$y*($c=69-in$a))
$x+$w
'- - -'*$b+$w+'- - -'*$c
$x+$w
$z
$n*(83-in$a)

इनपुट को बड़े अक्षरों की एक स्ट्रिंग के रूप में लेता है, स्पष्ट रूप से इसे एक charसरणी के रूप में रखता है। से "लूपिंग" के माध्यम से "उत्तर" खंड का निर्माण करता 0है 4। प्रत्येक लूप, 5 रिक्त स्थान की स्ट्रिंग का निर्माण करता है (यदि W/ 87इनपुट में मौजूद है), स्टोर करता है $x, तो या तो | |(संग्रहीत $w) या | | |, इस बात पर निर्भर करता है कि हम वर्तमान में या विषम हैं। स्ट्रिंग्स के उस एरे को स्टोर किया जाता है $n, और इनपुट N/ / 78से गुणा किया जाता -inहै। यह निर्धारित करेगा कि $nपाइपलाइन पर रखा गया है या नहीं।

फिर, हम मध्य भाग का निर्माण करते हैं। पहली पंक्ति, $zपूर्व-पश्चिम मार्ग का "शीर्ष" है, उसी के लिए Wऔर E/ के लिए एक ही तर्क का उपयोग करते हुए 69, और पाइपों में एक प्रति लगाने के लिए पार्न्स में भी घिरा हुआ है। हम वर्गों $yपर एक बाइट को बचाने के लिए सहायक चर का उपयोग करते -----हैं।

अगली पंक्ति $xसही-चौड़ाई के पाइप (यानी, $w) के साथ रिक्त स्थान की एक उचित संख्या (यानी, ) है। फिर, मध्य धारीदार रेखा, फिर से Wऔर Eतर्क और $wबीच में भरने के साथ । फिर $x+$wऔर $zफिर।

अंत में, चूंकि दक्षिण सड़क उत्तर की तरह ही है, $nपाइपलाइन पर अगर S/ 83है -in $a

उन सभी परिणामी तारों को पाइपलाइन से इकट्ठा किया जाता है और आउटपुट को प्रोग्राम निष्पादन के अंत में निहित किया जाता है। Write-Outputतत्वों के बीच एक नई रेखा सम्मिलित करने के लिए डिफ़ॉल्ट सीमांकक का दुरुपयोग करता है ।


उदाहरण

PS C:\Tools\Scripts\golfing> .\4-way-intersection.ps1 'EN'
|  |  |
|     |
|  |  |
|     |
|  |  |
+-----+-----
|     |
|     |- - -
|     |
+-----+-----

PS C:\Tools\Scripts\golfing> .\4-way-intersection.ps1 'SNW'
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |
-----+-----+
     |     |
- - -|     |
     |     |
-----+-----+
     |  |  |
     |     |
     |  |  |
     |     |
     |  |  |

PS C:\Tools\Scripts\golfing> .\4-way-intersection.ps1 'WE'
-----+-----+-----
     |     |
- - -|     |- - -
     |     |
-----+-----+-----

4

सी ++ 317 280 276 बाइट्स

int i(char*j){for(int y=0;y<15;++y)for(int x=0;x<18;++x)putchar(x-17?y<5&!strchr(j,'N')|y>9&!strchr(j,'S')|x<5&!strchr(j,'W')|x>11&!strchr(j,'E')?' ' :x==5|x==11?y==5|y==9?'+':'|':y==5|y==9?x==5|x==11?'+':'-':x==8&y%2|y==7&x%2?' ':x==8&(y/5-1)?'|':y==7&(x/6-1)?'-':' ':'\n');}

Ungolfed:

int i (char* j)
{
  for (int y=0; y<15; ++y)
    for (int x=0; x<18; ++x)
      putchar(
        x-17 ? 
        y<5 & !strchr(j,'N') |
        y>9 & !strchr(j,'S') |
        x<5 & !strchr(j,'W') |
        x>11 & !strchr(j,'E') ? ' ' :
        x==5 | x==11 ? y==5 | y==9 ? '+' : '|' : 
        y==5 | y==9 ? x==5 | x==11 ? '+' : '-' : 
        x==8 & y%2 | y==7 & x%2 ? ' ' : 
        x==8 & (y / 5 - 1) ? '|' :
        y==7 & (x / 6 - 1) ? '-' :
        ' ' : '\n');
}

1
पवित्र नेस्टेड टर्नरी ऑपरेटर, बैटमैन!

हम हमेशा जानते थे कि वे किसी चीज के लिए अच्छे होंगे।
डेविड श्वार्ट्ज

के strchrसाथ बदलने indexसे कुछ और दाढ़ी होगी। परिभाषित करें xऔर yएक साथ बाहर forछोरों।
वोज्शिएक मिग्डा

2

पायथन 3, 186 बाइट्स

S=' -- -  -- -  --'
lambda d:'\n'.join(S[r//4:15*('W'in d):3]+'||+  -  -| -  -  -||+'[r%4::3]+S[r//4:15*('E'in d):3]for r in[0,1,0,1,0,6,1,9,1,6,0,1,0,1,0][5-5*('N'in d):10+5*('S'in d)])

एक अनाम मेमने को दिशा-निर्देशों की एक स्ट्रिंग के साथ बुलाया जाता है, जैसे 'NWS'

अनुसरण करने के लिए स्पष्टीकरण


2

सेड 234

s,$,@+-----+@|     |@!     !@|     |@+-----+@,
:l;tl
/N/s,^,#,;t
:r
/S/s,@$,#,;t
/E/{s,!@,|- - -@,;s,+@,+-----@,g}
/W/{s,@!,@- - -|,;s,@+,@-----+,g;s,@|,@     |,g}
y,@!NSEW,\n|    ,
q
:
s,#,@|  |  |@|     |@|  |  |@|     |@|  |  |,
tr

यह सिर्फ अलग-अलग हिस्सों का निर्माण करता है यदि उचित चरित्र लाइन पर है।
के @बजाय का उपयोग करता है \nऔर \nअंत में वापस सदस्यता लें।
उत्तर और दक्षिण भाग समान हैं, इसलिए मैं उन्हें सम्मिलित करने के लिए मूल रूप से एक फ़ंक्शन का उपयोग करता हूं।


2

बैच, 351 344 341 बाइट्स

@echo off
set/pi=
set t=     
if not "%i:n=%"=="%i%" call:l
set l=-----
set r=%l%
if "%i:w=%"=="%i%" set l=%t%
if "%i:e=%"=="%i%" set r= 
for %%s in (%l%+-----+%r% "%t%|%t%|" "%l:--=- %|%t%|%r:--=- %" "%t%|%t%|" %l%+-----+%r%) do echo %%~s
if "%i:s=%"=="%i%" exit/b
:l
call :m
call :n
:n
echo %t%^|%t%^|
:m
echo %t%^|  ^|  ^|

नोट: लाइन set t=पांच स्थानों पर समाप्त होती है, और लाइन if "%i:e=%"=="%i%" set r=एक स्थान पर समाप्त होती है। STDIN से केस-असंवेदनशील इनपुट लेता है। संपादित करें: dचर को समाप्त करके 7 बाइट्स सहेजे गए । forमध्य खंड को प्रिंट करने के लिए एक लूप का उपयोग करके 3 बाइट्स सहेजे गए । यदि मुझे इसके बजाय अलग-अलग कमांड-लाइन पैरामीटर की अनुमति है, तो 326 319 316 बाइट्स के लिए:

@echo off
set t=%*
set/an=s=e=w=5,%t: ==%=0
set t=     
call:%n%
set r=-----%t%
call set l=%%r:~%w%,5%%
call set r=%%r:~%e%%%
for %%s in (%l%+-----+%r% "%t%|%t%|" "%l:--=- %|%t%|%r:--=- %" "%t%|%t%|" %l%+-----+%r%) do echo %%~s
goto %s%
:0
call :1
call :2
:2
echo %t%^|%t%^|
:1
echo %t%^|  ^|  ^|
:5

1

पायथन 2, 290 बाइट्स

t,s,r,i=[],[],range(5),raw_input()
for n in r:t+=[" "*5*("W"in i)+"|  "+("|"," ")[n%2]+"  |"]
exec"s+=['-'*5];s[:1]+=' '*5,;"*2;s[:2]+="- - -",
if"N"in i:print'\n'.join(t)
print'\n'.join([s[n]*("W"in i)+("|     |","+-----+")[`n`in"04"]+s[n]*("E"in i)for n in r])
if"S"in i:print'\n'.join(t)

m,t,s=[],[],[]हो सकता है m=t=s=[]
यति

range(5)एक चर में बचाया जा सकता है और दो बार उपयोग करने के बजाय दो बार उपयोग किया जाता है range(5)
यति

किस mलिए है?
ओलिवर नी

@TuukkaX, किसी कारण से t=s=[]सब कुछ गड़बड़ कर देती है
डैनियल

1
अब मैं निश्चित हूं कि ऐसा करने m=t=s=[]से वे सभी एक ही संदर्भ में इंगित करते हैं।
यति


1

पायथ ( 385 380 373 353 बाइट्स)

golfed:

K"     |  |  |\n     |     |\n"?}\Nz++KKPKk?}\Wz?}\Ez+++*5\-*2+\+*5\-"\n     |     |\n- - -|     |- - -\n     |     |\n"+*5\-*2+\+*5\-++*2+*5\-\+"\n     |     |\n- - -|     |\n     |     |\n"*2+*5\-\+?}\Ez+"     "+*2+\+*5\-"\n     |     |\n     |     |- - -\n     |     |\n     +-----+-----"++"     +-----+\n"*3"     |     |\n""     +-----+"?}\Sz++KKPKk

Ungolfed:

K"     |  |  |\n     |     |\n"  //sets K to first two lines of north
?}\Nz                            //if north in the input 
  ++KKPK                         //then: return K + K + K[:-1]
  k                              //else: return ""
?}\Wz                            //if West in input
  ?}\Ez                          //if East in input
    +++*5\-*2+\+*5\-"\n     |     |\n- - -|     |- - -\n     |     |\n"+*5\-*2+\+*5\-    //then: Return E+W string
    ++*2+*5\-\+"\n     |     |\n- - -|     |\n     |     |\n"*2+*5\-\+         //else: Return W string
  ?}\Ez                          //else: if east in input (and not W)
    +"     "+*2+\+*5\-"\n     |     |\n     |     |- - -\n     |     |\n     +-----+-----" //return East without West String
    ++"     +-----+\n"*3"     |     |\n""     +-----+" \\Return empty left and right intersection
?}\Sz                            //if south in input
  ++KKPK                         //return north string
  k                              //return ""

बेशक, अगर कोई सुधार हो तो कृपया मुझे बताएं।

माल्टीसेन को धन्यवाद दिया 5 बाइट्स बचाए

आप इसे यहाँ आज़मा सकते हैं


जब आप पहली बार असाइन करते हैं, तो आप Kइसके बजाय उपयोग कर सकते हैं , आपको एक बाइट Nका उपयोग करने की आवश्यकता नहीं है=
माल्टीसेन

इसके अलावा, N[:-1]हैP
माल्टीसेन

0

ग्रूवी (274 बाइट्स)

Ungolfed

r{
    l->
    t='+-----+'
    s='     ';
    m='|     |'
    x='-----'
    v=(1..5).collect{s}
    nsR=(1..5).collect{[s,((it%2)?'|  |  |':m),s]}
    ewR=[x,s,'- - -',s,x]
    c=[l[3]?ewR:v,[t,m,m,m,t],l[1]?ewR:v]
    (l[0]?nsR.collect{it}:[])+((0..4).collect{x->((0..2).collect{y->c[y][x]})}​)​+​(l[2]?nsR.collect{it}:[])
}

golfed

def i(l) {t='+-----+';s='     ';m='|     |';x='-----';v=(1..5).collect{s};n=(1..5).collect{[s,((it%2)?'|  |  |':m),s]};e=[x,s,'- - -',s,x];c=[l[3]?e:v,[t,m,m,m,t],l[1]?e:v];(l[0]?n.collect{it}:[])+((0..4).collect{x->((0..2).collect{y->c[y][x]})}​)​+​(l[2]?n.collect{it}:[])}

इसे आज़माएँ: https://groovyconsole.appspot.com/script/5082600544665600

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