Máy phát điện ngã tư 4 chiều


26

Đây là nghệ thuật ASCII của giao lộ 4 chiều:

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

(Lưu ý cách đường ngang cao 3 hàng, trong khi đường dọc rộng 5 cột. Đây là lý do thẩm mỹ, vì phông chữ nhật.)

Thách thức của bạn là sản xuất nghệ thuật ASCII này. Tuy nhiên, như tôi chắc chắn tất cả các bạn đều biết, không phải mọi ngã tư đều có một con đường đi theo mọi hướng. Giao lộ cụ thể này đi NESW, nhưng một số giao lộ có thể đi, ví dụ NW:

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

Hoặc nó có thể đi SWE:

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

Hoặc thậm chí có thể đi E, chỉ là một hướng duy nhất (mặc dù bạn khó có thể gọi đây là giao lộ , nhưng cố gắng tránh bị quá phạm vi):

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

Bạn cần viết một chương trình hoặc chức năng có thể dễ dàng tạo ra bất kỳ kết hợp nào trong số này. Cụ thể hơn, thách thức của bạn là viết một chương trình hoặc chức năng lấy một chuỗi các hướng, bao gồm NESW, làm đầu vào và đầu ra hoặc trả về nghệ thuật ASCII này của giao lộ với các đường chỉ theo các hướng đó. Những hướng dẫn này có thể xuất hiện ở bất kỳ trật tự, nhưng đầu vào sẽ không chứa bất kỳ ký tự trừ N, E, S, hoặc W. Nếu bạn thích, bạn có thể yêu cầu đầu vào là chữ thường, nhưng bạn phải chỉ định điều này trong câu trả lời của bạn. Bạn cũng có thể cho rằng tất cả các đầu vào sẽ chứa ít nhất một hướng.

Ví dụ cuối cùng có không gian hàng đầu trên mỗi dòng, bởi vì không có con đường nào đi về phía tây. Nếu bạn không có đường đi về phía tây, những không gian hàng đầu này là tùy chọn. Điều này:

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

Cũng sẽ là một đầu ra chấp nhận được. Tương tự, nếu Nhoặc Skhông còn, các dòng trống ở đó là tùy chọn. Một newline trailing được cho phép, và dấu không gian được phép miễn là đầu ra là trực quan giống nhau.

Bạn có thể lấy đầu vào và đầu ra ở bất kỳ định dạng hợp lý nào, chẳng hạn như STDIN / STDOUT, đối số dòng lệnh, tệp, đối số hàm / giá trị trả về, v.v.

Như thường lệ, đây là , vì vậy hãy cố gắng có được câu trả lời ngắn nhất có thể bằng bất kỳ ngôn ngữ nào bạn sử dụng!

Mẫu IO:

NESW:

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


NS:

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

S:

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

EW:

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

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

Các không gian dấu cũng được cho phép ( Eví dụ nếu không có )? Các dòng trống hàng đầu và dấu có được phép nếu không có Nhoặc Skhông?
Greg Martin

@GregMartin Vâng, những người được phép. Xem chỉnh sửa của tôi.
DJMcMayhem

Liên quan một cách mơ hồ, bạn đã nhắc tôi về mã này tôi chủ yếu viết, cho các giao lộ trên đường trong một trò chơi roguelike: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/ tựa
Sparr

Câu trả lời:


10

Javascript (ES6), 190 187 185 byte

Đây là một nỗ lực để xây dựng nhân vật nghệ thuật ASCII này cho mỗi nhân vật bằng cách lặp lại trên ma trận 17x15. Do đó, đầu ra luôn được tạo thành từ 15 hàng gồm 17 cột với giao điểm của các đường nằm ở giữa.

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

Ungolfed và bình luận

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 '+')

Ma trận

Dưới đây là ma trận với tọa độ được sử dụng trong mã.

ma trận

Bản giới thiệu

Đoạn mã sau cho phép thử bất kỳ cấu hình đường nào.

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 byte

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)

