Desafio
Inspirados por esse desafio e pelo desagradável furacão Matthew , estaremos gerando alguns relâmpagos dinamicamente.
n
= 15:
\
/\
/ \
/ /
/\ /\
/ \ \
/ / /\
/\ \
/ / \
/\ \ /\
/ \ \
/\ /
\
\
/\
Entrada
Número inteiro positivo n
determina a profundidade do raio.
Regras e restrições
/
e\
deve ser usado- A probabilidade que guia a direção do raio é a seguinte:
- 25% Divide-se em 2 caminhos
- Caminho de 25% atinge o beco sem saída
- 25% vão para a esquerda
- 25% dá certo
- Existem algumas exceções sobre sobreposição e beco sem saída abaixo:
- O código não deve ser determinístico, um novo raio deve ser gerado aleatoriamente toda vez
- Os parafusos não devem se sobrepor: por exemplo, se já houver um parafuso à esquerda do parafuso atual, o parafuso atual deve terminar ou ir para a direita, mas não para a esquerda ou dividir (a probabilidade ainda se aplica, neste caso, se torna 50% final / 50% à direita)
- Se não existir outro caminho de divisão disponível, o caminho não deverá terminar: por exemplo, no início, quando houver apenas 1 caminho, o caminho não deverá terminar até que seja dividido, também se aplica quando houver vários caminhos, mas todos, exceto um caminho, estiverem mortos. , (a probabilidade se torna 33% dividida / 33% esquerda / 33% direita) sua meta é chegar ao fundo
- Espaços em branco podem ser adicionados à esquerda (tudo o que você precisa deve ser apenas altura 1)
- No entanto, você deseja gerar o parafuso, você pode ir de baixo para cima, da esquerda para a direita, etc. Desde que todas as regras acima sejam atendidas
Outro exemplo
n
= 10
\
/
\
/\
/\
/ /
/\ \
/ /\
\ \
/
Fique seguro e divirta-se jogando golfe! Golfe com responsabilidade apenas quando estiver em uma área segura!
Stay safe and have fun golfing!
Talvez também especifique que, se o EAS ocorrer, abandone tudo e siga as ordens! Código de golfe não é sua prioridade em tal situação.\/
a qualquer momento.Respostas:
Perl,
92908984 bytesInclui +1 para
-n
Dê altura em STDIN:
bolt.pl
:Explicação
Se você chamar o deslocamento do ponto inicial 0 (um ponto está no canto de uma caixa de caractere), na próxima linha você poderá ter ido para a esquerda ou direita (ou não) e poderá acabar com pontos em compensações
-1,1
. A próxima linha fornece os-2,0,2
possíveis desvios, etc. Eles diferem por 2. Se você chamar o caractere para o canto inferior esquerdo de um ponto par e o caractere para o canto inferior direito, você poderá estender isso para atribuir pares ou ímpares a cada posição do personagem em uma fileira que alterna par e ímpar (na verdade, todo o plano é lado a lado em um padrão quadriculado). Uma posição par pode ter um/
ou, uma posição ímpar pode ter
\
ou.
O personagem imediatamente antes de a
/
está em uma posição ímpar, de modo que pode ser um\
ou outro, mas
\/
é proibido apenas para queseja possível. Da mesma forma, o caractere após a
\
deve ser a(assumindo que a linha seja preenchida com espaços suficientes à esquerda e à direita, para que os limites da linha não sejam problema). Assim, um raio continua na próxima linha sempre diretamente abaixo de a
\
ou abaixo de a/
. Em qualquer caso, o ponto mais baixo está no meio e a fileira seguinte pode ter um de,
/
,\
ou/\
directamente abaixo da parte superior 2 caracteres. Então, para gerar a próxima linha, posso simplesmente substituir qualquer\
ou/
por qualquer uma dessas 4 expansões com igual probabilidade (você também pode substituir independentemente o primeiro caractere porou
/
e o segundo caractere porou
\
). Em perl, você pode fazer isso com algo como:Se a linha resultante no entanto contém
\/
(proibido juntar-se) ou não/
ou\
em todos (dies parafuso e não chegar ao fundo), o resultado é inválido. Nesse caso, jogo fora toda a linha e simplesmente tento novamente. Sempre existe uma continuação válida e, se você tentar com frequência, será encontrada uma (por exemplo, tudo morre, exceto 1 fluxo). Essa é uma distribuição de probabilidade um pouco diferente do algoritmo anti-sobreposição sugerido, mas acho que isso é realmente melhor, pois não possui viés direcional. A validade pode ser testada de maneira golfista usandoO problema aqui é que a substituição aleatória é muito lenta e todas essas
\
fugas também comem bytes. Por isso, decidi construir minhas linhas usando cadeias de dígitos e substituir os dígitos apropriados por,
/
e\
pouco antes da impressão. A substituição aleatória básica éo que dá uma das
53
,55
,61
ou63
com igual probabilidade. Eu então interpreto5
e1
como,
3
como\
e6
como/
. Isso explica a impressão da linha:Em uma competição de golfe séria, eu começaria a explorar sistematicamente fórmulas mágicas alternativas, mas isso deve ser muito bom (a menos de 3 bytes do ideal)
O restante dos componentes do programa:
Isso inicializa
$_
(veja o próximo mapa) para espaços de altura seguidos por a/
. Esta é uma linha invisível acima da primeira que está sendo impressa e garante que o campo seja amplo o suficiente para que o parafuso nunca fique sem espaço à esquerdaEu processarei essa mesma altura inicial da string vezes imprimindo uma nova linha a cada vez
Salve a linha atual em
$;
. Se a substituição for uma restauração inválida$_
de$;
Faça a substituição real. Não preciso verificar o que é antes
/
ou depois,\
pois deve ser um espaço. Isso é conveniente, pois o espaço pode ser representado por um1
ou por um5
. Como eu apenas coloquei a corda à esquerda, o espaço após a\
continuação ainda pode estar ausente, portanto, torne esse caractere opcionalVerifique se a nova linha é válida
fonte
perl -M5.010 main.pl <<< 25
, eu tenho conseguido ótimos resultados!-n
, porque o espaço e o traço também contam. A mesma regra é para argumentos de linha de comando. Veja "Invocações Especiais", segundo ponto-marcador: conto-os como uma diferença na contagem de caracteres até a menor invocação equivalente sem eles.-nE
apenas 1 caractere a mais-E
. (Consulte o artigo que você referenciou. Isso também elimina a necessidade-M5.010
) Eu sempre apresento meu código como arquivos porque é mais conveniente, mas sempre conto opções como esta: Se puder ser executado a partir da linha de comando, não conto o espaço e o traço. Se ele deve estar em um arquivo (por exemplo, porque ele usado$0
) , conto o espaço e o traço-E
. Se sim, você é bom.JavaScript (ES6), 154 bytes
Eu lutei com a implementação até ver a resposta do @ TonHospel, quando ela apenas degenerou em uma porta. Saída de amostra:
fonte