Generador de intersección de 4 vías

26

Aquí hay un arte ASCII de una intersección de 4 vías:

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

(Observe cómo los caminos horizontales tienen 3 filas de alto, mientras que los caminos verticales tienen 5 columnas de ancho. Esto es por razones estéticas, debido a la fuente rectangular).

Su desafío es producir este arte ASCII. Sin embargo, como estoy seguro de que todos saben, no todas las intersecciones tienen un camino que se desvía en todas las direcciones. Esta intersección particular va NESW, pero algunas intersecciones pueden ir, por ejemplo NW:

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

O podría ir SWE:

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

O incluso puede ir E, solo una dirección (aunque difícilmente puede llamar a esto una intersección , pero trate de evitar ser demasiado pedante):

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

Necesita escribir un programa o función que pueda generar fácilmente cualquiera de estas combinaciones. Más específicamente, su desafío es escribir un programa o función que tome una cadena de direcciones, que consiste en NESW, como entrada, y emite o devuelve este arte ASCII de una intersección con carreteras que apuntan en esas direcciones. Estas direcciones pueden aparecer en cualquier orden, pero la entrada no contener ningún carácter excepción de N, E, S, o W. Si lo desea, puede solicitar que las entradas estén en minúsculas, pero debe especificar esto en su respuesta. También puede suponer que todas las entradas contendrán al menos una dirección.

El último ejemplo tenía espacios iniciales en cada línea, porque no hay camino que vaya hacia el oeste. Si no tiene un camino hacia el oeste, estos espacios principales son opcionales. Esta:

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

También sería un resultado aceptable. Del mismo modo, si desaparece No no S, las líneas vacías en ese lugar son opcionales. Se permite una nueva línea final, y los espacios finales se permiten siempre que la salida sea visualmente la misma.

Puede tomar entradas y salidas en cualquier formato razonable, como STDIN / STDOUT, argumentos de línea de comando, archivos, argumentos de función / valores de retorno, etc.

Como de costumbre, este es el , ¡así que trata de obtener la respuesta más corta posible en el idioma que uses!

Muestra IO:

NESW:

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


NS:

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

S:

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

EW:

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

SE:
+-----+-----
|     |     
|     |- - -
|     |     
+-----+-----
|  |  |
|     |
|  |  |
|     |
|  |  |
DJMcMayhem
fuente
¿También se permiten espacios finales (si no hay E, por ejemplo)? ¿Se permiten líneas en blanco iniciales y finales si no hay No S?
Greg Martin
@ GregMartin Sí, están permitidos. Mira mi edición.
DJMcMayhem
vagamente relacionado, me recordó este código que escribí principalmente, para las intersecciones de carreteras en un juego roguelike: github.com/CleverRaven/Cataclysm-DDA/blob/master/src/…
Sparr

Respuestas:

10

Javascript (ES6), 190 187 185 bytes

Este es un intento de construir este personaje de arte ASCII por personaje iterando en una matriz de 17x15. Por lo tanto, la salida siempre se compone de 15 filas de 17 columnas con la intersección de las carreteras centrada en el medio.

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 y comentó

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

Matriz

A continuación se muestra la matriz con las coordenadas utilizadas en el código.

matriz

Manifestación

El siguiente fragmento permite probar cualquier configuración de carretera.

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

Toma la entrada como una cadena de letras mayúsculas, explícitamente la convierte como una charmatriz. Construye el segmento "Norte" mediante un bucle de 0a 4. Cada ciclo, construye una cadena de 5 espacios (si W/ 87está presente en la entrada), almacena eso en $x, luego | |(almacenado en $w) o | | |, dependiendo de si estamos actualmente pares o impares. Ese conjunto de cadenas se almacena en $n, y se multiplica por si N/ 78es -inla entrada. Eso determinará si $nse coloca en la tubería o no.

Luego, construimos la porción media. La primera línea, $zes la "parte superior" de la ruta este-oeste, utilizando la misma lógica para Wy E/ 69, y rodeada por parens para colocar también una copia en la tubería. Usamos la variable auxiliar $ypara guardar un byte en las -----secciones.

La siguiente línea es solo el número apropiado de espacios (es decir, $x) concatenados en cadena con las tuberías de ancho correcto (es decir, $w). Entonces, la línea de rayas medio, de nuevo con Wy Elógica y $wde llenado en el medio. Entonces $x+$wy de $znuevo.

Por último, ya que el camino del Sur es el mismo que el del norte, poner $nen la tubería si S/ 83es -in $a.

Todas esas cadenas resultantes se recopilan de la canalización y la salida está implícita al final de la ejecución del programa. Abusa del Write-Outputdelimitador predeterminado para insertar una nueva línea entre elementos.


Ejemplos

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

Sin golf:

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
fuente
1
¡Santos operadores ternarios anidados, Batman!
Siempre supimos que serían buenos para algo.
David Schwartz
Reemplazar strchrcon indexafeitará algunos más. Definir xy yjuntos fuera de los forbucles.
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)])

Una lambda anónima llamada con una cadena de direcciones, por ejemplo, 'NWS'

Explicación a seguir

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

Simplemente construye las diferentes partes si el carácter apropiado está en la línea.
Utiliza en @lugar de \ny subs de \nnuevo al final.
Las partes norte y sur son idénticas, por lo que utilizo lo que es básicamente una función para insertarlas.

Riley
fuente
2

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

Nota: La línea set t=termina en cinco espacios y la línea if "%i:e=%"=="%i%" set r=termina en un espacio. Toma entradas que no distinguen entre mayúsculas y minúsculas de STDIN. Editar: Guardado 7 bytes eliminando la dvariable. Guardado 3 bytes usando un forbucle para imprimir la sección central. Si se me permiten parámetros de línea de comando separados, entonces para 326 319 316 bytes:

@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
fuente
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
fuente
m,t,s=[],[],[]podría ser m=t=s=[].
Yytsi
range(5)podría guardarse en una variable y usarse dos veces, en lugar de escribir range(5)dos veces.
Yytsi
Lo que es mpara?
Oliver Ni
@ TuukkaX, por alguna razón tener t=s=[]todo desordenado
Daniel
1
Ahora estoy seguro de que al hacerlo m=t=s=[], todos apuntan a la misma referencia.
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

Pruébalo en línea!

FedeWar
fuente
Impresionante, no tengo idea de cómo esto no tiene votos.
Urna de pulpo mágico
1

Pyth ( 385 380 373 353 bytes)

Golfizado:

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

Sin golf:

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

Por supuesto, si hay alguna mejora, por favor dígame.

Guardado 5 bytes gracias a Maltysen

Puedes probarlo aquí

Nick el codificador
fuente
puede usar en Klugar de Ny luego, al asignar por primera vez, no tiene que usar un =, ahorrándole un byte
Maltysen
también, N[:-1]esP
Maltysen
0

Groovy (274 bytes)

Sin golf

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

Pruébelo: https://groovyconsole.appspot.com/script/5082600544665600

Urna de pulpo mágico
fuente