Dado um único número inteiro ímpar positivo positivo como entrada, retorne um ziguezague convergente como uma lista de cadeias, lista de listas de caracteres ou cadeia de caracteres separada por nova linha, desta forma:
#
#
#
#
#
#
#
#
#
#
#
Você pode substituir #
por qualquer caractere que não seja um espaço em branco consistente. O espaço em branco à direita em cada linha é permitido e uma nova linha à direita é permitida.
O zig-zag começa na coluna 1
e, para cada linha, move uma coluna para a direita, até atingir a coluna n
(onde n
está a entrada). Em seguida, ele se move para a esquerda 2
, depois para a direita e para a n-1
esquerda 3
, com os dois limites convergindo até o zigue-zague terminar na coluna do meio ( (n+1)/2
).
Casos de teste
O exemplo acima é o caso de teste para 5
.
A seguir, são casos de teste individuais:
3
#
#
#
#
7
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
1
#
Respostas:
C (gcc) , 89 bytes
Experimente online!
Trabalha analisando a sequência do número de espaços como (para n = 7):
E para n = 3:
Podemos ver que o número do meio (
a
no código) é executado a partir de [n-1, n / 2). Então, a diferença entre o primeiro número e o número do meio é:Portanto, se passarmos
b
por [- (2a-n), 2a-n],a-abs(b)
nos fornecerá a sequência desejada. Isso é essencialmente o que o código faz.fonte
Carvão ,
108 bytesExperimente online! Link é a versão detalhada do código. Edit: Salvo 2 bytes graças a @dzaima por apontar que não preciso usar
#
s.fonte
Python 2 , 78 bytes
Experimente online!
fonte
Gelatina , 14 bytes
Experimente online!
Programa completo.
Usos
1
.-1 graças a Jonathan Allan .
-1 graças a Jonathan Allan .
fonte
’R
->Ṗ
para um byte.”X
->1
por outro.Haskell , 72 bytes
Experimente online!
Definimos uma lista infinita
r
como a diagonal de#
s começando no canto superior esquerdo.Em seguida, definimos uma função
g
que faz o peso do trabalho.g
pegará uma lista e a reverterá repetidamente e removerá seu primeiro elemento até que a lista esteja vazia e concatenará o resultado de cada ação.Nossa função principal aqui é uma função sem ponto. Essa função começa pegando
n
elementos da lista infinitar
, depois corta o primeiro elemento e aplica-seg
. Por último, precisamos adicionar um#
retorno ao início, porque as especificações da pergunta são um pouco estranhas, não sei por que a primeira diagonal é sempre uma mais longa do que deveria, mas é, então precisamos adicione aa#
.fonte
("#":).g.init.(
take,r)
mas obrigado!SOGL V0.12 , 19 bytes
Experimente aqui!
fonte
05AB1E , 22 bytes
Experimente online!
Usos
8
.fonte
05AB1E , 6 bytes
Experimente online!
fonte
S
. Portanto, a saída será duas vezes maior. Ainda não sabia sobre + e ×. Eles fazem padrões realmente interessantes quando você os combina com númerosS
, mas não prestava atenção suficiente à saída ..>.> E o+
e×
são basicamente embutidos em[0,4,4,0,2,6,6,2]
e[1,5,5,1,3,7,7,3]
. E8
será redefinido para a origem de onde você começou. Aqui um pouco mais de informação.CJam , 29 bytes
Experimente online!
Usos
8
.fonte
Pitão, 23 bytes
Experimente aqui.
fonte
JavaScript, 127 bytes
Calcula a meta (
g
) para chegar. Quando esse objetivo for alcançado, vire-se para o próximo objetivo. Também usa um truque para evitar o usoMath.round()
adicionando0.5
a todos os números desiguais.fonte
Haskell, 74 bytes
Experimente online!
Como funciona:
Cada chamada recursiva
f
acrescenta a próxima diagonal.fonte
Casca , 19 bytes
Experimente online!
Explicação
Isso parece um pouco desajeitado.
fonte
Python 3 , 82 bytes
Experimente online!
fonte
Retina , 71 bytes
Experimente online! Explicação: Os três primeiros estágios convertem a entrada no formato em
:> :
que o número de caracteres entre os:
é o número de entrada. Os dois últimos estágios retornam>
(ou<
, ao mover para a esquerda) entre os:
s. O quarto estágio dá laços no salto, imprimindo as partes necessárias da corda a cada vez. O;
pára a cadeia de ser impresso após o loop.fonte
05AB1E , 16 bytes
Experimente online!
Explicação
fonte
K (Kona), 27 bytes
Produz a sequência numérica subjacente, revertendo e soltando repetidamente a cabeça de um vetor até ficar vazia.
fonte
PHP, 65 bytes
Execute como tubo
-nF
ou teste-o online .explicação:
primeira iteração:
$n
isNULL
, portanto--$n
não tem efeito e avalia comoNULL
-> definir
$n
e$d
pré-decrementar o argumento1. incremento
$x
para par$d
, decremento para ímpar$d
2. impressão
X
, uma nova linha e$x
espaçositerações adicionais: decremento
$n
; quando for atingido0
, redefina$n
(e$d
) o argumento pré-decrementadofinal: imprima mais uma
X
.fonte
Japonês , 31 bytes
Solução recursiva que retorna uma matriz de linhas.
Experimente online! usando o
-R
sinalizador para unir a saída às novas linhas.fonte
Python 2,
159145141136 bytesJá houve versões bastante agradáveis do Python para esse problema, mas eu pensei que ainda publicaria minha péssima linha. (Sem ponto e vírgula!)
Editar: 14 bytes abaixo, usando soma em vez de compreensão de lista dupla
Edit: Acabei de notar no python 2 que você pode usar input em vez de raw_input. Eu sempre usei o último.
fonte
Mathematica,
142102 bytes (independente)Esta solução tem um sabor matemático:
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&
Isso basicamente calcula em qual segmento estamos (invertendo a função numérica triangular) e depois movendo para a esquerda ou para a direita adicionando uma potência de -1.
Você pode testá-lo na Wolfram Code Sandbox colando código como
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixForm
e pressionando Shift + Enter ou Numpad Enter ou clicando em Gear -> "Evaluate Cell".Isso tem o mesmo comprimento que a minha porta incorreta original da solução Python 2 do Erik (essa porta fornece a saída para uma entrada mais alta):
(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&
fonte