Como parte de un proyecto de planificación de la ciudad, se le asignó la tarea de crear un programa o función que muestre el horizonte de la ciudad, dado algunos aportes de los arquitectos. El proyecto solo está en la fase de inicio, por lo que un boceto muy aproximado es suficiente. El enfoque más fácil es, por supuesto, simplemente dibujar el horizonte en el arte ASCII.
Todos los edificios estarán junto al río, por lo tanto, todos están alineados. Los arquitectos darán la altura de cada edificio como entrada, y su código debe mostrar el horizonte.
La aportación de los arquitectos será un número entero o medio entero. Si el número es un entero, el edificio tendrá un techo plano, mientras que un medio entero dará como resultado un techo inclinado. Un cero solo será terreno plano. Las paredes de un edificio están separadas por 3 caracteres, mientras que un cero será de un solo carácter de ancho. Los edificios adyacentes comparten paredes.
Para obtener detalles y aclaraciones sobre la salida, consulte los ejemplos a continuación:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Entrada de ejemplo: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Entrada de ejemplo: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Los caracteres ASCII utilizados son: nueva línea, espacio y /\_|
(puntos de código 10, 32, 47, 92, 95, 124).
Reglas:
- Es opcional hacer un programa que solo tome enteros como entrada, multiplicando todos los números por dos. Entonces, en lugar de tomar
3 3.5 2
, su programa puede tomar6 7 4
. Si se elige el segundo formato de entrada, una entrada de 6 debería resultar en un edificio de 3 pisos, 7 debería ser un edificio de 3 pisos con techos inclinados, etc. - El resultado debe ser exactamente como se describe anteriormente, pero los espacios finales y las nuevas líneas están bien.
- El formato exacto de la entrada es opcional. Lo que sea mejor en tu idioma.
- El resultado debe mostrarse en la pantalla, para que los arquitectos puedan verlo.
- Puede suponer que habrá al menos un número entero dado, y que solo se proporcionará una entrada válida.
Este es codegolf, por lo que gana el código más corto en bytes.
Respuestas:
Python 2,
199193188185 bytesEste es un programa completo que acepta enteros como entrada. Ejemplo de entrada .
fuente
MATLAB,
219209203bytesEsto desafortunadamente no funciona en Octave . No estoy completamente seguro de por qué, parece tener algo que ver con el bit disp / flipud que se rompe.
Además, actualmente no hay una definición de cómo se ve un edificio de 0.5 de altura, ni ninguna mención de ellos, por lo que en este código supongo que están prohibidos.
El siguiente es el código de una manera un poco más legible:
Primero tomamos una entrada como una matriz y hacemos algunas inicializaciones variables.
Debido a que los edificios de altura cero son una molestia: básicamente terminan con un ancho que depende de lo que están al lado (aunque lo que está impreso no cambia), simplificamos las cosas al dibujar suficiente terreno para todos los edificios. Suponemos que cada edificio tendrá 4 caracteres de ancho (porque los edificios adyacentes se fusionan): los de altura cero no lo son, pero el exceso se recortará más adelante.
Ahora sacamos cada edificio a su vez.
Primero obtenemos la parte entera de la altura, ya que esto determinará cuántos '|' necesitamos.
Ahora dibuje en el muro de este edificio: si hay dos edificios adyacentes, el muro de este nuevo estará en la misma columna que el muro del último.
Verifique si se trata de un edificio de media altura. Si es así, entonces el techo será diferente. Para las medias alturas, el techo será
/ \
mientras que las de altura completa serán___
(Matlab replicará esto implícitamente desde un guión bajo, así que guarde un par de bytes allí). Hay un poco más de techo una fila más arriba para los edificios de media altura, por lo que también se agrega.Dibujar en el techo
Ahora vaya al inicio del próximo edificio y dibuje en el muro compartido (si el muro es demasiado corto en este punto, se agrandará cuando se dibuje el siguiente edificio). Tenga en cuenta que los edificios de altura cero son de 1 ancho, los edificios normales tienen 4 de ancho, por lo que simplificamos lo que de otro modo sería un if-else tratando (a> 0) como un número decimal y no un booleano.
Luego viene un poco de piratería informática para trabajar con edificios de altura cero. Básicamente, lo que dice esto es que si este edificio era de altura cero, y el anterior no era así, significa que el lugar del próximo edificio necesita incrementarse en 1 porque un edificio de altura cero intercalado entre otros dos edificios es efectivamente dos veces más ancho. representa el muro adicional que normalmente se comparte con un edificio adyacente. También hacemos un seguimiento de esta altura del edificio para hacer esta verificación la próxima vez.
Una vez hecho esto, voltea la matriz de construcción para que esté en la posición correcta y muéstrala. Tenga en cuenta que aquí también recortamos cualquier exceso de terreno.
Entonces, cuando ejecutamos este script, se nos pide nuestra entrada, por ejemplo:
Luego genera el edificio y muestra el resultado. Para la entrada anterior, se genera lo siguiente:
fuente
Kotlin,
447442 bytesVersión sin golf:
fuente
Python 2,
357306299294287281276 bytesEsto utiliza la codificación "duplicada", que se pasa a la función como una lista. Editar: bytes afeitados rehaciendo parte del gran condicional como un selector de matriz y cambiando a la codificación duplicada. Afeitó más bytes reorganizando aún más el condicional y convirtiendo más lógica a aritmética.
EDITAR: xsot es mejor
Explicación:
d
es 1 más que la longitud de la matriz, porque vamos a agregar ceros en cada extremo de la lista desde el segundo elemento hasta el cero que agregamos al final.h
es la altura del dibujo. (Tenemos que dividir por 2 en este cálculo porque estamos usando la representación duplicada, que usamos específicamente para evitar tener que lanzar flotadores a las entradas por todo el lugar. También agregamos 1 antes de dividir alturas tan extrañas - edificios puntiagudos-- obtener un poco más de espacio libre que el tipo normal.)o
es la cadena de salida.Un truco estándar para contraer un doble bucle for en un solo bucle for. Una vez que lo hagamos:
ahora hemos logrado lo mismo que:
pero de una manera que nos proporciona diez bytes guardados (incluido el espacio en blanco en las siguientes líneas).
Pegue una pared en cualquier momento en que la altura del edificio actual o del edificio anterior sea más alta que la línea actual, siempre que haya al menos un límite de edificio aquí. Es el equivalente del siguiente condicional:
donde b es la altura de exploración actual, a es la altura actual del edificio y c es la altura anterior del edificio. La última parte del condicional evita poner muros entre los espacios del suelo.
Esta es la parte que dibuja el techo correcto, seleccionando las partes del techo comparando la altura del edificio con la altura de escaneo actual. Si un techo no va aquí, imprime un número apropiado de espacios (3 cuando es un edificio real, por ejemplo, a> 0, de lo contrario 1). Tenga en cuenta que cuando estamos a nivel del suelo, nunca intenta dibujar un techo, lo que significa que los edificios de tamaño 0.5 no tienen techos puntiagudos. Oh bien.
Cuando estamos a nivel del suelo, queremos guiones bajos en lugar de espacios. Simplemente los reemplazamos todos a la vez aquí.
Justo antes de comenzar a procesar la siguiente línea, imprima la actual y borre la línea de salida. Cortamos el último carácter porque es la "_" correspondiente al espacio de tierra que agregamos agregando un cero al comienzo de la función. (Agregamos ese cero para que no tengamos que agregar un caso especial para insertar una pared derecha, si existe, que agregaría mucho más código del que agregamos agregando el 0 y cortando el "_".)
fuente
Python 3
725 bytes608 bytes
Código de golf:
Aquí está el código sin golf. Hay algunos comentarios, pero la idea básica es crear edificios con paredes dobles, de modo que el resultado final sea el siguiente:
Luego, para obtener índices de esas paredes dobles y eliminar esas columnas, obtenemos:
Código:
¡Es hora de jugar al golf!
fuente
ru(n):return math.ceil(n)
como el golf, pero aún así ... Por favor, no tome esto de manera negativa, no soy un buen golfista, y seguro que no un buen programador. Te sugiero que trates de mejorarlo un poco ... Es realmente divertido una vez que te das cuenta de que logras acortarlo. Pasé de muchos muchos a 120 a 55 hace unos días. Entonces es posible incluso si eres nuevo en eso.PHP,
307297293 bytesToma argumentos * 2 de la línea de comando. guardar en archivo, ejecutar con
php <filename> <parameters>
.Descompostura
fuente
C ++, sin golf
(o tal vez no golfable)
Suponiendo que hay menos de 100 elementos y cada elemento es menor que 100.
s
es el número de edificios (requerido en la entrada).fuente