4-Wege-Kreuzungsgenerator

26

Hier ist eine ASCII-Kunst einer 4-Wege-Kreuzung:

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

(Beachten Sie, dass die horizontalen Straßen 3 Zeilen hoch sind, während die vertikalen Straßen 5 Spalten breit sind. Dies ist aus ästhetischen Gründen aufgrund der rechteckigen Schrift erforderlich.)

Ihre Herausforderung besteht darin, diese ASCII-Grafik zu erstellen. Wie Sie sicherlich alle wissen, hat nicht jede Kreuzung eine Straße, die in alle Richtungen abfährt. Diese bestimmte Kreuzung verläuft NESW, aber einige Kreuzungen verlaufen möglicherweise wie folgt NW:

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

Oder es könnte gehen SWE:

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

Oder es geht sogar Enur in eine Richtung (obwohl Sie dies kaum als Kreuzung bezeichnen können , aber versuchen Sie zu vermeiden, übermäßig umständlich zu sein):

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

Sie müssen ein Programm oder eine Funktion schreiben, mit denen Sie leicht eine dieser Kombinationen erstellen können. Insbesondere besteht Ihre Herausforderung darin, ein Programm oder eine Funktion zu schreiben, die eine Zeichenfolge von Richtungen NESWals Eingabe verwendet und diese ASCII-Grafik einer Kreuzung mit in diese Richtungen weisenden Straßen ausgibt oder zurückgibt. Diese Richtungen können in beliebiger Reihenfolge erscheinen, aber die Eingabe nicht enthält alle Zeichen außer für N, E, S, oder W. Wenn Sie möchten, können Sie stattdessen Eingaben in Kleinbuchstaben anfordern, dies müssen Sie jedoch in Ihrer Antwort angeben. Sie können auch davon ausgehen, dass alle Eingänge mindestens eine Richtung enthalten.

Das letzte Beispiel enthielt führende Leerzeichen in jeder Zeile, da keine Straße nach Westen führt. Wenn Sie keine Straße nach Westen haben, sind diese Leerzeichen optional. Dies:

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

Wäre auch eine akzeptable Ausgabe. In ähnlicher Weise sind leere Zeilen an dieser Stelle optional , wenn Noder Sweg ist. Eine abschließende neue Zeile ist zulässig, und abschließende Leerzeichen sind zulässig, solange die Ausgabe visuell identisch ist.

Sie können Eingaben und Ausgaben in jedem vernünftigen Format vornehmen, z. B. STDIN / STDOUT, Befehlszeilenargumente, Dateien, Funktionsargumente / Rückgabewerte usw.

Wie üblich ist dies . Versuchen Sie daher, die kürzestmögliche Antwort in der Sprache zu erhalten, die Sie gerade verwenden.

Beispiel IO:

NESW:

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


NS:

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

S:

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

EW:

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

SE:
+-----+-----
|     |     
|     |- - -
|     |     
+-----+-----
|  |  |
|     |
|  |  |
|     |
|  |  |
DJMcMayhem
quelle
Sind auch nachgestellte Leerzeichen erlaubt (wenn es zum Beispiel keine Egibt)? Sind führende und nachfolgende Leerzeilen zulässig, wenn keine Noder S?
Greg Martin
@ GregMartin Ja, das sind erlaubt. Siehe meine Bearbeitung.
DJMcMayhem
Sie erinnerten mich vage an diesen Code, den ich hauptsächlich für Straßenkreuzungen in einem Roguelike-Spiel schrieb: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/…
Sparr

Antworten:

10

Javascript (ES6), 190 187 185 Bytes

Dies ist ein Versuch, dieses ASCII-Zeichen pro Zeichen durch Iteration auf einer 17x15-Matrix zu erstellen. Daher besteht die Ausgabe immer aus 15 Zeilen mit 17 Spalten, wobei der Schnittpunkt der Straßen in der Mitte zentriert ist.

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 und kommentiert

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

Matrix

Unten ist die Matrix mit den im Code verwendeten Koordinaten.

Matrix

Demo

Mit dem folgenden Snippet können Sie eine beliebige Straßenkonfiguration ausprobieren.

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
quelle
8

PowerShell v3 +, 226 204 192 191 Bytes

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)

