4ウェイ交差点ジェネレーター


26

以下は、4方向の交差点のASCIIアートです。

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

(水平道路の高さが3行で、垂直道路の幅が5列であることに注意してください。これは、四角形のフォントのために、審美的な理由からです。)

あなたの課題は、このASCIIアートを作成することです。ただし、ご存知のとおり、すべての交差点にすべての方向に走行する道路があるわけではありません。この特定の交差点は行くがNESW、いくつかの交差点は行くかもしれない、例えばNW

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

またはそれは行くかもしれませんSWE

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

またはE、ただ一方向に進むこともあります(ただし、これを交差点と呼ぶことはほとんどできませんが、過度につまらないようにしないでください)。

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

あなたは簡単に生成できるプログラムや関数記述する必要がある任意のこれらの組み合わせのを。より具体的にはNESW、入力としてからなる一連の方向を取り、それらの方向を指す道路との交差点のこのASCIIアートを出力または返すプログラムまたは関数を作成することが課題です。これらの方向は、任意の順序で表示されることがありますが、入力はしません以外の任意の文字を含むNES、またはW。必要に応じて、入力を小文字にすることもできますが、回答でこれを指定する必要があります。また、すべての入力に少なくとも1つの方向が含まれると想定することもできます。

最後の例では、西に向かう道路がないため、各行に先行スペースがありました。西に向かう道路がない場合、これらの先行スペースはオプションです。この:

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

許容可能な出力にもなります。場合同様、NまたはSなくなって、そこの場所で空行はオプションです。1つの末尾の改行が許可され、出力が視覚的に同じである限り、末尾のスペースが許可されます。

STDIN / STDOUT、コマンドライン引数、ファイル、関数の引数/戻り値など、合理的な形式で入力および出力を取得できます。

いつものように、これはなので、使用する言語に関係なく最短の回答を得るようにしてください!

サンプルIO:

NESW:

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


NS:

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

S:

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

EW:

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

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

末尾のスペースも許可さEれますか(たとえば、がない場合)?何があるかどう先頭と末尾されている空白行は許可されませんNS
グレッグマーティン

@GregMartinはい、それらは許可されています。編集をご覧ください。
DJMcMayhem

:漠然と関連し、私はほとんどローグライクゲームで道路交差点のため、書いたこのコードを思い出しgithub.com/CleverRaven/Cataclysm-DDA/blob/master/src/...
SPARR

回答:


10

Javascriptを(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

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配列としてキャストします。からのループを介して「北」セグメントを構築04ます。各ループは、5つのスペースの文字列を構成し(入力にW/ 87が存在する場合)、それをに格納し$x、次に現在(偶数)または奇数に応じて| |(に格納$w)またはのいずれかに格納し| | |ます。その文字列の配列はに格納され$nN/ 78-in入力であるかどうかで乗算されます。これ$nにより、パイプラインに配置されているかどうかが決まります。

次に、中間部分を作成します。最初の行$zは、東/西ルートの「最上部」で、Wand 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

C ++ 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');}

ゴルフをしていない:

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もう少し削り取られます。ループの外側xy一緒に定義しforます。
ヴォイチェフミグダ

2

Python 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

sed 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=は5つのスペースで終わり、行はスペースで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

Python 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)2回入力する代わりに、変数に保存して2回使用できますrange(5)
-Yytsi

何のmためですか?
オリバーNi

@TuukkaX、何らかの理由でt=s=[]すべてを台無しにしてしまう
ダニエル

1
を実行することによりm=t=s=[]、それらはすべて同じ参照を指すようになりました。
Yytsi


1

Pyth(385 380 373 353バイト)

ゴルフ:

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

ゴルフをしていない:

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

もちろん、改善があれば教えてください。

Maltysenのおかげで5バイト節約

ここで試すことができます


K代わりに使用することができN、初めて割り当てるときに、を使用する必要はありません。=バイトを節約します
Maltysen

また、N[:-1]あるP
Maltysen

0

Groovy(274バイト)

非ゴルフ

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}:[])
}

ゴルフ

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.