Esse desafio é inspirado nesta resposta no Ask Ubuntu Stack Exchange.
Introdução
Lembre-se do protetor de tela do Windows ME com os canos ? Hora de trazer de volta a nostalgia!
Desafio
Você deve escrever um programa ou função que produza uma representação ASCII do protetor de tela. No protetor de tela, deve haver um único tubo que crescerá em direções semi-aleatórias.
O início do tubo será colocado aleatoriamente em qualquer uma das bordas da tela e a peça do tubo deverá ser perpendicular à borda (os primeiros tubos de canto podem ser horizontais ou verticais). Cada tique que o cano crescerá na direção em que está voltado (horizontal / vertical) com uma 80%
chance ou fará um canto com uma 20%
chance.
Representação de tubulação
Para criar o canal, 6 caracteres unicode serão usados
─ \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
O programa / função terá 3 valores de entrada, que podem ser coletados através de parâmetros de função ou solicitados ao usuário.
- Quantidade de carrapatos
- Largura da tela
- Altura da tela
Quantidade de carrapatos
Para cada escala, um pedaço de tubo será adicionado à tela. Os canos substituirão os pedaços de canos antigos se aparecerem na mesma posição.
Por exemplo, pegue uma tela de tamanho 3x3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Sempre que um tubo sai da tela, como no último exemplo, com 5 tiques, um novo tubo aparecerá em uma borda aleatória. Por exemplo:
ticks == 6
│┐
└┘
─
O novo tubo deve ter 50% de chance de ser horizontal ou vertical.
Largura / altura da tela
A largura e a altura da tela podem ser combinadas em um único valor, se preferir no seu idioma preferido. A largura e a altura da tela sempre terão um valor mínimo de 1 e um valor máximo de 255. Se o idioma de sua escolha suportar um console ou uma tela de saída menor que uma grade de caracteres de 255x255, você poderá assumir que a largura e a altura serão nunca exceda os limites do seu console. (Exemplo: janela Windows 80x25 cmd)
Resultado
A saída do seu programa / função deve ser impressa na tela ou retornada de uma função. Para cada execução do seu programa, um conjunto diferente de pipes deve ser gerado.
Casos de teste
Os seguintes casos de teste são todos exemplos aleatórios de saídas válidas
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
Obviamente, quanto mais ticks ocorrerem, mais difícil será provar a validade do seu programa. Portanto, é preferível postar um gif da sua saída em execução. Se isso não for possível, publique uma versão do seu código que inclua a impressão da saída. Obviamente, isso não conta para a sua pontuação.
Regras
- Este é o código-golfe , a menor quantidade de bytes ganha
- Aplicam-se brechas padrão
- Se você usar os caracteres de canal unicode no seu código-fonte, poderá contá-los como um único byte
Esse é um desafio bastante difícil que pode ser resolvido de várias maneiras criativas; você deve escrever uma resposta em uma linguagem mais detalhada, mesmo que já haja respostas em pequenos intervalos. Isso criará um catálogo de respostas mais curtas por idioma. Upvotes de bônus para gifs coloridos de fantasia;)
Feliz golfe!
Isenção de responsabilidade: Estou ciente de que os caracteres Unicode não são ASCII, mas, na falta de um nome melhor, chamo apenas de arte ASCII. Sugestões são bem-vindas :)
ascii-art
vez degraphical-output
- referênciaRespostas:
JavaScript (ES6), 264
266 274 281Contando caracteres de desenho unicode como 1 byte cada. (Conforme especificado pelo OP)
Menos golfe
Teste animado
Nota: ao tentar manter o tempo da animação em menos de 30 segundos, mais truques tornam o ritmo da animação mais rápido
fonte
Nada diz nostalgia como ...
QBasic, 332 bytes
QBasic é o idioma certo para a tarefa porque:
LOCATE
permite imprimir em qualquer local da tela, substituindo o que havia anteriormenteEspecíficos
Esse é o QBasic, escrito e testado no QB64 com o autoformatting desativado. Se você digitar / colá-lo no real QBasic IDE, ele irá adicionar um monte de espaços e expandir
?
emPRINT
, mas ele deve ser executado exatamente o mesmo.O programa insere três valores separados por vírgula: ticks, largura e altura. Ele então pede uma semente de número aleatório. (Se esse comportamento não for aceitável, altere a segunda linha
RANDOMIZE TIMER
para +6 bytes.) Finalmente, ele desenha os pipes na tela.As dimensões máximas que podem ser inseridas são 80 (largura) por 25 (altura). Dar uma altura de 25 resultará no corte da linha inferior quando o QBasic disser "Pressione qualquer tecla para continuar".
Quão?
TL; DR: Muita matemática.
A linha e coluna atuais são
r
ec
; a direção atual éd
e a direção anterior éb
. Os valores de direção 0-3 estão abaixo, direita, cima, esquerda. A aritmética converte esses valores nos valores de passo corretos parar
ec
, assim como nas coordenadas de arestas corretas para iniciar.Os caracteres de desenho da caixa
│┐└─┘┌
são os pontos de código 179, 191, 192, 196, 217 e 218 no QBasic. Eles parecem bastante aleatórios, mas ainda assim usaram menos caracteres para gerar os números com alguma matemática (bastante complicada, não sei ao certo se compreendo) do que para fazer um monte de instruções condicionais.O código para mudar de direção gera um número aleatório entre -0,125 e 1,125 e toma seu andar. Isso fornece
-1
10% do tempo,0
80% do tempo e1
10% do tempo. Em seguida, adicionamos isso ao valor atual ded
, mod 4. Adicionar 0 mantém a direção atual; adicionar +/- 1 faz uma curva.Quanto ao fluxo de controle, o
WHILE t ... WEND
é o loop principal; a seção anterior a ela, começando com o número da linha1
(1b=INT(RND*4)
), reinicia o tubo em uma aresta aleatória. Semprer
ec
está fora da janela, nósGOTO 1
.Mostre-me o GIF!
Aqui está:
Isso foi gerado por uma versão não-destruída com animação, cor e uma semente aleatória automática:
fonte
Python 2,7,
624616569548552 bytesO primeiro parâmetro é uma semente, as mesmas sementes geram a mesma saída, imprimindo cada etapa com um atraso de 500 ms.
substitua
Exemplo de execução
irá produzir
versão detalhada
fonte
if x*y<0 or
.0.5
pode ser reduzido para.5
.import *
poderia serimport*
.''.join(k) for
possui um espaço em branco inútil. Você também deve poder manterdict
uma variável e chamá-la sempre que usá-la. Ainda não testei quanto isso economiza, mas salvando odict(zip(a,b))
em um lambda que faz o trabalho por duas strings (a, b), ele deve cortar um pouco. +1.C (GCC / linux),
402353352302300298296288 bytesAgradecemos a edc65 por armazenar a direção em um único número de 4 bits.
Lê uma largura / altura no stdin antes de fazer o loop do protetor de tela para sempre. Por exemplo:
Ou para um protetor de tela em tela cheia:
Para facilitar a leitura, adicionei novas linhas. Requer uma máquina Linux com um terminal respeitando os códigos ANSI. Tem cores! Se você remover o suporte de cores, custará 17 bytes a menos.
fonte
Rubi,
413403396 bytesUma função que recebe vários ticks e uma largura como entrada e retorna a tela final como uma string. Sem dúvida, poderia ser jogado mais.
Veja-o em repl.it: https://repl.it/Db5h/4
Para vê-lo em ação, insira o seguinte após a linha que começa
b[n*w+n+m]=
:... então atribua o lambda a uma variável, por exemplo,
pipes=->...
e chame-a comopipes[100,20]
(para 100 ticks e uma tela 20x20).Ungolfed & explicação
fonte