Nimmt Eingaben als Folge von Großbuchstaben und wandelt sie explizit in ein charArray um. Konstruiert das "Nord" -Segment durch Schleifen von 0bis 4. Jede Schleife erstellt eine Zeichenfolge mit 5 Leerzeichen (wenn W/ 87in der Eingabe vorhanden ist), speichert diese in $x, dann entweder | |(gespeichert in $w) oder | | |, abhängig davon, ob wir gerade oder ungerade sind. Das Array von Zeichenketten gespeichert ist in $n, und multipliziert mit , ob N/ 78ist -inder Eingang. Dadurch wird bestimmt, ob $nin der Pipeline platziert wird oder nicht.

Dann konstruieren wir den mittleren Teil. Die erste Zeile $zist die "Spitze" der Ost-West-Route, die dieselbe Logik für Wund E/ 69oder verwendet und von Parens umgeben ist, um auch eine Kopie in die Pipeline einzufügen. Wir verwenden die Hilfsvariable $y, um ein Byte in den -----Abschnitten zu speichern .

Die nächste Zeile ist nur die entsprechende Anzahl von Leerzeichen (dh $x), die mit den Pipes (dh $w) mit der richtigen Breite verkettet sind . Dann die mittlere gestreifte Linie, wieder mit Wund ELogik und $wFüllung in der Mitte. Dann $x+$wund $zwieder.

Schließlich, da die Südstraße die gleiche ist wie die Nordstraße, muss $ndie Pipeline in Betrieb genommen werden, wenn S/ 83ist -in $a.

Alle diese resultierenden Zeichenfolgen werden aus der Pipeline gesammelt und am Ende der Programmausführung implizit ausgegeben. Missbraucht das Standardtrennzeichen Write-Output, um eine neue Zeile zwischen Elementen einzufügen.


Beispiele

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
quelle
4

C ++ 317 280 276 Bytes

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');
}
David Schwartz
quelle
1
Heilige verschachtelte ternäre Operatoren, Batman!
Wir wussten immer, dass sie für etwas gut sein würden.
David Schwartz
Das Ersetzen strchrdurch indexwird einige mehr rasieren. Definieren Sie xund yzusammen außerhalb forSchleifen.
Wojciech Migda
2

Python 3, 186 Bytes

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

Ein anonymer Lambda, der mit einer Reihe von Anweisungen aufgerufen wird, z. B. 'NWS'

Erklärung folgt

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

Es werden nur die verschiedenen Teile erstellt, wenn das richtige Zeichen in der Zeile steht.
Verwendet @anstelle von \nund taucht \nam Ende wieder auf.
Der Nord- und der Südteil sind identisch, daher benutze ich eine Funktion, um sie einzufügen.

Riley
quelle
2

Batch, 351 344 341 Bytes

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

Hinweis: Die Zeile set t=endet in fünf Leerzeichen und die Zeile if "%i:e=%"=="%i%" set r=endet in einem Leerzeichen. Groß- und Kleinschreibung wird von STDIN nicht berücksichtigt. Bearbeiten: 7 Bytes durch Entfernen der dVariablen gespeichert . 3 Bytes gespart, indem eine forSchleife zum Drucken des mittleren Abschnitts verwendet wurde. Wenn stattdessen separate Befehlszeilenparameter zulässig sind, gilt für 326 319 316 Byte Folgendes:

@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
quelle
1

Python 2, 290 Bytes

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
quelle
m,t,s=[],[],[]könnte sein m=t=s=[].
Yytsi
range(5)könnte in einer Variablen gespeichert und zweimal verwendet werden, anstatt range(5)zweimal zu tippen .
Yytsi
Wofür ist das m?
Oliver Ni
@ TuukkaX, aus irgendeinem Grund t=s=[]alles durcheinander
Daniel
1
Ich bin mir jetzt sicher, dass m=t=s=[]sie alle auf denselben Verweis verweisen.
Yytsi
1

GolfScript, 154 Bytes

{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

Probieren Sie es online!

FedeWar
quelle
Beeindruckend, keine Ahnung, wie diese keine Stimmen hat.
Magic Octopus Urn
1

Pyth ( 385 380 373 353 Byte)

Golf gespielt:

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

Sollten sich Verbesserungen ergeben, teilen Sie mir dies bitte mit.

5 Bytes gespart dank Maltysen

Sie können es hier ausprobieren

Nick der Kodierer
quelle
Sie können Kanstelle von verwenden, Nund dann, wenn Sie zum ersten Mal zuweisen, müssen Sie nicht verwenden =, speichern Sie ein Byte
Maltysen
Auch N[:-1]istP
Maltysen
0

Groovy (274 Bytes)

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

Golf gespielt

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

Probieren Sie es aus: https://groovyconsole.appspot.com/script/5082600544665600

Magische Kraken-Urne
quelle