Você receberá um número inteiro positivo N
como entrada. Sua tarefa é construir um semi-ziguezague, de N
lados, cada um de comprimento N
. Como é relativamente difícil descrever claramente a tarefa, aqui estão alguns exemplos:
N = 1
:O
N = 2
:O OO
N = 3
:OO OO OOO
N = 4
:OOOOO OO OO OOOO
N = 5
:OOOOOO OOO OOO OOO OOOOOO
N = 6
:OOOOOOO OOO OOO OOO OOO OOOOOOOOOOOO
N = 7
:OOOOOOOOO OOOO OOOO OOOO OOOO OOOO OOOOOOOOOOOOOO
Como você pode ver, um semi-ziguezague é feito de linhas diagonais e horizontais alternadas e sempre começa com uma linha diagonal do canto superior esquerdo para o inferior direito. Observe que os caracteres nas linhas horizontais são separados por um espaço.
Regras
Você pode escolher qualquer caractere que não seja um espaço em branco em vez de
O
, pode até ser inconsistente.Você pode gerar / retornar o resultado como uma String ou como uma lista de Strings, cada uma representando uma linha .
Você pode ter uma nova linha à direita ou à direita.
Aplicam-se lacunas padrão .
Você pode receber e fornecer saída por qualquer média padrão .
Se possível, adicione um link de teste ao seu envio. Votarei qualquer resposta que mostre os esforços no golfe e tenha uma explicação.
Isso é código-golfe , então o código mais curto em bytes em todos os idiomas vence!
Respostas:
Carvão , 24 bytes
Experimente online!
-5 graças a Neil .
AST:
fonte
FN§⟦↘→↗→⟧ι⁻Iθ¹→
(apenas 15 bytes), mas as listas de direções parecem não funcionar corretamente no carvão vegetal. Uma pena.FN✳§⟦↘→↗→⟧ι⁻θ¹O
funcionará depois que Dennis puxar,✳
sendo lançado na direçãoPython 2 ,
157153 bytesExperimente online!
n*3/2*~-n+1
é a largura de cada linha: n3n / 2⌋ · (n − 1) + 1 caracteres.q*n+s*(4*n-6)
representa as linhas superior e inferior. Se repetirmos e cortarmos[2*(n-1):]
, obteremos a linha superior; se cortarmos[5*(n-1):]
, obteremos a linha inferior. Daí a definiçãop
e as chamadas parap(2)
ep(5)
. Porém, como precisamos repetir e cortar o comprimento da linha para todas as outras linhas, reutilizamosp
o loop.i*s+s+o+…
é apenas uma expressão chata para as linhas do meio.n>1>p(5)
irán≯1
causar um curto-circuito se , fazendop(5)
com que não seja avaliado. Portanto, é uma abreviação deif n>1:p(5)
.fonte
Mathematica,
1261251211121048986 bytes#
é o número de entrada para uma função anônima (finalizada pela final&
).m=" "&~Array~{#,#^2-#+1};
cria uma matriz de caracteres de espaço do tamanho certo preenchendo uma matriz de determinadas dimensões#,#^2-#+1
com as saídas da função anônima constante "output a space"" "&
.Do[foo,{j,#},{i,#}]
é um par de loops aninhados, ondej
varia de1
para#
e dentro delei
varia de1
para#
.m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"
define a parte correspondente da matriz como o caractereX
baseado emj
ei
. O-i
usa indexação negativa para salvar bytes de#-i+1
. (Eu esqueci de escreverMod[j,4]
comoj~Mod~4
na versão original deste código.) Jenny_mathy apontou que podemos usar o resíduo modular para indexar diretamente na lista (ao invés de usarSwitch
) para salvar 9 bytes, e JungHwan Min apontou que não ' Não é necessário usar,ReplacePart
pois podemos definir uma parte de uma matriz e que1[i,#,-i][[j~Mod~4]]
usa o comportamento e a generalidade ímpares[[foo]]
para salvar bytes{1,i,#,-i}[[j~Mod~4+1]]
Você pode testar isso na caixa de proteção Wolfram Cloud colando código como o seguinte e pressionando Shift + Enter ou o teclado numérico Enter:
fonte
ReplacePart
aqui.m=ReplacePart[...]
pode serm[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"
- PodeSet
umPart
de uma lista. Isso elimina 15 bytes.{1,i,#,-i}[[j~Mod~4+1]]
também pode ser1[i,#,-i][[j~Mod~4]]
. Esse truque funciona porque[[0]]
retorna oHead
de uma expressão.C ++,
321234 bytes-87 bytes graças a Zacharý
Retorna um vetor de strings
fonte
Mathematica, 179 bytes
editar para @JungHwanMin
fonte
Mod[z,4]==0
ser substituído porMod[z,4]<1
?Mod[#,4]
com#~Mod~4
a -1 bytes?05AB1E ,
212019 bytesCódigo
Usa o novo modo de tela:
Usa a codificação 05AB1E . Experimente online!
Explicação:
Para a entrada 6 , isso fornece os seguintes argumentos (na mesma ordem) para a tela:
Para explicar o que a tela faz, escolhemos o primeiro conjunto de argumentos da lista acima.
O número 6 determina o comprimento da sequência que será gravada na tela. O preenchimento é usado para escrever na tela, que neste caso é
O
. Percorre ciclicamente a cadeia de preenchimento. A direção da string é determinada pelo argumento final, a direção. As instruções são:Isso significa que o 3 define a direção para o sudeste , o que também pode ser tentado online .
fonte
SOGL V0.12 , 36 bytes
Experimente aqui!
A idéia básica é escolher para cada número do intervalo de entrada a adição de uma parte pontilhada na diagonal ou na horizontal; nesse caso, ele girará a matriz para facilitar a adição. Explicação:
Se a entrada de 1 não fosse permitida,
ο.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№
também funcionaria. Se números aleatórios flutuando ao redor fossem permitidos.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№
, também funcionariam. Se eu não fosse preguiçoso e implementado‼
,}F2%?
poderia ser substituído‼
por -4 bytesfonte
Mathematica,
10687 bytesRetorna um
SparseArray
objeto deString
s. Para visualizar a saída, você pode anexarGrid@
. Lança um erro para o caso1
, mas é seguro ignorar.Explicação
Defina
i
ej
para 1.Defina
k
para entrada - 1.Defina
l
comok*input + 1
Iterar
l
vezes, começando em0
, incrementando a1
cada vez ...Adicionar o componente imaginário
i
daj
...Se a iteração atual é divisível por
k
, multipliquei
pela unidade imaginária ...Crie um
Rule
objeto que altera o elemento na posição{j, current iteration + 1}
para"o"
Crie um
SparseArray
objeto usando osRule
objetos gerados , com dimensão{input, l}
, usando" "
como em branco.Experimente na Wolfram Sandbox!
fonte
SparseArray
conta como uma matriz? Ele pode ser visualizado usandoGrid
orMatrixForm
, mas normalmente eu não contaria como "uma lista de strings" aqui. Se uma matriz 2D de caracteres é suficiente, isso corta 8 bytes da minha solução (12 antes da ajuda de Jenny_mathy), por exemplo.SparseArray
respostas, então presumo que esteja bem.Python 3 ,
228 226 224 215 197195 bytes-11 bytes Graças a @Mr. Xcoder
-2 bytes Graças a @Mr. Xcoder
Experimente online!
Explicação e código com menos golfe:
fonte
c+=i%(n-1)<1
comc+=i%~-n<1
a -2 bytesif 2>n:return'o'
é bastante redundante. Eu fiz uma solução alternativa emc+=i%[~-n,n][2>n]<1
vez dec+=i%~-n<1
.Haskell , 197 bytes
Experimente online!
Graças a @Lynn: corrigimos os espaços entre
O
s nos segmentos horizontais do zigue-zague, mas custavam muitos bytes!Algumas explicações:
r
é uma linha da saída: possui o0 y y y y y 0 x x x 0 y ...
formato, o númerox
e,y
dependendo da linha e da inicialn
x='0'
ey=' '
x=' '
ey=' '
x=' '
ey='0'
take(div(3*n)2*(n-1)+1)
corta uma linha infinita no lugar certon=1
:take n
lida com este caso.fonte
replicate n x
pode ser substituído porx<$[1..n]
. Além disso, sua resposta não possui espaços entreO
s nos segmentos horizontais do zigue-zague.Python 2 ,
155151146137 bytesExperimente online!
fonte
`L`[2::5]
salva um byte sobre''.join(L)