Esta competição acabou. Obrigado pelas entradas interessantes que não são esolang e parabéns a Jakuje pelo envio vencedor do JavaScript.
Na grande tradição dos Desafios de Arte ASCII neste site, aqui está outro. Dada uma entrada, desenhe uma espiral.
&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<
Simples, sim? Heh, heh, heh ... Sim ...
(Inspirado na postagem ASCII Dragons Curve e na postagem ASCII Art of the Day do Optimizer )
Entrada
A entrada será na forma de uma série de parâmetros, extraídos do argumento STDIN / função usual / etc., Qualquer que seja seu idioma equivalente, composto por quatro partes. Essas partes podem ser quatro argumentos separados, um quádruplo, uma matriz de tamanho 4, etc. Por simplicidade e consistência ao longo do desafio, representarei a entrada como uma única palavra.
- Um número inteiro
2 ≤ x ≤ 20
que especifica o tamanho da espiral em termos de "quadrados", com cada caractere impresso representando um "quadrado" em tamanho. Teoricamente, isso pode ter um escopo enorme, mas, como estamos desenhando a arte ASCII, um limite superior seguro será 20, para que caiba de maneira um tanto decente na tela. - Uma única letra de
d u r
oul
, indicando o movimento inicial do "quadrado" inicial (para baixo, para cima, direita, esquerda). - Um opcional
c
, indicando "anti-horário". Sec
omitido, assuma a rotação no sentido horário da espiral. - Um número inteiro final
1 ≤ y ≤ 10
que especifica quantas vezes repetir o desenho em espiral, usando o "quadrado" final da espiral anterior como o "quadrado" inicial da nova. Estou escolhendo um limite superior de 10 porque quero que o desenho termine em algum momento. - Alguns exemplos de entradas:
20lc5
13d2
2rc1
De interesse, observe que valores ímpares para a entrada de tamanho resultarão no centro @
sempre exato de uma espiral, mas valores pares podem ter o deslocamento "quadrado" inicial em qualquer uma das quatro direções diagonais, dependendo da direção da inicial. viagem. Isso pode resultar em alguns ... padrões interessantes. Veja os dois exemplos pares abaixo.
A entrada que não segue a especificação de entrada (por exemplo, 11q#s
) é indefinida e espero totalmente que o programa vomite adequadamente. :)
Saída
Saída é uma saída imprimível ASCII via STDOUT equivalente ao idioma, com as seguintes especificações:
- O "quadrado" inicial (de cada recursão) deve ser marcado com um sinal de arroba
@
. - O "quadrado" final deve ser marcado com um e comercial
&
. No caso de várias recursões, apenas o "quadrado" final deve ser marcado&
. - Os cantos do caminho em espiral precisam "apontar" na direção da viagem, usando
< > v ^
. - O deslocamento vertical precisa ser desenhado por tubos
|
. - O deslocamento horizontal precisa ser desenhado com traços
-
. - Os "quadrados" substituídos por recursões posteriores devem exibir a direção da viagem mais recente. Isso resultará em recursões "mais recentes" que parecem estar em camadas sobre as recursões "mais antigas". Veja o
4rc3
exemplo abaixo. - Uma nova linha final à direita está OK, os espaços à esquerda podem ser uma obrigação e, portanto, são permitidos, mas os espaços à direita não são permitidos.
- Não vou atracar você se você usar seqüências de escape para desenhar a arte ASCII para STDOUT, mas ficarei silenciosamente desapontado com você. (Você ainda será elegível para a recompensa se usá-las)
Exemplos
2d4
= diâmetro de 2, começa descendo, no sentido horário, 4 recursões
&@@@@
^<<<<
Neste exemplo, o desenho começa no canto superior direito @
, desce um, deixa um, sobe um. Nesse ponto, terminamos a 2d
parte e, portanto, iniciamos a 2ª recursão, para que tenhamos outra @
, descendo uma, deixada uma, subindo uma; depois a 3ª recursão; depois a quarta e finalmente a nossa &
.
4rc3
= diâmetro de 4, começa indo à direita, no sentido anti-horário, 3 recursões
&--<
v-<|
|@^|<
>--^|
|@^|<
>--^|
|@^|
>--^
Neste exemplo, o desenho começa no fundo @
, sobe um, sobe um, gira em espiral, até chegar ao meio @
e terminar a 4rc
parte. Isso então se repete mais duas vezes para obter as 3 recursões completas solicitadas. Observe que 4rc1
seria apenas o bloco 4x4 superior esquerdo deste exemplo.
7u1
= diâmetro de 7, começa subindo, no sentido horário, 1 recursão (observe que é o mesmo que a introdução)
&>----v
||>--v|
|||>v||
|||@|||
||^-<||
|^---<|
^-----<
Vencimento e restrições
Este é o Code Golf, então a menor resposta em bytes vence. As submissões devem estar na forma usual de programa / função / CJam Code Block / etc. Aplicam-se restrições de brecha padrão. Motorista profissional em curso fechado. Se a irritação persistir, interrompa o uso e consulte seu médico.
Respostas:
Javascript,
578,575,553,478, 377 bytesApós a derrotada Lua, mudei para uma linguagem mais compacta e mudei a concorrência para o Javascript:
O algoritmo é o mesmo, mas escrito em uma linguagem mais compacta, então eu consegui vencer o mal Lisp :)
Edit: Algumas mudanças estruturais foram necessárias para alcançar o Lisp novamente e eliminar os espaços em branco à direita. Mas estamos aqui novamente.
Edit2: Algumas abstrações levadas em conta para ficar abaixo de 500. Espero que seja o suficiente :)
Edit3: Obrigado @Timwi, o código é mais 100 caracteres mais fino. Ainda não atualizei a explicação.
Testes ( versão online , testada no Chrome):
E para ser justo, há uma explicação justa:
fonte
&optional
palavra - chave (e um espaço) para economizar 10 bytes, o que dá 576 ... risadas ruins (bem, você disse que poderia jogar um pouco mais, então isso não deve ser difícil de derrotar; até que alguém escreva uma resposta de 60 bytes em Pyth, é claro).i=M/2;j=i;G=i;H=i;I=i;J=i;
emi=j=G=H=I=J=M/2;
em=1;l=1;
emm=l=1;
que você pode economizar 12 bytesLisp comum,
649617605586576565554527518Todos os testes ainda passam. A função ungolfed também foi atualizada para refletir as alterações, assim como os comentários. Finalmente me livrei
remove-duplicates
para encurtar o código, mas agora não sei onde encontrar mais bytes. Bem feito Jakuje.Exemplos
Veja também
20lc10
(pastebin).Ungolfed
Não há recursão envolvida aqui, apenas uma abordagem básica de gráficos Turtle com loops:
(x y char)
triplos em uma pilha.y
ex
fonte
Lua 5.2, 740 bytes
Eu pensei que seria divertido tentar implementar algum algoritmo para vencer o Lisp, mas Lua provavelmente não é a melhor opção. Eu gasto muito tempo nisso, desenvolvendo demais algumas peças para terminar com essa solução feia, mas funcional. Provavelmente tentarei uma linguagem diferente mais tarde para vencer o Lisp, pois existem cerca de 90 caracteres que não consigo tirar desse algoritmo.
Testando saídas:
fonte
PHP, 524 bytes
Cheguei tarde a esta festa. Minha solução PHP não é a menor nem a mais inteligente. Isso simplesmente funciona.
Como executá-lo:
A versão detalhada com testes, explicações e outras vantagens pode ser encontrada no github .
fonte