El reto
Su programa o función aceptará una sola entrada de cadena de STDIN o un parámetro de función. Puede suponer que la entrada contendrá solo caracteres alfabéticos (a-zA-Z), espacios y puntos completos. La entrada no distingue entre mayúsculas y minúsculas, por lo que debe tratar 'a' exactamente igual que trataría 'A'.
Para cada carácter en la cadena, generará una representación de un edificio según la siguiente especificación.
Cada edificio debe tener un techo, designado por un guión bajo en la línea superior y luego una barra oblicua, espacio, barra invertida en la segunda línea.
_
/ \
Luego tendrá una serie de pisos, que coinciden con el número de letra (a = 1, b = 2, c = 3, etc.) que están representados por una pared (|) en cada lado y un espacio en el medio. El piso inferior (y solo el piso inferior) debe tener una base, que es un guión bajo entre las paredes. Me gusta esto...
|_|
Entonces, por ejemplo, 'b' se vería así
_
/ \
| |
|_|
Ahora, sabemos que los edificios muy altos y estrechos no pueden sostenerse y deben ensancharse en la base, por lo que ningún edificio puede tener más de tres pisos de altura sin algún soporte adicional. Por lo tanto, cada tres niveles (no menos) debe agregar una 'capa de ampliación'. La capa de ensanchamiento consiste en una barra oblicua y una barra invertida directamente encima de las paredes de la sección debajo de esta, y la sección de abajo debe ser dos espacios más ancha que la sección de arriba. La capa adicional no cuenta para la altura del edificio.
Los edificios no deben superponerse, pero no deben tener espacios innecesarios entre ellos, y el suelo siempre es plano, por lo que todos los edificios deben tener su base en el mismo nivel.
Por ejemplo, 'abcdefga' se verá así.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Los espacios en la entrada de cadena deben estar representados por un doble espacio.
Las paradas completas en la entrada de la cadena deben representarse con escombros como este.
/\/\
Ejemplos adicionales
Entrada = Hello world.
Salida =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Entrada = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Entrada = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
Reglas
- Por supuesto, este es el código de golf, gana la puntuación más baja en bytes
- Se aplican las reglas de laguna legal estándar
- Se permite cualquier cantidad de líneas en blanco adicionales antes o después de la salida
- Puede elegir generar el resultado completo en una cadena u ofrecer la salida como una matriz donde cada elemento representa una línea de salida, o enviar a STDOUT
Nota
Esta es mi primera publicación en PPCG, así que, por favor, ve con calma. Ha pasado por la caja de arena. Cualquier punto negativo o posibles mejoras, publíquelo como comentario y haré lo que pueda
[a,z]
y[A,Z]
al[1,26]
parece un requisito inútil. Sería mucho mejor usar solo una lista de enteros como entrada (teniendo que0
ser la entrada para los escombros). Además, publicar su desafío después de haber estado en el Sandbox durante solo 21 horas , sin esperar a recibir más votos o comentarios de más de un usuario, no cuenta como si hubiera "pasado por el sandbox". Se recomienda dejar los desafíos en el Sandbox durante 48-72 horas como mínimo, para darles a las personas suficiente tiempo para revisarlos.[a,z]
,[1.26]
partes del Mego mencionados. Tenerlo opcional es a menudo lo mejor (a menos que sea una parte clave del desafío (no está aquí).Respuestas:
JavaScript (ES6),
330326...315309 bytesConstruye el arte ASCII de forma recursiva, comenzando con el piso inferior y aplicando varias expresiones regulares entre cada etapa:
Cómo funciona
1) piso inferior
Comenzamos traduciendo la cadena de entrada en un piso inferior como:
dónde:
y
es un alias más corto para la barra diagonal inversa (que requiere escapar)0
,1
o2
) justo antes de una secuencia de_
es la pared izquierda del edificio. Representa el número de muros que se deben colocar encima antes de la próxima 'capa de ampliación'._
es la pared derecha del edificio y siempre se establece en0
.2) Expresiones regulares aplicadas entre cada etapa
El proceso recursivo consiste en aplicar 9 reemplazos en el piso anterior, usando las siguientes expresiones regulares:
/\/y/g
=>" "
(quitar los escombros)/_/g
=>"x"
(reemplace la base o la parte superior del edificio con un bloque sólido)/\/xy/g
=>" _ "
(reemplace la última capa de ampliación con la parte superior del edificio)/1/g
=>"3"
(reemplazar temporalmente1
con3
- ver el último paso)/2/g
=>"1"
(reemplazar2
con1
)/\/xx(x+)y/g
=>" 2$10 "
(reemplace una capa de ensanchamiento con una pared nueva y más estrecha)/0(x+)0/g
=>"/$1y"
(reemplace la parte superior de la pared con una capa de ensanchamiento)/3/g
=>"0"
(reemplazar3
con0
)Por ejemplo, aquí están las transformaciones sucesivas de
2___0
(piso inferior generado por a'f'
):NB : la parte superior del edificio se reemplaza por a
x
. Esto no se muestra en el diagrama anterior.3) Expresiones regulares aplicadas al resultado final
La recursión se detiene cuando no hay nada más que reemplazar, lo que significa que estamos más allá de la parte superior del edificio más alto.
Ahora necesitamos limpiar todo con otras expresiones regulares:
/\d/g
=>"|"
(reemplazar dígitos con tuberías)/x/g
=>" "
(reemplazar bloques sólidos con espacios)/y/g
=>"\"
(reemplazary
con barras invertidas)Por ejemplo:
Manifestación
Colaboradores:
4 bytes guardados gracias a Hedi
8 bytes guardados gracias a Not that Charles
fuente
.charCodeAt()
embargo, mis optimizaciones actuales no compensan el costo de los infames .new
ennew RegExp(e,'g')
y
ese no requiere escapar para su barra diagonal. 2. si se utiliza_
para la planta baja, todavía se puede diferenciar la parte superior con la expresión regular:/_ /
.PHP,
386376367364362358356 bytesprimer enfoque; aún puede ser golfable.
PHP,
366362361360357 bytesenfoque similar con una subfunción:
desglose para el segundo enfoque
+16 bytes si no se permiten nuevas líneas iniciales:
Reemplace
echo"$o[$y]\n;
conif($s=rtrim($o[$y]))echo"$s\n";
.-3 bytes para cualquiera de los
;<=>?[\]^_{|}~
escombros: Reemplace 1)($n=31&ord($c))
con$n
, 2)$n=28,$w='.'!=$c
con($n=31&ord($c))<27
y 3)4
con($n=28)/7
.Otro -8 para
>
,^
o~
como escombros: Deshacer 3)fuente
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 Bytes para los corchetesfor($y=36;$y--;)echo"$o[$y]\n";
; pero tengo un nuevo enfoque que guarda otros 2 bytes.use
solo funciona para funciones anónimas. ahorraría 2 bytes; pero tendría que almacenar esa función en una variable en$a=
lugar de darle un nombre (+3 bytes) y agregar un$
a cada una de las cuatro llamadas.Pyth,
9379 bytesPruébalo en línea. Banco de pruebas.
Explicación
Escondí esto por defecto ya que es demasiado largo.
Mostrar fragmento de código
fuente
Perl,
147146bytesIncluye +1 para
-p
Ejecutar con entrada en STDIN, p. Ej.
citysky.pl
:Funciona como se muestra, pero reemplaza los
\xhh
escapes por su valor literal para obtener la puntuación reclamada. Puede hacerlo usando esta línea de comando:Realmente no he explorado ningún otro enfoque, por lo que esto puede ser muy fácil de superar ...
fuente
Haskell, 289 bytes
fuente
Rubí, 245
Usted permite tantas líneas nuevas adicionales como desee, así que me estoy tomando la libertad con eso. Aparte de eso, el proceso es el siguiente:
a
.a[0]
/\/\
aa[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
, centre un_
| |
o/ \
del ancho adecuado (1+2*((h-t)/4
), dependiendo de sih-t%4==0
"|___|"
del ancho correcto aa[0]
a.reverse
Apuesto a que puedo hacerlo más pequeño si hago cálculos matemáticos para evitar
reverse
fuente
PHP, 297 bytes
Una versión más legible:
fuente