Generator persimpangan 4 arah

26

Berikut adalah seni ASCII dari persimpangan 4 arah:

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

(Perhatikan bagaimana jalan horizontal setinggi 3 baris, sedangkan jalan vertikal selebar 5 kolom. Ini untuk alasan estetika, karena font segi empat.)

Tantangan Anda adalah untuk menghasilkan seni ASCII ini. Namun, karena saya yakin Anda semua tahu, tidak setiap persimpangan memiliki jalan yang melaju ke setiap arah. Persimpangan khusus ini berjalan NESW, tetapi beberapa persimpangan mungkin berjalan, misalnya NW,:

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

Atau mungkin SWE:

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

Atau bahkan mungkin pergi E, hanya satu arah (walaupun Anda tidak bisa menyebutnya persimpangan , tetapi cobalah untuk tidak terlalu bertele-tele):

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

Anda perlu menulis sebuah program atau fungsi yang dapat dengan mudah menghasilkan setiap kombinasi ini. Lebih khusus lagi, tantangan Anda adalah menulis sebuah program atau fungsi yang mengambil serangkaian arah, yang terdiri dari NESW, sebagai input, dan menghasilkan atau mengembalikan seni persimpangan ASCII ini dengan jalan yang menunjuk ke arah itu. Arah ini dapat muncul dalam urutan apapun, tapi input tidak akan berisi karakter apapun kecuali untuk N, E, S, atau W. Jika Anda suka, Anda dapat meminta input berupa huruf kecil saja, tetapi Anda harus menentukan ini dalam jawaban Anda. Anda juga dapat mengasumsikan bahwa semua input akan mengandung setidaknya satu arah.

Contoh terakhir memiliki spasi di setiap baris, karena tidak ada jalan menuju barat. Jika Anda tidak memiliki jalan menuju barat, ruang utama ini adalah opsional. Ini:

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

Juga akan menjadi output yang dapat diterima. Demikian pula, jika Natau Shilang, baris kosong di tempat itu adalah opsional. Satu trailing newline diperbolehkan, dan trailing spasi diizinkan selama output secara visual sama.

Anda dapat mengambil input dan output dalam format yang masuk akal, seperti STDIN / STDOUT, argumen baris perintah, file, argumen fungsi / nilai pengembalian, dll.

Seperti biasa, ini adalah , jadi cobalah untuk mendapatkan jawaban sesingkat mungkin dalam bahasa apa pun yang Anda gunakan!

Sampel IO:

NESW:

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


NS:

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

S:

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

EW:

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

SE:
+-----+-----
|     |     
|     |- - -
|     |     
+-----+-----
|  |  |
|     |
|  |  |
|     |
|  |  |
DJMcMayhem
sumber
Apakah spasi tambahan juga diizinkan (jika tidak ada E, misalnya)? Apakah memimpin dan mengikuti garis kosong diperbolehkan jika tidak ada Natau S?
Greg Martin
@GregMartin Ya, itu diizinkan. Lihat hasil edit saya.
DJMcMayhem
Terkait samar-samar, Anda mengingatkan saya pada kode ini yang sebagian besar saya tulis, untuk persimpangan jalan di game roguelike: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/…
Sparr

Jawaban:

10

Javascript (ES6), 190 187 185 byte

Ini adalah upaya untuk membangun karakter seni ASCII ini per karakter dengan iterasi pada matriks 17x15. Oleh karena itu, output selalu dibuat dari 15 baris 17 kolom dengan persimpangan jalan berpusat di tengah.

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

Tidak diikat dan dikomentari

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

Matriks

Di bawah ini adalah matriks dengan koordinat yang digunakan dalam kode.

matriks

Demo

Cuplikan berikut memungkinkan untuk mencoba konfigurasi jalan apa pun.

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>

Arnauld
sumber
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)

Mengambil input sebagai string huruf kapital, secara eksplisit melemparkannya sebagai chararray. Buat segmen "Utara" melalui pengulangan dari 0ke 4. Setiap loop, membangun string 5 spasi (jika W/ 87hadir dalam input), menyimpannya di $x, lalu | |(disimpan dalam $w) atau | | |, tergantung pada apakah kita saat ini genap atau ganjil. Array dari string disimpan ke dalam $n, dan dikalikan dengan apakah N/ 78adalah -ininput. Itu akan menentukan apakah $nditempatkan pada pipa atau tidak.

