Construa um semi-ziguezague

29

Você receberá um número inteiro positivo Ncomo entrada. Sua tarefa é construir um semi-ziguezague, de Nlados, 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
    
  • Um caso de teste maior com N = 9

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 é , então o código mais curto em bytes em todos os idiomas vence!

Mr. Xcoder
fonte
11
Postagem da caixa de areia .
Mr. Xcoder
Temos que colocar espaços entre O que são horizontais?
HatsuPointerKun
11
@HatsuPointerKun Observe que os caracteres nas linhas horizontais são separados por um espaço. - Sim, você precisa colocar espaços.
Mr. Xcoder
11
Ah sim. Eu deveria aprender a ler. Graças
HatsuPointerKun
11
@JohnHamilton As respostas devem, teoricamente, funcionar para qualquer número dado como entrada. Eles não devem se preocupar com o que uma tela pode conter.
Mr. Xcoder

Respostas:

10

Carvão , 24 bytes

FN«↶§7117ι×⁺#× ﹪ι²⁻Iθ¹»#

Experimente online!

-5 graças a Neil .

AST:

Program
├F: For
│├N: Input number
│└Program
│ ├↶: Pivot Left
│ │└§: At index
│ │ ├'7117': String '7117'
│ │ └ι: Identifier ι
│ └Print
│  └×: Product
│   ├⁺: Sum
│   │├'#': String '#'
│   │└×: Product
│   │ ├' ': String ' '
│   │ └﹪: Modulo
│   │  ├ι: Identifier ι
│   │  └2: Number 2
│   └⁻: Difference
│    ├I: Cast
│    │└θ: Identifier θ
│    └1: Number 1
└Print
 └'#': String '#'
Erik, o Outgolfer
fonte
Era muito fácil para carvão vegetal :)
Mr. Xcoder
@ Mr.Xcoder Isso parece realmente não-destruído na verdade ... não sei como jogar golfe.
Erik the Outgolfer
O OP disse que o personagem pode ser qualquer um e não precisa ser consistente, então eu estava procurando algo semelhante ao de FN§⟦↘→↗→⟧ι⁻Iθ¹→(apenas 15 bytes), mas as listas de direções parecem não funcionar corretamente no carvão vegetal. Uma pena.
30717 Charlie
@CarlosAlejo Tentei isso também, mas infelizmente não funciona.
Erik the Outgolfer
11
@CarlosAlejo FN✳§⟦↘→↗→⟧ι⁻θ¹Ofuncionará depois que Dennis puxar, sendo lançado na direção
ASCII-
7

Python 2 , 157 153 bytes

n=input()
o,s=q='O '
def p(k,t=q*n+s*(4*n-6)):print(t*n)[k*~-n:][:n*3/2*~-n+1]
p(2)
for i in range(n-2):p(0,i*s+s+o+s*(4*n-7-2*i)+o+s*(2*n+i-2))
n>1>p(5)

Experimente online!

  • n*3/2*~-n+1 é a largura de cada linha: n3n / 2⌋ · (n − 1) + 1 caracteres.
  • A sequência 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ção pe as chamadas para p(2)e p(5). Porém, como precisamos repetir e cortar o comprimento da linha para todas as outras linhas, reutilizamos po loop.
  • A i*s+s+o+…é apenas uma expressão chata para as linhas do meio.
  • n>1>p(5)irá n≯1causar um curto-circuito se , fazendo p(5)com que não seja avaliado. Portanto, é uma abreviação de if n>1:p(5).
Lynn
fonte
Uau, solução incrível, tão inteligente. Você ganhou meu
voto positivo
Uau, nunca soube que o Python tinha um curto-circuito em comparações como essa, +1.
Zacharý 30/07/19
6

