Generatore di intersezioni a 4 vie


26

Ecco un'arte ASCII di un incrocio a 4 vie:

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

(Nota come le strade orizzontali sono alte 3 file, mentre le strade verticali sono larghe 5 colonne. Questo per motivi estetici, a causa del carattere rettangolare.)

La tua sfida è quella di produrre quest'arte ASCII. Tuttavia, come sono sicuro che tutti sapete, non ogni incrocio ha una strada che viaggia in ogni singola direzione. Questo particolare incrocio va NESW, ma alcuni incroci potrebbero andare, ad esempio NW:

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

Oppure potrebbe andare SWE:

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

Oppure può anche andare E, solo in una direzione (anche se difficilmente puoi chiamarlo incrocio , ma cerca di evitare di essere troppo pedante):

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

È necessario scrivere un programma o una funzione in grado di generare facilmente una di queste combinazioni. Più specificamente, la tua sfida è scrivere un programma o una funzione che prende una serie di direzioni, che consiste NESW, come input, e genera o restituisce questa arte ASCII di un incrocio con strade che puntano in quelle direzioni. Queste indicazioni possono apparire in qualsiasi ordine, ma l'ingresso non contenere caratteri ad eccezione di N, E, S, o W. Se lo desideri, puoi richiedere che gli input siano in minuscolo, ma devi specificarlo nella tua risposta. Si può anche presumere che tutti gli ingressi conterranno almeno una direzione.

L'ultimo esempio aveva spazi iniziali su ogni linea, perché non c'è strada che va verso ovest. Se non hai una strada che va verso ovest, questi spazi iniziali sono opzionali. Questo:

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

Sarebbe anche un risultato accettabile. Allo stesso modo, se No non Sc'è più, le righe vuote al loro posto sono opzionali. È consentita una nuova riga finale e sono consentiti spazi finali purché l'output sia visivamente lo stesso.

È possibile accettare input e output in qualsiasi formato ragionevole, come STDIN / STDOUT, argomenti della riga di comando, file, argomenti di funzioni / valori di ritorno, ecc.

Come al solito, questo è , quindi cerca di ottenere la risposta più breve possibile in qualunque lingua tu usi!

IO di esempio:

NESW:

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


NS:

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

S:

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

EW:

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

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

Sono ammessi anche spazi finali (se non ce ne sono E, ad esempio)? Sono consentite le righe vuote iniziali e finali se non ci sono No S?
Greg Martin,

@GregMartin Sì, quelli sono ammessi. Vedi la mia modifica.
DJMcMayhem

vagamente imparentato, mi hai ricordato questo codice che ho scritto per lo più, per incroci stradali in un gioco roguelike: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/…
Sparr

Risposte:


10

Javascript (ES6), 190 187 185 byte

Questo è un tentativo di costruire questo carattere artistico ASCII per personaggio ripetendo su una matrice 17x15. Pertanto, l'output è sempre composto da 15 file di 17 colonne con l'intersezione delle strade centrate al centro.

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

Ungolf e commentato

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

Matrice

Di seguito è riportata la matrice con le coordinate utilizzate nel codice.

matrice

dimostrazione

Il frammento seguente consente di provare qualsiasi configurazione stradale.

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)

Prende l'input come una stringa di lettere maiuscole, lo lancia esplicitamente come un chararray. Costruisce il segmento "Nord" tramite loop da 0a 4. Ogni ciclo, costruisce una stringa di 5 spazi (se W/ 87è presente nell'input), lo memorizza in $x, quindi | |(memorizzato in $w) o | | |, a seconda che siamo attualmente pari o dispari. Quell'array di stringhe viene archiviato $ne moltiplicato per se N/ 78è -inl'input. Ciò determinerà se $nviene inserito o meno nella pipeline.

Quindi, costruiamo la parte centrale. La prima linea, $zè la "cima" della rotta est-ovest, usando la stessa logica per We E/ 69, e circondata da parentesi per posizionare anche una copia sulla pipeline. Usiamo la variabile helper $yper salvare un byte nelle -----sezioni.

La riga successiva è solo il numero appropriato di spazi (ad es. $x) Concatenati da stringhe con i tubi di larghezza corretta (ad es $w.). Quindi, la linea a strisce centrale, di nuovo con We Elogica e $wriempimento nel mezzo. Quindi $x+$we $zancora.

Infine, poiché la strada del sud è la stessa del nord, metti $nsul gasdotto se S/ 83è -in $a.

Tutte le stringhe risultanti vengono raccolte dalla pipeline e l'output è implicito alla fine dell'esecuzione del programma. Abusa del Write-Outputdelimitatore predefinito per inserire una nuova riga tra gli elementi.


Esempi

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

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
Operatori ternari nidificati santi, Batman!

Abbiamo sempre saputo che sarebbero andate bene per qualcosa.
David Schwartz,

La sostituzione strchrcon ne indextrarrà altri pochi. Definire xe yinsieme forloop esterni .
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)])

Una lambda anonima chiamata con una serie di direzioni, ad esempio "NWS"

Spiegazione da seguire


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

Costruisce solo le diverse parti se il personaggio giusto è sulla linea.
Usa al @posto di \ne \ntorna alla fine.
Le parti nord e sud sono identiche, quindi uso quella che è essenzialmente una funzione per inserirle.


2

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

Nota: la linea set t=termina in cinque spazi e la linea if "%i:e=%"=="%i%" set r=termina in uno spazio. Accetta input senza distinzione tra maiuscole e minuscole da STDIN. Modifica: salvato 7 byte eliminando la dvariabile. Salvato 3 byte usando un forciclo per stampare la sezione centrale. Se invece sono consentiti parametri della riga di comando separati, per 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=[],[],[]potrebbe essere m=t=s=[].
Yytsi,

range(5)potrebbe essere salvato in una variabile e usato due volte, invece di digitare range(5)due volte.
Yytsi,

A cosa serve m?
Oliver Ni,

@TuukkaX, per qualche ragione avendo fatto un casino t=s=[]tutto
Daniel,

1
Ora sono certo che facendo ciò m=t=s=[], indicano tutti lo stesso riferimento.
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

Provalo online!


Impressionante, non ho idea di come questo non abbia voti.
Magic Octopus Urn,

1

Pyth ( 385 380 373 353 byte)

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

Certo, se ci sono miglioramenti, per favore dimmelo.

5 byte salvati grazie a Maltysen

Puoi provarlo qui


puoi usare al Kposto di Ne poi quando assegni per la prima volta, non devi usare un =, salvandoti un byte
Maltysen

inoltre, N[:-1]èP
Maltysen il

0

Groovy (274 byte)

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.