Introdução
Este é um é bem direto. Vamos desenhar uma cobra em ascii. Isso foi inspirado no antigo jogo de cobras, no qual você deve coletar as frutas e crescer continuamente.
Definição
Dado um número inteiro positivo N que representa o comprimento da cobra, desenhe uma cobra para que ela tenha um corpo de n mais uma cabeça e uma cauda.
Peças:
- cabeça:
<, >, ^, v
- rabo:
@
- vertical:
|
- horizontal:
-
Todos os cantos devem estar satisfeitos com um \
ou /
respectivamente. A menos que a cabeça termine em um canto, nesse caso, a cabeça <, >, ^, v
tem prioridade na direção em que a cobra está enrolada. ou seja, no exemplo do comprimento 1, ele é girado no sentido anti-horário e, portanto, a cabeça é girada dessa maneira. Para uma solução no sentido horário, seria para a direita >
.
A cobra deve começar no meio com a cauda, mas pode sair em qualquer direção que você escolher no sentido horário ou anti-horário. Também deve envolver-se firmemente à sua volta, à medida que se expande para fora de forma circular.
Exemplo
/--\
|/\|
||@|
|\-/
\--->
Onde @
está a cauda e a posição inicial. Como visto acima, a cauda começa no meio, sobe à esquerda em uma rotação anti-horária para fora.
Aqui o comprimento é 19
mais uma cauda e uma cabeça.
Como outro exemplo, aqui está o comprimento 1
:
<\
@
Ganhando
Isso é código-golfe, então a resposta que é enviada com o menor número de bytes vence, com tempo para ser usado como desempate.
Diverta-se!
@---->
. Você provavelmente pretende condições mais estritas sobre o formato da cobra. Também deixam claro o quanto de espaço em branco é ou não é permitido@
é o meio (é possível adicionar alguns espaços para fazê-lo), declare "à direita" como a direção e faça apenas a cabeça apontar para baixo e declarar no sentido horário. Seus termos podem parecer claros para você, mas são realmente ambíguos. Eu sei que você provavelmente significaria um tão firmemente quanto possível cobra enrolada, mas você deve deixar isso claroRespostas:
MATL ,
8583 bytesE eu pensei que ter um
spiral
builtin daria código curto ...Experimente online!
Explicação
Deixe N denotar a entrada. Criaremos um vetor de comprimento
ceil(sqrt(N+2))^2
, ou seja, o menor quadrado perfeito igual ou superior a N +2. Esse vetor será preenchido com valores numéricos, rolados em espiral (é por isso que seu comprimento precisa ser um quadrado perfeito) e, em seguida, os valores numéricos serão substituídos por caracteres.Vamos n denotam cada passo a partir de 1 no centro da espiral. As etapas em que a cobra gira são dadas por n 2 +1 (ou seja: 2, 5, 10, ...) para
\
símbolos en 2 + n +1 (ou seja: 3, 7, 13, ...) para/
. Os passos entre a\
e a/
devem ser-
e os entre a/
e a\
devem ser|
.O vetor é criado de forma que contenha
1
nos pontos de virada (2,3,5,7,10,13 ...) e0
no restante. A paridade da soma acumulada informa se cada entrada deve ser a-
ou a|
. Adicionando 1 a este resultado, obtemos um vetor contendo1
(for|
) ou2
(for-
). Mas isso faz com que os pontos de virada se tornem1
ou2
também. Portanto, os pontos de virada, cujas posições conhecemos, são substituídos: as posições n 2 +1 são preenchidas3
e as posições n 2 + n +1 são preenchidas4
. A cauda e a cabeça também são casos especiais: o primeiro elemento do vetor (cauda) é definido como5
e o elemento com o índice N+2 (cabeça) está definido como6
. Por fim, os elementos com índices superiores a N +2 são definidos como0
.Tomando a entrada N = 19 como exemplo, agora temos um vetor com comprimento 25:
Precisamos rolar esse vetor em uma espiral. Para isso, usamos uma função interna que gera uma matriz espiral, seguida por uma reflexão e uma transposição para produzir:
A indexação do vetor com a matriz fornece
onde
0
corresponde ao espaço,1
corresponde a|
,2
para-
,3
para\
,4
para/
,5
para@
e6
para a cabeça.Para saber qual dos quatro personagens
^
,<
,v
, ou>
a cabeça deve ter, usamos a soma cumulativa de pontos por sua vez que nós previamente calculado. Especificamente, o segundo último valor dessa soma acumulada (ou seja, o valor N + 1-ésimo) módulo 4 nos diz qual caractere deve ser usado para a cabeça. Tomamos o segundo último valor da soma cumulativa, não o último, devido à exigência de "se as extremidades da cabeça em um canto da cabeça<
,>
,^
,v
tem prioridade na direção da cobra está enrolado". Para o exemplo N = 19, a cabeça é>
.Agora nós podemos construir uma string contendo todos os personagens de serpentes, incluindo o personagem apropriado para a cabeça na sexta posição:
'|-\/@> '
. Em seguida, indexamos essa string com a matriz acima (a indexação é baseada em 1 e modular, portanto, o espaço dura por último), o que fornecefonte
Python 2,
250233191 bytesrepl.it
Desenhe a cobra girando a cobra inteira 90º no sentido horário e adicionando o segmento inferior, desta forma a cobra sempre estará no sentido anti-horário.
O novo segmento sempre começará com
\
e terá-
como corpo os lados pares e/
-
os lados ímpares. Os tamanhos de segmentos (sem cantos) são0
,1
,1
,2
,2
,3
... que éfloor(side/2)
.Se o segmento for o último, remova os caracteres em excesso, adicione a cabeça e complete com espaços.
fonte
'\/'[m]
,'-|'[m]
e'>v'[m]
print
e''.join
JavaScript (ES6), 193
201 203 215 215 220 224Editar salvou 4 bytes thx @Arnauld
Edit2 mudou a lógica, não armazena os incrementos atuais para xey, basta obtê-los da direção atual
Edit3 tendo salvado alguns bytes, decidi usá-los para um melhor gerenciamento do espaço em branco
Edit4 8 bytes salvos não seguindo exatamente os exemplos sobre a direção da cabeça - como outras respostas
A versão atual funciona com Chrome, Firefox e MS Edge
Esta resposta fornece algum espaço à direita e à esquerda (e linhas em branco).Um pouco menos golfe
fonte
(' ')
por` `
e('@')
por`@`
[ Array[1], Array[1] ]
, whileArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 bytes
Versão ES6 para facilitar o teste:
fonte
Perl,
111110 bytesInclui +1 para
-p
Dê tamanho ao STDIN
snake.pl
:fonte
Lote, 563 bytes
Explicação: Casos especiais 1, pois o restante do código requer uma largura de cobra de pelo menos dois. Em seguida, calcula o maior quarto quadrado (um quadrado exato ou um retângulo 1 mais largo do que alto) cuja área é menor que o comprimento da cobra. A cobra será enrolada neste retângulo começando no canto inferior esquerdo e terminando com a cauda no meio, e o comprimento restante será executado sob a parte inferior do retângulo. O retângulo é realmente gerado a partir de simples substituições de string; na maioria das vezes cada linha é gerada a partir da linha anterior movendo as diagonais 1 passo, mas obviamente a cauda também precisa ser tratada, e há pequenas diferenças dependendo se a altura do retângulo é par ou ímpar.
fonte
Python 2.7, A WHOPPING 1230 bytes
Eu sou novo em python e código de golfe, mas senti que tinha que responder minha própria pergunta e ficar de mau humor depois do fato. Muita diversão trabalhando nisso!
https://repl.it/Dpoy
fonte