Dado um número inteiro positivo N ("viralidade"), seu programa deve criar um desenho de uma árvore com arte ASCII com dois ramos de comprimento N estendendo-se para baixo e / ou para a direita a partir do canto superior esquerdo.
A direção adotada por cada ramo após o primeiro asterisco pode ser para a direita ou para baixo, e essa escolha deve ser feita aleatoriamente 1 a cada passo seguinte.
Por exemplo, dada uma entrada 5, a saída pode se parecer com:
***
* ***
**
**
Os dois ramos têm permissão para tocar (estar nas células adjacentes), mas não se sobrepõem (estar na mesma célula), portanto, o seguinte não seria permitido:
***
* *
*****
*
*
Exemplos
Para entrada 1
, a única saída possível é:
**
*
(Isso estará presente em todas as saídas válidas, pois ter as duas ramificações no mesmo caminho causaria a sobreposição.)
Possíveis saídas para uma entrada de 3
incluem:
***
* *
**
**
***
*
*
Para entrada 7
:
****
* **
* **
*
***
*
Para entrada 10
:
****
* *
*********
*
*****
Isso é código-golfe , então a resposta mais curta e válida (em bytes) vence.
1. Isso deve ser aleatório uniformemente (ou seja, 50/50 de chance para cada direção) ou o mais próximo possível de ser aleatório uniformemente possível no hardware normal.
0
s e1
s em vez de espaços e asteriscos?Respostas:
CJam ,
5851 bytesExperimente online!
A idéia básica é que começamos com
[0 0]
e depois adicionemos 0 ou 1 repetidamente a cada elemento (certificando-se de que eles nunca sejam iguais, exceto no início, para evitar sobreposição), coletando todos os resultados intermediários.Em seguida, criamos uma grande variedade de matrizes, onde cada sub-matriz contém
*
índices fornecidos pelo par correspondente na matriz original e espaços em qualquer outro lugar.Isso gera fatias diagonais da matriz de saída (onde mover da esquerda para a direita corresponde a mover da direita para a esquerda na matriz real).
Podemos então usar
::a:.+
para "des diagonalizar" e obter as linhas resultantes:fonte
Carvão ,
3124 bytesExperimente online! Link é a versão detalhada do código. Originalmente, eu pensei que seria mais fácil tornar o primeiro passo aleatório, mas acabou sendo mais golfista para tornar o primeiro ramo previsível. Explicação:
Loop duas vezes, usando a variável index
i
. (Na verdade, ele itera sobre uma lista implícita, por isso é seguro alternari
dentro do loop.)Ir para a origem da tela.
N+1
Tempos de loop .Imprima a
*
, mas deixe o cursor para a direita ou abaixo do cursor, dependendo do valor dei
.Aleatoriamente o valor de
i
para a próxima iteração do loop interno.Se o caractere atual é a
*
, isso significa que somos o segundo ramo e descemos ao invés do direito, então mova para a direita para corrigir isso. (O primeiro ramo sempre começa para baixo, portanto o segundo ramo sempre estará acima dele, o que significa que precisamos apenas verificar uma colisão vertical.)fonte
N
ramos -sized, masN-1
tamanho :)Java 10,
273272268239 bytesExperimente online aqui .
Agradecimentos a Kevin Cruijssen por jogar 29 bytes.
Versão não destruída:
fonte
do{}
um pouco (e coloquei as entradas na primeira parte do loop for). PS: Na sua resposta inicial, também0.5
poderia ter sido.5
Perl 5 ,
208124122118 bytes118 bytes sem novas linhas, recuo e comentários. Toma N de stdin:
Experimente online!
fonte
2..$N
para1..shift
agora e também retirei alguns bytes.<>
e inserir, em vez deshift
argumentos, bem como reordená-lorand
para evitar os parênteses. Você também não precisa encerrar sua tarefa@o
. Eu tentei usar o@b=([],[]);
que parece funcionar, mas eu não experimentei muito, então talvez eu tenha esquecido um caso básico lá. Espero que eles ajudem um pouco!Python 2 , 204 bytes
Experimente online!
fonte
Perl 5
-a
,97969392 bytesNão possui viés diagonal à direita, para baixo ou para fora.
Experimente online!
fonte
PHP, 118 bytes
requer PHP 5.4 ou posterior para o operador Elvis. Substitua
?:
com?1:
PHP mais velho.Execute como pipe
-nR
ou experimente online .fonte
$argBak=$argn=
$argn
. Em um ambiente real,$argn
vem do STDIN se você o executa como um pipe-R
. Ela irá então executar o código para cada linha de entrada (mas estou certo de PHP não resetar as variáveis inbetween, assim explícitas corridas consecutivas são mais propensos a evitar surpresas ruins.)Vermelho ,
195190 bytesExperimente online!
Legível:
fonte
Geléia ,
504341 bytesExperimente online!
Foi realmente divertido escrever isso. Poderia haver algum método muito mais ideal. Provavelmente, também há golfe a fazer dentro deste método.
Logo após eu postar isso, percebi que poderia usar em
,þ`
vez deaþ,""oþ`Ɗ
.fonte
R ,
148142 bytesExperimente online!
Além disso, embora não atenda às especificações de saída, você pode distinguir os dois ramos: Experimente online!
Explicação:
A partir do índice
1
, selecionamos aleatoriamente um movimento para a direita ou para a esquerda para ramificaçãor
adicionandon
ou1
, respectivamente. Em seguida, selecionamos outro movimento à direita ou à esquerda para ramificaçãok
e, se ele se cruzar para onder
está indo, selecionamos a outra direção. Em seguida, usamosr
ek
como índices emm
, definindo esses valores como"*"
. Repetindo osn-1
tempos, imprimimos o resultado.fonte
Geléia ,
3938 bytesExperimente online!
Embora aparentemente não relacionado,
d
é útil aqui para salvar um byte (sobre minha abordagem anterior).fonte
Python 2 ,
191187176 bytesExperimente online!
O Python possui suporte nativo para números complexos do formulário
a+bj
; isso torna alguns problemas 2D um pouco mais tratáveis ...fonte