4-ওয়ে ছেদ জেনারেটর


26

এখানে একটি 4-ওয়ে মোড়ের ASCII- আর্ট রয়েছে:

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

(অনুভূমিক রাস্তাগুলি কীভাবে 3 সারি লম্বা, উল্লম্ব রাস্তাগুলি 5 টি কলাম প্রস্থে লক্ষ্য করুন This এটি আয়তক্ষেত্রাকার ফন্টের কারণে নান্দনিক কারণে is

আপনার চ্যালেঞ্জ এই ASCII শিল্প উত্পাদন করা হয়। যাইহোক, আমি নিশ্চিত যে আপনারা সবাই জানেন, প্রতিটি চৌরাস্তার প্রতিটি রাস্তা প্রতিটি একক দিকে চলতে পারে না। এই নির্দিষ্ট ছেদটি যায় NESWতবে কয়েকটি ছেদগুলি যেতে পারে, উদাহরণস্বরূপ NW:

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

অথবা এটি যেতে পারে SWE:

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

বা এটি এমনকি যেতে পারে E, কেবল একটি একক দিক (যদিও আপনি এটিকে খুব আন্তরিকভাবে একটি চৌরাস্তা বলতে পারেন , তবে অতিরিক্ত পেডেন্টিক হওয়া এড়াতে চেষ্টা করুন):

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

আপনাকে এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা সহজেই এই সংমিশ্রণের যে কোনও একটি তৈরি করতে পারে । আরও সুনির্দিষ্টভাবে, আপনার চ্যালেঞ্জটি হ'ল একটি প্রোগ্রাম বা ফাংশন লিখুন যা NESWইনপুট হিসাবে গঠিত এবং একটি আউটপুট সমন্বিত দিকনির্দেশের স্ট্রিং নেয় এবং সেই দিকগুলির দিকে ইঙ্গিত করে রাস্তার মোড়ের এই ASCII শিল্পকে ফেরত দেয় বা ফেরত দেয়। এই দিক নির্দেশ কোন ক্রমে প্রদর্শিত হতে পারে, কিন্তু ইনপুট করা হবে না ছাড়া কোনো অক্ষর N, E, S, অথবা W। আপনি যদি চান তবে আপনি ইনপুটগুলির পরিবর্তে ছোট হাতের জন্য অনুরোধ করতে পারেন, তবে আপনাকে অবশ্যই নিজের উত্তরে এটি নির্দিষ্ট করতে হবে। আপনি ধরে নিতে পারেন যে সমস্ত ইনপুটগুলিতে কমপক্ষে একটি দিক থাকবে।

সর্বশেষ উদাহরণটিতে প্রতিটি লাইনে নেতৃস্থানীয় স্পেস ছিল, কারণ পশ্চিম দিকে কোনও রাস্তা নেই। আপনার যদি পশ্চিমে যাওয়ার রাস্তা না থাকে তবে এই শীর্ষস্থানগুলি sচ্ছিক। এই:

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

এছাড়াও একটি গ্রহণযোগ্য আউটপুট হবে। একইভাবে, যদি Nবা Sচলে যায় তবে সেখানে খালি লাইনগুলি alচ্ছিক। একটি ট্রেলিং করা নতুন লাইনের অনুমতি রয়েছে এবং আউটপুট দৃশ্যত একইরূপে চলার জায়গাগুলি অনুমোদিত ।

আপনি যেকোন যুক্তিসঙ্গত বিন্যাসে ইনপুট এবং আউটপুট নিতে পারেন, যেমন STDIN / STDOUT, কমান্ড লাইন আরগস, ফাইল, ফাংশন আর্গুমেন্ট / রিটার্ন মান ইত্যাদি etc.

যথারীতি, এটি , সুতরাং আপনি যে ভাষায় ব্যবহার করতে চান তাতে সংক্ষিপ্ততম উত্তর পাওয়ার চেষ্টা করুন!

নমুনা আইও:

NESW:

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


NS:

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

S:

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

EW:

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

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

পেছনের জায়গাগুলিও কি অনুমোদিত ( Eউদাহরণস্বরূপ যদি সেখানে না থাকে )? নেতৃস্থানীয় এবং পিছনে ফাঁকা রেখাগুলি অনুমোদিত Nবা যদি নেই S?
গ্রেগ মার্টিন

@ গ্রেগমার্টিন হ্যাঁ, এগুলি অনুমোদিত। আমার সম্পাদনা দেখুন।
ডিজেএমসিএমহেম

অস্পষ্টভাবে সম্পর্কিত, আপনি আমাকে এই কোডটির কথা
স্পার

উত্তর:


10

জাভাস্ক্রিপ্ট (ES6), 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

পাওয়ারশেল ভি 3 +, 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)])

একটি বেনামে ল্যাম্বদা নির্দেশকের স্ট্রিং সহ ডাকা হয়, যেমন 'এনডাব্লুএস'

অনুসরণ করার ব্যাখ্যা


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শেষে ফিরে আসুন।
উত্তর এবং দক্ষিণ অংশগুলি অভিন্ন, তাই আমি এগুলি toোকাতে মূলত কোন ফাংশনটি ব্যবহার করি।


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=[]
Yytsi

range(5)একটি ভেরিয়েবলে সংরক্ষণ করা যেতে পারে এবং দু'বার টাইপ করার পরিবর্তে দু'বার ব্যবহার করা যেতে পারে range(5)
ইয়তসি

কিসের mজন্য?
অলিভার নি

@ টুকুএক্স, কোনও কারণে t=s=[]সবকিছু ছড়িয়ে দিয়েছে
ড্যানিয়েল

1
আমি এখন নিশ্চিত হয়েছি যে m=t=s=[], তারা সবাই একই রেফারেন্সের দিকে ইঙ্গিত করে।
Yytsi


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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.