En los Estados Unidos , las dos direcciones opuestas del tráfico en una carretera están separadas por una línea amarilla discontinua si se permite el paso y dos líneas amarillas continuas si no se permite el paso.
(Solo un lado puede ser punteado para permitir pasar por ese lado, y las líneas amarillas pueden significar otras cosas como el centro o los carriles reversibles, pero no nos preocupa ninguno de esos casos).
Escriba un programa que tome una cadena codificada de longitud de ejecución de P
para pasar y N
para que no pase , e imprime una versión ASCII de la carretera correspondiente. Excepto por la línea central, la carretera siempre tiene el mismo patrón, que puede deducirse fácilmente de los ejemplos a continuación.
Habrá un número decimal positivo antes de cada uno P
y N
en la cadena de entrada. Este número define la longitud de la región de paso o no paso de la parte actual de la carretera.
Ejemplos
Una entrada de 12N
produciría 12 columnas de camino sin paso (línea central todas =
):
____________
============
____________
Una entrada de 12P
produciría 12 columnas de camino de paso (línea central que se -
repite):
____________
- - - - - -
____________
Pasar y no pasar se puede combinar, por ejemplo 4N4P9N7P1N1P2N2P
, produciría:
______________________________
====- - =========- - - -=-==-
______________________________
Estas son 4 columnas que no pasan , luego 4 que pasan , luego 9 que no pasan , etc.
Tenga en cuenta que una zona de paso siempre comienza con un guión ( -
) en el lado izquierdo, no un espacio ( ). Esto es requerido.
Detalles
- La entrada nunca tendrá dos
N
zonas o dosP
zonas en una fila. por ejemplo4P5P
, nunca ocurrirá. - No necesita admitir letras sin un número positivo principal. La llanura
P
siempre será1P
, la llanuraN
siempre será1N
. - Puede haber espacios finales siempre que no se extiendan más allá de la columna final del camino. Puede haber una nueva línea final opcional.
- En lugar de un programa, puede escribir una función que tome la cadena codificada de longitud de ejecución e imprima o devuelva el camino ASCII.
- Toma información de cualquier manera estándar (stdin, línea de comando, función arg).
El código más corto en bytes gana. Tiebreaker es una publicación anterior.
Respuestas:
CJam, 38 bytes
Cómo funciona
En primer lugar, asignamos la columna camino correcto para las variables
N
yP
y luego simplemente evaluamos la cadena de entrada. Esto deja un par de la longitud y la columna en la pila. Los agrupamos, ejecutamos un RLD para obtener las columnas completas, transponemos para unirlos y, finalmente, convertimos el continuo--
a-
.Pruébalo en línea aquí
fuente
JavaScript (ES6), 114
Usando cadenas de plantilla , los 5 avances de línea son significativos y deben contarse.
fuente
rs , 252 caracteres
Aunque esto podría no contar porque agregué el operador de convergencia como una estafa de la Retina de Martin Büttner hace una hora ... No estoy realmente aquí para competir de todos modos. Es divertido hacer una solución basada en expresiones regulares para esto.
Obtuve la línea 2 de la respuesta de Martin Retina para Lenguajes de programación a través de los años .
Explicación
Esto hace mucha magia. Vea la respuesta que vinculé arriba para más información.
Básicamente, con la entrada
4N4P9N7P1N1P2N2P
, este será el resultado:Próximo:
Esto reemplaza los números que preceden al símbolo de no pasar (N) con los signos de igual. El resultado con la entrada anterior:
Esta:
reemplaza el primer número que precede a un símbolo que pasa (P) con el primer guión. El resultado:
Las siguientes dos líneas continúan el mismo patrón:
La primera línea reemplaza el resto de la línea con el patrón de espacio en el tablero. El segundo maneja un número impar; reemplaza el último guión seguido de un único entero (como
-5
) con un guión-espacio (-
). Ahora, la salida es:Ahora las cosas comienzan a encajar. La proxima linea:
solo elimina el
#N
y#P
.configurar los guiones bajos en la parte superior e inferior para dar:
Por último, eliminamos
A
:fuente
Haskell, 165 bytes
Ejemplo de ejecución (
f
devuelve una cadena, así que para una mejor visualización imprímala):Cómo funciona:
p
devuelve la línea media analizando recursivamente la cadena de entrada y concatenando el número dado de símbolos encontrados por la función de búsquedak
. La función principal sef
une a una lista de cinco elementos con nuevas líneas, que consiste en la línea superior (cada carácter de la línea media reemplazada por_
), una nueva línea, la línea media, una línea vacía y la línea inferior (igual que la parte superior).fuente
Python 3,
169168 bytes. (167 con Python 2)Bastante indolente:
Pruébelo en línea aquí .
fuente
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
al final de la línea anterior con un punto y coma anterior ahorra un byte.print
.Python 2, 136 bytes
Sorprendentemente, importar
re
parece ser realmente útil aquí.fuente
PHP, 187 bytes
El código puede permanecer en una sola línea; se muestra aquí en varias líneas para que sea más legible (no se contaron los espacios en blanco y las nuevas líneas utilizadas para formatear).
Se pueden guardar dos bytes al no imprimir la nueva línea final. Se pueden guardar cinco bytes más utilizando caracteres de nueva línea reales en
echo()
:Se pueden guardar seis bytes adicionales omitiendo la inicialización de
$o
($o='';
) pero esto activará un aviso. El aviso se puede suprimir ejecutando el script usando la línea de comando:Esto lo lleva a 174 bytes.
fuente
Ruby,
137135 bytesNo es el más corto que se me ocurrió, pero está cerca del más bonito. En parte prestado de la respuesta de Optimizer.
Sin golf:
fuente
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C, 155 bytes
Más legible:
El bucle externo cuenta líneas del 5 al 0.
El bucle intermedio itera sobre partes de la cadena codificada:
El bucle interno decodifica una parte, como,
7P
e itera el número necesario de veces (por ejemplo, 7).Cada iteración imprime uno
char
. El valor de lachar
se describe en el códigol%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
en 1 (se inicializó a 2 porsscanf
)-
), de lo contrario imprima 32 (espacio)fuente
Scala, 163 bytes
Primer intento, podría jugar un poco más de golf.
fuente
Ruby, 94 bytes
Toma prestada la
gsub'--','- '
idea de la respuesta de 14mRh4X0r . Sin embargo, creo que esa respuesta es más interesante, aunque es más corta.Pruebas:
Produce:
fuente
déjame incluir mi versión matlab
MATLAB (267 b)
entrada
Una cadena con formato ascii seguida por un espacio (ya que no hay un final de cadena '\ 0' en matlab
ejemplo V = '12N13P'
salida
patrón de representación de la carretera
función
la función debe llamarse desde su cola-1 (se elimina el carácter vacío)
ejemplo : p (V, numel (V) -1)
Simulación
Pruébelo en línea aquí
fuente
R, 132 bytes
No estoy muy contento con esto, pero fue un poco divertido de hacer :) Intenté deshacerme de los múltiples
gsub
mensajes, pero mis esfuerzos fueron en vano. Sospecho que hay una manera mucho mejor de hacer esto.scan
obtiene las cuerdas de STDIN y toma la cuarta. Nota que las líneas vacías requieren un espacio (o algo) en ellas para que el escaneo continúe recibiendo la entrada.=
s conN
s, la-
ycon
P
s.NP
yPN
rbind
) con el primer carácter de cada cadenacat
.Prueba de funcionamiento
fuente