Kemudian, kami membangun bagian tengah. Baris pertama, $zadalah "puncak" dari rute timur-barat, menggunakan logika yang sama untuk Wdan E/ 69, dan dikelilingi dalam parens untuk juga menempatkan salinan pada pipa. Kami menggunakan variabel pembantu $yuntuk menyimpan byte di -----bagian.

Baris berikutnya adalah jumlah spasi yang sesuai (yaitu, $x) string-disatukan dengan pipa dengan lebar yang benar (yaitu, $w). Kemudian, garis tengah bergaris, lagi dengan Wdan Elogika dan $wmengisi di tengah. Kemudian $x+$wdan $zlagi.

Akhirnya, karena jalan Selatan adalah sama dengan utara, menempatkan $npada pipa jika S/ 83adalah -in $a.

Semua string yang dihasilkan dikumpulkan dari pipa dan output tersirat pada akhir pelaksanaan program. Menyalahgunakan Write-Outputpembatas default untuk menyisipkan baris baru antar elemen.


Contohnya

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

Tidak Disatukan:

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');
}
David Schwartz
sumber
1
Operator ternary suci, Batman!
Kami selalu tahu mereka akan baik untuk sesuatu.
David Schwartz
Mengganti strchrdengan indexakan mencukur lebih sedikit. Tentukan xdan ybersama - sama forloop luar .
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)])

Lambda anonim dipanggil dengan serangkaian arah, misalnya 'NWS'

Penjelasan untuk diikuti

RootTwo
sumber
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

Itu hanya membangun bagian-bagian yang berbeda jika karakter yang tepat ada di telepon.
Gunakan @alih-alih \ndan masuk \nkembali di akhir.
Bagian utara dan selatan identik, jadi saya menggunakan apa yang pada dasarnya fungsi untuk memasukkannya.

Riley
sumber
2

Batch, 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%^|  ^|  ^|

Catatan: Garis set t=berakhir dalam lima spasi, dan garis if "%i:e=%"=="%i%" set r=berakhir pada spasi. Mengambil input case-insensitive dari STDIN. Sunting: Disimpan 7 byte dengan menghilangkan dvariabel. Disimpan 3 byte dengan menggunakan forloop untuk mencetak bagian tengah. Jika saya diperbolehkan parameter baris perintah yang terpisah, maka untuk 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
Neil
sumber
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)
Daniel
sumber
m,t,s=[],[],[]bisa jadi m=t=s=[].
Yytsi
range(5)dapat disimpan ke dalam variabel dan digunakan dua kali, bukannya mengetik range(5)dua kali.
Yytsi
Untuk apa m?
Oliver Ni
@ TuukkaX, untuk beberapa alasan t=s=[]mengacaukan semuanya
Daniel
1
Saya sekarang yakin bahwa dengan melakukan m=t=s=[], mereka semua menunjuk ke referensi yang sama.
Yytsi
1

GolfScript, 154 byte

{a?1+}:x;'-'5*:e;' '5*:b;"+"e+"+"+:f;{b'|'b'|'b n}:k;{'W'x{e}{b}if\'E'x{e}{}if n}:y;{x{b"|  |  |
"+:c k c k c}{}if}:z;1/:a;'N'z f y k'|'b+'|'+ y k f y'S'z

Cobalah online!

FedeWar
sumber
Mengesankan, tidak tahu bagaimana ini tidak memiliki suara.
Magic Octopus Mm
1

Pyth ( 385 380 373 353 bytes)

Golf:

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

Tidak Disatukan:

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

Tentu saja, jika ada perbaikan, tolong beri tahu saya.

Disimpan 5 byte berkat Maltysen

Anda bisa mencobanya di sini

Nick si pembuat kode
sumber
Anda dapat menggunakan Kalih-alih Ndan kemudian ketika menetapkan untuk pertama kalinya, Anda tidak harus menggunakan =, menghemat satu byte
Maltysen
juga, N[:-1]adalahP
Maltysen
0

Groovy (274 Bytes)

Tidak disatukan

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

Golf

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

Cobalah: https://groovyconsole.appspot.com/script/5082600544665600

Guci Gurita Ajaib
sumber