Considere esta espiral
###########
#
# #######
# # #
# # ### #
# # # # #
# # # # #
# # # #
# ##### #
# #
#########
Começando no centro:
- A primeira linha (para cima) possui 3 caracteres.
- A segunda linha tem o mesmo número de caracteres (3)
- Em seguida, adicionamos dois caracteres (5) para os próximos dois lados.
- Esse padrão continua, dois lados do mesmo comprimento e depois aumentam o comprimento em 2.
Eu quero gerar essa espiral para N linhas.
- Escreva em qualquer idioma.
- A entrada / argumento etc. é o número de linhas em sua espiral.
- Cada linha começa com o caractere final da linha anterior na direção 90 graus no sentido horário da linha anterior.
- Não ligo quanto espaço em branco é anterior ou posterior a cada linha, desde que os elementos da espiral se alinhem.
- Saída de texto para desenhar a espiral com qualquer caractere que não seja de espaço em branco que você escolher.
- Tente fazer isso no menor número de bytes.
Casos de teste (usando um hash como saída):
N = 1
#
#
#
N = 2
###
#
#
N = 3
###
# #
# #
#
#
N = 10
###########
#
# #######
# # #
# # ### #
# # # # #
# # # # #
# # # #
# ##### #
# #
#########
*
vez de#
. Esperado?Respostas:
05AB1E ,
1311 bytesCódigo:
Agradecimentos a Emigna por salvar dois bytes!
Usa a codificação 05AB1E . Experimente online!
Explicação
Os comprimentos de cada aresta individual na espiral começam com o comprimento 3 e aumentam gradualmente a cada dois passos em dois:
Isso basicamente nos dá a lista desejada de comprimentos.
A tela funciona como uma função que exibe três parâmetros (onde o parâmetro mais à direita é exibido primeiro): <length (s)> , <char (s)> , <direction (s)> . O parâmetro direções é, neste caso, uma lista de números. Os números que correspondem às instruções são:
Nesse caso, [0, 2, 4, 6] corresponde à lista de instruções
[↑, →, ↓, ←]
. A tela itera sobre cada comprimento recuperado da lista de comprimentos, usa o caractere '#' e itera ciclicamente sobre a lista de direções.fonte
0246S
=3Ý·
Python 2 ,
176170165161 161157 bytesExperimente online!
Repetidamente: Utilizado
g
para girar an
iteração da espiral para uma posição 'canônica' (semelhante a N = 3 ou N = 7), adiciona um novo segmento adicionando 2 espaços à esquerda de cada linha existente e substituindo a última linha com todos os'#'
s (resultando em uma posição comparável a N = 4 ou N = 8) e, finalmente, usandog
novamente para girá-lo de volta à posição correta. Espuma, enxágüe, repita.fonte
Carvão ,
161514 bytes-2 bytes graças a @Neil .
Experimente online (detalhado) ou Experimente online (puro) .
Explicação:
A direção da impressão está à direita, por padrão, e queremos começar para cima; portanto, giramos 45 graus no sentido anti-horário:
Em seguida, faça um loop
i
no intervalo[0, input)
:Imprima uma nova linha para imitar o efeito de voltar uma posição:
Imprima "#" a
x
quantidade de vezes na direção atual:Onde
x
fica3 + i // 2 * 2
::E gire 45 graus no sentido horário para a próxima iteração do loop:
fonte
⊗÷ι²
é um byte menor que⁻ι﹪ι²
. Além disso, você pode obter o efeito de voltar a imprimir imprimindo a\n
antes de#
s, o que permitirá remover o»#
para uma economia geral adicional de bytes.⊗÷ι²
, mas quais seriam as alterações para imprimir um\n
antes do#
s? A espiral está incorreta se eu adicionar oPrint("\n")
.#
longos.Python 2 ,
179178 bytesgraças a Kevin Cruijssen por -1 byte.
Experimente online!
Python 2 , 179 bytes
Nesta abordagem, as fórmulas são usadas para
x
ey
deltas, em vez de uma lista de pesquisa.Experimente online!
fonte
n+1+n%2
an%2-~n
para -1 byte. E preciso me lembrar de0--n/4*2
ser 1 menor que-(-n/4*2)
. Boa resposta, +1 de mim.JavaScript (ES6), 185 bytes
Claro que isso pode ser mais praticado, talvez com curry, mas aqui está minha tentativa muito humilde. Quebras de linha adicionadas para facilitar a leitura, exceto o penúltimo caractere
Uso:
d(10)
retorna uma string conforme o exemplo de desafio N = 10.Define uma função
r(a,n)
para girar uma matriza
porn
turnos; uma funçãos(n)
para gerar uma matriz bidimensional representando uma espiral de tamanhon
girando recursivamente e adicionando espaçamento e linhas (não girados de volta à posição inicial); e uma funçãod(n)
para desenhar uma espiral de tamanhon
, rotacionada consistentemente conforme o desafio e renderizada como uma sequência retornada.Este foi um desafio muito divertido: ¬)
fonte