Mathematica, 126 125 121 112 104 89 86 bytes

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&
  • #é 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-#+1com as saídas da função anônima constante "output a space" " "&.
  • Do[foo,{j,#},{i,#}]é um par de loops aninhados, onde jvaria de 1para #e dentro dele ivaria de 1para #.
  • m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"define a parte correspondente da matriz como o caractere Xbaseado em je i. O -iusa indexação negativa para salvar bytes de #-i+1. (Eu esqueci de escrever Mod[j,4]como j~Mod~4na 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 usar Switch) para salvar 9 bytes, e JungHwan Min apontou que não ' Não é necessário usar, ReplacePartpois podemos definir uma parte de uma matriz e que 1[i,#,-i][[j~Mod~4]]usa o comportamento e a generalidade ímpares [[foo]]para salvar bytes{1,i,#,-i}[[j~Mod~4+1]]
  • Como o meta estabeleceu que uma lista de caracteres é uma string (como JungHwan Min apontou ), não precisamos mapear nenhuma função nas linhas da matriz de caracteres, pois ela já é uma lista de "string" s.

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:

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&@9//MatrixForm
Mark S.
fonte
11
Muito agradável! você pode substituir StringJoin por "" <> # & para salvar 4 bytes
J42161217
@Jenny_mathy Obrigado pela dica! Isso parece bastante útil.
Mark S.
2
Você também pode substituir [...] Switch por {1, i, #, - i} [[j ~ Mod ~ 4 + 1]] e salvar 9 bytes!
J42161217
11
Você realmente não precisa ReplacePartaqui. m=ReplacePart[...]pode ser m[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"- Pode Setum Partde uma lista. Isso elimina 15 bytes.
JungHwan Min 30/07/2017
11
{1,i,#,-i}[[j~Mod~4+1]]também pode ser 1[i,#,-i][[j~Mod~4]]. Esse truque funciona porque [[0]]retorna o Headde uma expressão.
JungHwan Min
4

C ++, 321 234 bytes

-87 bytes graças a Zacharý

#include<vector>
#include<string>
auto z(int n){std::vector<std::string>l;l.resize(n,std::string(n*n+n/2*(n-1),32));l[0][0]=79;int i=0,j,o=0;for(;i<n;++i)for(j=1;j<n;++j)l[i%4?i%4-1?i%4-2?0:n-j-1:n-1:j][i*n+j-i+(o+=i%2)]=79;return l;}

Retorna um vetor de strings

HatsuPointerKun
fonte
Eu consegui reduzi
Zacharý
Correção, eu o reduzi para 239 bytes : repl.it/JpJ2/1
Zacharý
Desculpe pelo spam, 234 bytes: repl.it/JpJ2/3
Zacharý
11
O que posso dizer, exceto de nada!
Zacharý
@ Zachary Muito obrigado senhor
HatsuPointerKun
4

Mathematica, 179 bytes

Rotate[(c=Column)@(t=Table)[{c@(a=Array)[" "~t~#<>(v="o")&,z,0],c@t[t[" ",z-1]<>v,z-1],c@a[t[" ",z-2-#]<>v&,z-1,0],c@t[v,z-Boole[!#~Mod~4<1]-1]}[[i~Mod~4+1]],{i,0,(z=#)-1}],Pi/2]&

editar para @JungHwanMin

J42161217
fonte
Eu não esperava que fosse tão curto, bem feito!
Mr. Xcoder
Apenas uma pergunta: pode Mod[z,4]==0ser substituído por Mod[z,4]<1?
Mr. Xcoder
sim, eu posso golf algumas coisas para baixo ...
J42161217
3
Eu realmente não sei o Mathematica, mas você pode substituir Mod[#,4]com #~Mod~4a -1 bytes?
Mr. Xcoder
11
Opa ... acidentalmente votado. Você pode editar a resposta para que eu possa virar de cabeça para baixo?
JungHwan Min 30/07/2017
4

05AB1E , 21 20 19 bytes

Código

Usa o novo modo de tela:

Fx<)Nè'ONÉúR3212NèΛ

Usa a codificação 05AB1E . Experimente online!

Explicação:

F                      # For N in range(0, input)
 x<)                   #   Push the array [input, 2 × input - 1]
    Nè                 #   Retrieve the Nth element
      'ONÉúR           #   Push "O" if N is odd, else "O "
            3212Nè     #   Retrieve the Nth element of 3212
                  Λ    #   Write to canvas

Para a entrada 6 , isso fornece os seguintes argumentos (na mesma ordem) para a tela:

[<num>, <fill>, <patt>]
[6,     'O',     3]
[11,    'O ',    2]
[6,     'O',     1]
[11,    'O ',    2]
[6,     'O',     3]
[11,    'O ',    2]

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:

7  0  1
 \ | /
6- X -2
 / | \
5  4  3

Isso significa que o 3 define a direção para o sudeste , o que também pode ser tentado online .

Adnan
fonte
Também note que o modo tela está em desenvolvimento e muito instável
Adnan
: O 05AB1E está se transformando em carvão vegetal (também esta está batendo carvão O_o)
ASCII-only
@ Somente ASCII Sim, eu vi o surgimento de todas as linguagens baseadas em ASCII (carvão vegetal, SOGL, V, etc.) e vi 05AB1E afundar em segundo plano, então tive que fazer algo a respeito: p
Adnan
então você copiou o carvão? : P 05ab1e ainda tem uma tela e impressão direcional (embora carvão só suporta este estilo de impressão com comprimento via python)
ASCII-only
2

SOGL V0.12 , 36 bytes

╝.H∫2\?.╝}F2%?№@.┌Ο};1w⁄Hh1ž}.4%1>?№

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:

╝                                     get a diagonal from the bottom-left corner with the length of the input - the starting canvas
 .H∫                        }         for each number in the range [1,inp-1] do, pushing counter
    2\?  }                              if it divides by 2, then
       .╝                                 create another diagonal of the input
          F2%                           push counter % 2
             ?     }                    if that [is not 0]
              №                           reverse the current canvas upside down
               @.┌Ο                       get an alternation of spaces and dashes with the dash amount of the input length
                    ;                   get the canvas on top of the stack
                     1w⁄                get its 1st element length
                        H               decrease it
                         h              swap the bottom 2 items - the canvas is now at the bottom and the current addition ontop
                          1             push 1
                           ž            at 1-indexed coordinates [canvasWidth-1, 1] in the canvas insert the current part made by the Ifs
                             .4%1>?   if input%4 > 1
                                   №    reverse the array vertically

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 bytes

dzaima
fonte
2

Mathematica, 106 87 bytes

SparseArray[j=i=1;k=#-1;Array[{j+=Im@i;k∣#&&(i*=I);j,#+1}->"o"&,l=k#+1,0],{#,l}," "]&

Retorna um SparseArrayobjeto de Strings. Para visualizar a saída, você pode anexar Grid@. Lança um erro para o caso 1, mas é seguro ignorar.

Explicação

j=i=1

Defina ie jpara 1.

k=#-1

Defina kpara entrada - 1.

l=k#+1

Defina lcomok*input + 1

Array[ ..., l= ...,0]

Iterar lvezes, começando em 0, incrementando a 1cada vez ...


j+=Im@i

Adicionar o componente imaginário ida j...

k∣#&&(i*=I)

Se a iteração atual é divisível por k, multiplique ipela unidade imaginária ...

{... j,#+1}->"o"

Crie um Ruleobjeto que altera o elemento na posição {j, current iteration + 1}para"o"


SparseArray[ ...,{#,l}," "]

Crie um SparseArrayobjeto usando os Ruleobjetos gerados , com dimensão {input, l}, usando " "como em branco.

Experimente na Wolfram Sandbox!

JungHwan Min
fonte
11
há algo errado com o caso n = 3
J42161217 30/07
11
n = 2, 4,5,6 também têm problemas de correção, mas acho que isso funciona para 7 e acima. Estou curioso: existe um precedente sobre se um SparseArrayconta como uma matriz? Ele pode ser visualizado usando Gridor MatrixForm, 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.
Mark S.
11
@MarkS. Além disso, uma matriz de cadeias é aceitável por meta consenso . Se algo não estiver claro, pergunte ao OP (como ele / ela faz as regras, não nós). Uma simples pesquisa de "SparseArray" neste site fornece uma abundância de SparseArrayrespostas, então presumo que esteja bem.
JungHwan Min 30/07/2017
11
@MarkS. Além disso, esta página tem muitos truques para jogar no Mathematica.
JungHwan Min 30/07/2017
11
@JungHwanMin Eu editei a minha resposta como você pediu
J42161217
2

Python 3 , 228 226 224 215 197 195 bytes

-11 bytes Graças a @Mr. Xcoder

-2 bytes Graças a @Mr. Xcoder

def f(n,s=range):
 x=y=t=c=0;z=[]
 for i in s(n*n-n+2):c+=i%(n-(2<=n))<1;z+=[[x,y]];t=max(t,x);x+=2-c%2;y+=[-1,1][c%4<3]*(c%2)
 return'\n'.join(''.join(' O'[[k,j]in z]for k in s(t))for j in s(n))

Experimente online!

Explicação e código com menos golfe:

def f(n):
 x=y=t=c=0;z=[]                       #initialize everything
 for i in range(n*n-n+2):             #loop n*n-n+2 times which is the numberr of 'o's expected
    c+=i%[~-n,n]<n-1                  #if one cycle has been completed, increase c by 1, if n>1.                                            
    z+=[[x,y]]                        #add [x,y] to z(record the positions of 'o')
    t=max(t,x)                        #trap maximum value of x-coordinate(to be used later while calculatng whole string)
    r=[[2,0],[1,1],[2,0],[1,-1]][c%4] #r gives direction for x and y to move, adjust it as per c i.e. cycles
    x+=r[0];y+=r[1]                   #yield newer values of x and y 
 return '\n'.join(''.join(' o'[[k,j]in z]for k in range(t))for j in range(n)) #place space or 'o' accordingly as per the recorded posititons in z
officialaimm
fonte
11
Muito bom trabalho. Parabéns!
Sr. Xcoder 30/07/2017
@ Mr.Xcoder Obrigado. Devo dizer que este foi difícil, especialmente teve problemas para identificar a faixa correta.
officialaimm
11
215 bytes , if 2>n:return'o'é bastante redundante. Eu fiz uma solução alternativa em c+=i%[~-n,n][2>n]<1vez de c+=i%~-n<1.
Mr. Xcoder
11
Desculpem a muito tarde melhoria, 195 bytes
Mr. Xcoder
1

Haskell , 197 bytes

a n c=take(2*n)$cycle$c:" "
r i n x y=take(div(3*n)2*(n-1)+1)$(' '<$[1..i])++(cycle$"O "++(a(2*n-i-3)y)++"O "++(a(n+i-2)x))
z n=take n$(r 0 n 'O' ' '):[r i n ' ' ' '|i<-[1..n-2]]++[r(n-1)n ' ' 'O']

Experimente online!

Graças a @Lynn: corrigimos os espaços entre Os nos segmentos horizontais do zigue-zague, mas custavam muitos bytes!

Algumas explicações:

  • ré uma linha da saída: possui o 0 y y y y y 0 x x x 0 y ...formato, o número xe, ydependendo da linha e da inicialn
  • para a linha superior x='0'ey=' '
  • para as linhas do meio x=' 'ey=' '
  • para a linha inferior x=' 'ey='0'
  • take(div(3*n)2*(n-1)+1) corta uma linha infinita no lugar certo
  • toda saída tem uma linha superior e uma linha inferior, exceto quando n=1: take nlida com este caso.
jferard
fonte
Bem jogado! Você pode largar alguns desses espaços, eu acho. E replicate n xpode ser substituído por x<$[1..n]. Além disso, sua resposta não possui espaços entre Os nos segmentos horizontais do zigue-zague.
Lynn
@Lynn thanks! com os espaços em segmentos horizontais, meu método torna-se complicado, mas eu queria corrigir o código de qualquer maneira ...
jferard
Você pode economizar bastante usando operadores e removendo espaços desnecessários, veja aqui .
ბიმო
1

Python 2 , 155 151 146 137 bytes

m=input()
n=m-1
r=range(n+2)
for L in zip(*[' '*i+'O'+n*' 'for i in(r+[n,m]*~-n+r[-2::-1]+([m,0]*n)[:-1])*m][:1+3*m/2*n]):print''.join(L)

Experimente online!

TFeld
fonte
@ Mr.Xcoder Ahh. Eu vejo agora.
precisa saber é
@ Mr.Xcoder Corrigido agora.
TFeld
Eu sou um ano de atraso para a festa de golfe, mas `L`[2::5]salva um byte sobre''.join(L)
Mr. Xcoder