Este desafío está inspirado en esta respuesta en Ask Ubuntu Stack Exchange.
Introducción
¿Recuerdas el protector de pantalla de Windows ME con las tuberías ? ¡Es hora de recuperar la nostalgia!
Desafío
Debe escribir un programa o función que genere una representación ASCII del protector de pantalla. En el protector de pantalla debe haber una sola tubería que crecerá en direcciones semi aleatorias.
El inicio de la tubería se colocará al azar en cualquiera de los bordes de la pantalla y la pieza de la tubería debe ser perpendicular al borde (las primeras tuberías de la esquina pueden ser horizontales o verticales). Cada tictac la tubería crecerá en la dirección que está mirando (horizontal / vertical) en una 80%
oportunidad o tomar una esquina en una 20%
oportunidad.
Representación de tubería
Para crear la tubería, se utilizarán 6 caracteres unicode
─ \u2500 horizontal pipe
│ \u2502 vertical pipe
┌ \u250C upper left corner pipe
┐ \u2510 upper right corner pipe
└ \u2514 lower left corner pipe
┘ \u2518 lower right corner pipe
Entrada
El programa / función tomará 3 valores de entrada, que se pueden recopilar a través de parámetros de función o solicitar al usuario.
- Cantidad de garrapatas
- Ancho de pantalla
- Altura de la pantalla
Cantidad de garrapatas
Por cada tic, se agregará un trozo de tubería a la pantalla. Las tuberías sobrescribirán las piezas de tubería viejas si se generan en la misma posición.
Por ejemplo, tome una pantalla de tamaño 3x3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Cada vez que una tubería sale de la pantalla, como en el último ejemplo con 5 ticks, se generará una nueva tubería en un borde aleatorio. Por ejemplo:
ticks == 6
│┐
└┘
─
La nueva tubería debe tener un 50% de posibilidades de ser horizontal o vertical.
Ancho / alto de pantalla
El ancho y la altura de la pantalla se pueden combinar en un solo valor si eso es preferible en el idioma que elija. El ancho y la altura de la pantalla siempre tendrán un valor mínimo de 1 y un valor máximo de 255. Si su idioma de elección admite una consola o pantalla de salida que sea más pequeña que una cuadrícula de caracteres 255x255, entonces puede suponer que el ancho y la altura serán nunca exceda los límites de su consola. (Ejemplo: ventana de Windows 80x25 cmd)
Salida
El resultado de su programa / función debe imprimirse en la pantalla o devolverse desde una función. Para cada ejecución de su programa, se debe generar un conjunto diferente de tuberías.
Casos de prueba
Los siguientes casos de prueba son ejemplos aleatorios de resultados válidos
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
Obviamente, cuantos más ticks hayan ocurrido, más difícil será probar la validez de su programa. Por lo tanto, se preferirá publicar un gif de su salida en ejecución. Si esto no es posible, publique una versión de su código que incluya la impresión de la salida. Obviamente, esto no contará para su puntaje.
Reglas
- Este es el código de golf , gana la menor cantidad de bytes
- Se aplican lagunas estándar
- Si usa los caracteres de canalización Unicode en su código fuente, puede contarlos como un solo byte
Este es un desafío bastante difícil que puede resolverse de muchas maneras creativas, se le recomienda escribir una respuesta en un lenguaje más detallado, aunque ya hay respuestas en breves palabras. Esto creará un catálogo de respuestas más cortas por idioma. Votos de bonificación para gifs de colores elegantes;)
¡Feliz golf!
Descargo de responsabilidad: soy consciente de que los caracteres Unicode no son ASCII, pero a falta de un nombre mejor, simplemente lo llamo arte ASCII. Las sugerencias son bienvenidas :)
ascii-art
lugar degraphical-output
- referenciaRespuestas:
JavaScript (ES6), 264
266 274 281Contando caracteres de dibujo unicode como 1 byte cada uno. (Según lo especificado por OP)
Menos golf
Prueba animada
Nota: al tratar de mantener el tiempo de animación por debajo de 30 segundos, más grosores hacen que la animación avance más rápido
fuente
Nada dice nostalgia como ...
QBasic, 332 bytes
QBasic es el lenguaje correcto para la tarea porque:
LOCATE
le permite imprimir en cualquier lugar de la pantalla, sobrescribiendo lo que estaba allí anteriormenteDetalles específicos
Este es QBasic golfizado, escrito y probado en QB64 con autoformato desactivado. Si escribe / pega en el IDE real QBasic, añadirá un montón de espacios y ampliar
?
enPRINT
, pero debería funcionar exactamente igual.El programa ingresa tres valores separados por comas: ticks, ancho y alto. Luego pide una semilla de número aleatorio. (Si este comportamiento no es aceptable, cambie la segunda línea a
RANDOMIZE TIMER
+6 bytes). Finalmente, dibuja las tuberías en la pantalla.Las dimensiones máximas que se pueden ingresar son 80 (ancho) por 25 (alto). Al dar una altura de 25, la fila inferior se cortará cuando QBasic diga "Presione cualquier tecla para continuar".
¿Cómo?
TL; DR: Muchas matemáticas.
La fila y columna actuales son
r
yc
; la dirección actual esd
y la dirección anterior esb
. Los valores de dirección 0-3 son abajo, derecha, arriba, izquierda. La aritmética los traduce a los valores de paso correctos parar
yc
, así como a las coordenadas de borde correctas para comenzar.Los caracteres del cuadro de dibujo
│┐└─┘┌
son puntos de código 179, 191, 192, 196, 217 y 218 en QBasic. Esos parecen bastante aleatorios, pero aún usaba menos caracteres para generar los números con algunas matemáticas (bastante complicadas, no estoy seguro, ni siquiera lo entiendo) que para hacer un montón de declaraciones condicionales.El código para cambiar de dirección genera un número aleatorio entre -0.125 y 1.125 y toma su piso. Esto da el
-1
10% del tiempo, el0
80% del tiempo y el1
10% del tiempo. Luego agregamos esto al valor actual ded
, mod 4. Agregar 0 mantiene la dirección actual; Agregar +/- 1 hace un giro.En cuanto al flujo de control, el
WHILE t ... WEND
es el bucle principal; la sección anterior, comenzando con el número de línea1
(1b=INT(RND*4)
), reinicia la tubería en un borde aleatorio. Cuandor
yc
estamos fuera de la ventana, nosotrosGOTO 1
.¡Muéstrame el GIF!
Aqui tienes:
Esto fue generado por una versión un tanto descuidada con animación, color y una semilla aleatoria automática:
fuente
Python 2.7,
624616569548552 bytesEl primer parámetro es una semilla, las mismas semillas generarán la misma salida, imprimiendo cada paso con un retraso de 500 ms.
responde
Ejecución de ejemplo
saldrá
versión detallada
fuente
if x*y<0 or
.0.5
se puede reducir a.5
.import *
podría serimport*
.''.join(k) for
tiene un espacio en blanco inútil. También debe poder mantenerdict
una variable y llamarla cada vez que la use. No he probado cuánto ahorra esto, pero al guardarlodict(zip(a,b))
en una lambda que hace el trabajo para dos cadenas (a, b), debería cortar un poco. +1.C (GCC / Linux),
402353352302300298296288 bytesCrédito a edc65 por almacenar la dirección en un solo número de 4 bits.
Lee un ancho / alto en stdin antes de repetir el protector de pantalla para siempre. P.ej:
O para un protector de pantalla a pantalla completa:
Para facilitar la lectura, agregué nuevas líneas. Requiere una máquina Linux con una terminal que respete los códigos ANSI. Tiene colores! Si elimina el soporte de color, cuesta 17 bytes menos.
fuente
Ruby,
413403396 bytesUna función que toma una serie de ticks y un ancho como entrada y devuelve la pantalla final como una cadena. Sin duda podría jugar más golf.
Véalo en repl.it: https://repl.it/Db5h/4
Para verlo en acción, inserte lo siguiente después de la línea que comienza
b[n*w+n+m]=
:... luego asigne el lambda a una variable, por ejemplo,
pipes=->...
y llámelo comopipes[100,20]
(para 100 ticks y una pantalla de 20x20).Sin golfos y explicación
fuente