Dado un número entero positivo N ("viralidad"), su programa debe crear un dibujo ASCII de un árbol con dos ramas de longitud N que se extiendan hacia abajo y / o hacia la derecha desde la esquina superior izquierda.
La dirección tomada por cada rama después del primer asterisco puede ser hacia la derecha o hacia abajo, y esta elección debe hacerse al azar 1 en cada paso siguiente.
Por ejemplo, dada una entrada de 5, la salida podría verse así:
***
* ***
**
**
Las dos ramas pueden tocar (estar en celdas adyacentes), pero no superponerse (estar en la misma celda), por lo que no se permitiría lo siguiente:
***
* *
*****
*
*
Ejemplos
Para la entrada 1
, la única salida posible es:
**
*
(Esto estará presente en todas las salidas válidas, ya que hacer que las dos ramas tomen el mismo camino provocaría que se superpongan).
Las salidas posibles para una entrada de 3
incluyen:
***
* *
**
**
***
*
*
Para entrada 7
:
****
* **
* **
*
***
*
Para entrada 10
:
****
* *
*********
*
*****
Este es el código de golf , por lo que gana la respuesta válida más corta (en bytes).
1. Esto debería ser aleatorio de manera uniforme (es decir, una probabilidad de 50/50 de cada dirección), o tan aleatorio como sea posible en un hardware normal.
0
s y1
s en lugar de espacios y asteriscos?Respuestas:
CJam ,
5851 bytesPruébalo en línea!
La idea básica es que comencemos
[0 0]
y luego agreguemos repetidamente 0 o 1 a cada elemento (asegurándonos de que nunca sean iguales excepto al principio para evitar la superposición), recopilando todos los resultados intermedios.Luego creamos una gran variedad de matrices donde cada subconjunto contiene
*
índices dados por el par correspondiente en la matriz original y espacios en cualquier otro lugar.Esto produce cortes diagonales de la matriz de salida (donde moverse de izquierda a derecha corresponde a moverse de arriba a derecha a abajo a la izquierda en la matriz real).
Luego podemos usar
::a:.+
para "des-diagonalizar" y obtener las líneas resultantes:fuente
Carbón ,
3124 bytesPruébalo en línea! El enlace es a la versión detallada del código. Originalmente pensé que sería más fácil hacer que el primer paso fuera aleatorio, pero resultó ser más golfista hacer que la primera rama fuera predecible. Explicación:
Bucle dos veces, utilizando la variable de índice
i
. (Esto en realidad itera sobre una lista implícita, por lo que es seguro mutari
dentro del bucle).Salta al origen del lienzo.
N+1
Tiempos de bucle .Imprima a
*
, pero deje el cursor a la derecha o debajo del cursor según el valor dei
.Aleatorice el valor de
i
para la próxima iteración del bucle interno.Si el personaje actual es un
*
, esto significa que somos la segunda rama y bajamos en lugar de la derecha, así que sube a la derecha para corregir eso. (La primera rama siempre comienza hacia abajo, por lo que la segunda rama siempre estará por encima de ella, lo que significa que solo necesitamos verificar una colisión vertical).fuente
N
ramas no de tamaño, pero deN-1
tamaño :)Java 10,
273272268239 bytesPruébelo en línea aquí .
Gracias a Kevin Cruijssen por jugar al golf 29 bytes.
Versión sin golf:
fuente
do{}
un poco (y coloqué las entradas en la primera parte del ciclo for). PD: En su respuesta inicial, también se0.5
podría haber jugado golf.5
.Perl 5 ,
208124122118 bytes118 bytes sin líneas nuevas, sangría y comentarios. Toma N de stdin:
Pruébalo en línea!
fuente
2..$N
a1..shift
ahora y también recorté algunos bytes.<>
y entrada en lugar deshift
argumentos, así como reordenar si llamarand
para evitar los parens. No debería necesitar ajustar su tarea a@o
ninguno de los dos. Intenté usar el@b=([],[]);
que parece funcionar, pero no experimenté demasiado, así que podría haber perdido un caso límite allí. Espero que ayuden un poco!Python 2 , 204 bytes
Pruébalo en línea!
fuente
Perl 5
-a
,97969392 bytesNo tiene sesgo diagonal derecha, abajo o fuera.
Pruébalo en línea!
fuente
PHP, 118 bytes
requiere PHP 5.4 o posterior para el operador de Elvis. Reemplazar
?:
con?1:
PHP anterior.Ejecutar como tubería
-nR
o probarlo en línea .fuente
$argBak=$argn=
$argn
. En un entorno real,$argn
proviene de STDIN si lo ejecuta como una tubería-R
. Luego ejecutará el código para cada línea de entrada (pero estoy bastante seguro de que PHP no desarma las variables intermedias; por lo tanto, es más probable que las ejecuciones consecutivas explícitas eviten malas sorpresas.)Rojo ,
195190 bytesPruébalo en línea!
Legible:
fuente
Jalea ,
504341 bytesPruébalo en línea!
Fue muy divertido escribirlo. Podría haber algún método mucho más óptimo. Probablemente también hay algo de golf que hacer dentro de este método.
Justo después de publicar esto, me di cuenta de que podía usarlo en
,þ`
lugar deaþ,""oþ`Ɗ
.fuente
R ,
148142 bytesPruébalo en línea!
Además, aunque no cumple con las especificaciones de salida, puede distinguir las dos ramas: ¡ Pruébelo en línea!
Explicación:
Comenzando desde el índice
1
, seleccionamos aleatoriamente un movimiento hacia la derecha o hacia la izquierda para la ramar
agregandon
o1
, respectivamente. Luego seleccionamos otro movimiento hacia la derecha o hacia la izquierda para la ramak
, y si se cruzara a donder
va, seleccionamos la otra dirección. Luego usamosr
yk
como índices enm
, estableciendo esos valores como"*"
. Iterandon-1
tiempos, imprimimos el resultado.fuente
Jalea ,
3938 bytesPruébalo en línea!
Aunque aparentemente no
d
está relacionado, es útil aquí para guardar un byte (sobre mi enfoque anterior).fuente
Python 2 ,
191187176 bytesPruébalo en línea!
Python tiene soporte nativo para números complejos del formulario
a+bj
; Esto hace que algunos problemas 2D sean un poco más manejables ...fuente