Đưa đầu vào dưới dạng một chuỗi các chữ in hoa, rõ ràng biến nó thành một charmảng. Xây dựng đoạn "Bắc" thông qua vòng lặp từ 0đến 4. Mỗi vòng lặp, xây dựng một chuỗi gồm 5 khoảng trắng (nếu W/ 87có trong đầu vào), lưu trữ trong $xđó, sau đó | |(được lưu trữ $w) hoặc | | |, tùy thuộc vào việc chúng ta hiện đang chẵn hay lẻ. Mảng chuỗi đó được lưu trữ $nvà nhân với liệu N/ 78-inđầu vào. Điều đó sẽ xác định nếu$n được đặt trên đường ống hay không.

Sau đó, chúng tôi xây dựng phần giữa. Dòng đầu tiên, $zlà "đỉnh" của tuyến đường đông-tây, sử dụng logic tương tự cho WE/ 69, và được bao quanh trong các ô để đặt một bản sao trên đường ống. Chúng tôi sử dụng biến helper $yđể lưu một byte trên các -----phần.

Dòng tiếp theo chỉ là số lượng khoảng trắng (nghĩa là $x) chuỗi được nối với các ống có chiều rộng chính xác (nghĩa là $w). Sau đó, đường sọc giữa, một lần nữa với WElogic và $wđiền vào giữa. Sau đó $x+$w$zmột lần nữa.

Cuối cùng, vì đường phía Nam giống như phía bắc, hãy đặt $nđường ống nếu S/ 83-in $a.

Tất cả các chuỗi kết quả được thu thập từ đường ống và đầu ra được ẩn ở cuối thực hiện chương trình. Lạm dụng Write-Outputdấu phân cách mặc định để chèn một dòng mới giữa các phần tử.


Ví dụ

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 byte

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

Ung dung:

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
Nhà điều hành chim nhạn lồng nhau, Batman!

Chúng tôi luôn biết rằng họ sẽ tốt cho một cái gì đó.
David Schwartz

Thay thế strchrbằng indexsẽ cạo đi vài lần nữa. Xác định xycùng nhau forvòng lặp bên ngoài .
Wojciech Migda

2

Python 3, 186 byte

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)])

Một lambda ẩn danh được gọi với một chuỗi các hướng, ví dụ: 'NWS'

Giải thích để làm theo


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ó chỉ xây dựng các phần khác nhau nếu nhân vật phù hợp trên dòng.
Sử dụng @thay thế \nvà phụ\n trở lại vào cuối.
Phần phía bắc và phía nam giống hệt nhau, vì vậy tôi sử dụng chức năng cơ bản để chèn chúng.


2

Mẻ, 351 344 341 byte

@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%^|  ^|  ^|

Lưu ý: Dòng set t=kết thúc trong năm khoảng trắng và dòng if "%i:e=%"=="%i%" set r=kết thúc trong một khoảng trắng . Có đầu vào không phân biệt chữ hoa chữ thường từ STDIN. Chỉnh sửa: Đã lưu 7 byte bằng cách loại bỏ dbiến. Đã lưu 3 byte bằng cách sử dụng một forvòng lặp để in phần giữa. Thay vào đó, nếu tôi cho phép các tham số dòng lệnh riêng biệt, thì đối với 326 319 316 byte:

@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 byte

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=[],[],[]có thể m=t=s=[].
Yytsi

range(5)có thể được lưu vào một biến và được sử dụng hai lần, thay vì gõ range(5)hai lần.
Yytsi

Để làm gì m?
Oliver Ni

@TuukkaX, vì một số lý do khiến t=s=[]mọi thứ rối tung lên
Daniel

1
Bây giờ tôi chắc chắn rằng bằng cách thực hiện m=t=s=[], tất cả chúng đều hướng đến cùng một tham chiếu.
Yytsi


1

Pyth ( 385 380 373 353 byte)

Chơi gôn

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

Ung dung:

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

Tất nhiên, nếu có bất kỳ cải tiến xin vui lòng cho tôi biết.

Đã lưu 5 byte nhờ Maltysen

Bạn có thể thử nó ở đây


bạn có thể sử dụng Kthay vì Nvà sau đó khi gán lần đầu tiên, bạn không phải sử dụng =, tiết kiệm cho bạn một byte
Maltysen

Ngoài ra, N[:-1]P
Maltysen

0

Groovy (274 byte)

Bị đánh cắp

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

Chơi gôn

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

Thử nó: https://groovyconsole.appspot.com/script/5082600544665600

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.