4 방향 교차로 생성기


26

다음은 4 방향 교차로의 ASCII 기술입니다.

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

(수평 도로는 3 행 높이이고, 수직 도로는 5 열 너비입니다. 이것은 직사각형 글꼴로 인해 미적인 이유입니다.)

당신의 도전은이 ASCII 예술을 제작하는 것입니다. 그러나 여러분 모두가 알고 있듯이 모든 교차로가 모든 방향으로 진행되는 도로를 가지고있는 것은 아닙니다. 이 특정 교차로는 진행 NESW되지만 일부 교차로는 진행될 수 있습니다 (예 NW:

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

아니면 갈 수도 있습니다 SWE:

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

또는 E한 방향으로 갈 수도 있습니다 (이 교차점 이라고는 거의 할 수 없지만 지나치게 농담을 피하려고 노력하십시오).

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

당신은 쉽게 생성 할 수있는 프로그램이나 기능을 쓸 필요가 있는 이 조합을. 보다 구체적으로, 과제는 NESW입력 으로 구성된 일련의 방향 을 입력하고 해당 방향을 가리키는 도로와 교차하는이 ASCII 기술을 출력하거나 반환 하는 프로그램 또는 함수를 작성하는 것 입니다. 이러한 방향은 임의의 순서로 나타날 수 있지만 입력이 되지 않습니다 제외한 모든 문자를 포함 N, E, S, 또는 W. 원하는 경우 입력을 소문자로 요청할 수 있지만 답변에이를 지정해야합니다. 모든 입력에 적어도 한 방향이 포함되어 있다고 가정 할 수도 있습니다.

서쪽으로가는 도로가 없기 때문에 마지막 예제는 각 줄마다 선행 공백이있었습니다. 서쪽으로가는 도로가 없으면이 앞선 공간은 선택 사항입니다. 이:

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

또한 허용 가능한 출력이 될 것입니다. 이와 유사, N또는 S사라,이 자리에 빈 줄은 선택 사항입니다. 하나의 후행 줄 바꿈이 허용되며 출력이 시각적으로 동일한 한 후행 공백이 허용됩니다 .

STDIN / STDOUT, 명령 행 인수, 파일, 함수 인수 / 반환 값 등과 같은 합리적인 형식으로 입력 및 출력 할 수 있습니다.

평소와 같이, 이것은 이므로 사용하는 언어에 관계없이 가장 짧은 답변을 얻으십시오!

샘플 IO :

NESW:

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


NS:

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

S:

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

EW:

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

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

후행 공백도 허용 E됩니까 (예 : 가없는 경우)? 더가 있다면 앞뒤 있습니까 빈 라인은 허용되지 NS?
Greg Martin

@GregMartin 예, 허용됩니다. 내 편집을 참조하십시오.
DJMcMayhem

막연하게 관련, 당신은 로그 류 게임에서 도로 교차로, 나는 주로 쓴이 코드를 생각 나게 : github.com/CleverRaven/Cataclysm-DDA/blob/master/src/...
Sparr

답변:


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

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까지 루핑을 통해 "North"세그먼트를 구성 합니다 4. 각 루프는 5 개의 공백으로 구성된 문자열을 구성하고 ( 입력에 W/ 87가있는 경우) 현재 짝수인지 홀수인지에 따라 $x, 다음에 | |저장 ( $w) 또는을 저장 | | |합니다. 해당 문자열 배열은에 저장되고 / 가 입력 $n인지 여부에 의해 곱해집니다 . 파이프 라인에 배치 되는지 여부를 결정합니다 .N78-in$n

그런 다음 중간 부분을 구성합니다. 첫 번째 줄은, $z동일한 논리를 사용하여, 동서 노선의 "최고"입니다 WE/ 69또한 파이프 라인에 복사본을 배치하고 괄호에 둘러싸인한다. 우리는 helper 변수 $y를 사용 하여 -----섹션에 바이트를 저장 합니다.

다음 줄은 $x올바른 너비의 파이프 (예 :)로 문자열로 연결된 적절한 수의 공간 (예 :)입니다 $w. 그런 다음 다시와 중간 줄무늬 라인, W그리고 E논리와 $w중간에 충전. 다음 $x+$w$z다시.

마지막으로 남쪽 도로는 북쪽과 같으므로 / 가 $n있으면 파이프 라인을 착용 하십시오 .S83-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
거룩한 중첩 삼항 연산자, 배트맨!

우리는 항상 그들이 뭔가 좋은 것을 알고있었습니다.
David Schwartz

로 교체 하면 몇 가지 문제 strchr가 해결 index됩니다. 외부 루프를 정의 x하고 y함께 정의하십시오 for.
Wojciech Migda

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

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 칸으로 끝나고 선 은 1 칸으로 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).
Yytsi

무엇입니까 m?
Oliver Ni

@TuukkaX, 어떤 이유로 든 t=s=[]모든 것을 망쳐 놓은
Daniel

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

그루비 (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.