Imprimir uma rede de cubos do tamanho especificado


26

Desafio

Dado um tamanho s, imprima uma rede de cubos desse tamanho feita de símbolos de hash ( #) e espaços ( ).

Exemplos:

1:
  #
# # #    
  #
  #

2:
    # #
    # #
# # # # # #
# # # # # #
    # #
    # #
    # #
    # #

3:
      # # #
      # # #
      # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
      # # #
      # # #
      # # #
      # # #
      # # #
      # # #

A rede pode realmente ser qualquer rede de cubos válida que possa ser dobrada em um cubo, por exemplo:

    # #
    # #
# # # # # # # #
# # # # # # # #
    # #
    # #

    # # # #
    # # # #
    # #
    # #
    # #
    # #
# # # #
# # # #

Regras

  • A rede resultante deve ser geometricamente válida (dobrável em um cubo)
  • Lacunas padrão proibidas
  • Leia as regras cuidadosamente
  • Este é o , a resposta mais curta vence, mas não será selecionado

1
Pode haver espaços iniciais / finais / novas linhas?
Kritixi Lithos

@KritixiLithos Yes
dkudriavtsev 14/01

13
Para referência, todas as 11 redes de cubos .
xnor

3
E se eu não ler as regras cuidadosamente?
precisa saber é o seguinte

1
@steenbergh Então a solução é inválido
dkudriavtsev

Respostas:


23

Python 2, 47 bytes

n=input()
for c in 1,4,1:exec"print'# '*c*n;"*n

Experimente online!

Imprime esta rede, escolhida por ser justificada à esquerda:

# # 
# # 
# # # # # # # # 
# # # # # # # # 
# # 
# # 

As linhas têm nou 4*ncópias de '# '. Para cada um deles 1,4,1, imprimimos no número de cópias, o ntempo das nlinhas. Ter um execloop dentro de um forloop parece um desperdício, mas não vi melhor.

Alternativas que testei:

lambda n:('# '*n*3+'\n')*n+('  '*n+'# '*n+'\n')*3*n

lambda n:('# '*n*3+'\n')*n+(' '*4*n+'# '*n*3+'\n')*n

def f(n):
 for c in[3]*n+[1]*3*n:print('# '*c*n).center(6*n)

def f(n):
 for c in[4]*n+[0]*n:print' '*c*n+'# '*n*3

def f(n):
 for c in[1]*n+[4]*n+[1]*n:print'# '*c*n

def f(n):
 c=1;exec("print'# '*c*n;"*n+"c^=5;"*n)*3

def f(n):
 for i in range(3*n):print'# '*[1,4,1][i/n]*n

def f(n):
 for c in 1,4,1:print('# '*c*n+'\n')*n,

def f(n):
 for c in 1,4,1:exec"print'# '*c*n;"*n

(As deffunções podem ser todas mais curtas como um programa.)


8

Oitava, 58 44 42 32 bytes

@(n)[z=repmat('# ',n);z,z,z,z;z]

parcialmente inspirado na resposta python do @xnor.

z=repmat('# ',n);

cria um padrão squre de '#' para a entrada 2 resulta no seguinte padrão:

# #             
# # 

y=[z,z,z,z];

quatro zs são concatenados horizontalmente:

# # # # # # # # 
# # # # # # # # 

[z;y;z]

ze ye zsão concatenados verticalmente

Experimente Online!

# #             
# #             
# # # # # # # # 
# # # # # # # # 
# #             
# #             

Resposta anterior:

@(n){h(1:n,1:2:n*6)=1;h(1:n*4,n*2+1:2:4*n)=1;' #'(h+1)}{3}

Experimente Online!

Gera um em forma de T

# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      

6

Mathematica, 77 60 52 bytes

Obrigado a Martin Ender por jogar 8 bytes de distância!

{±s_:=s~Table~#;b=±{a=±"# ","
"},±{a,a,a,a,"
"}}<>b&

Função sem nome, usando um argumento inteiro positivo #e retornando uma string com novas linhas (incluindo uma nova linha à direita); cada linha também tem um espaço à direita. Primeiro, definimos ±como uma função que repete seus #tempos de entrada ; então aé definido como ±"# "(este #é um caractere, não a entrada!), e a partir disso bé definido como o conjunto de #linhas curtas, enquanto ±{a,a,a,a}<>né o conjunto de #linhas longas. (Nos dois casos, há um avanço de linha literal entre aspas correspondentes.) O final <>bconcatena a lista de seqüências resultante com a segunda cópia do conjunto de linhas curtas. Exemplo de saída quando #=2( a resposta do xnor me ensinou que essa orientação é mais eficiente):

# #     
# #     
# # # # # # # # 
# # # # # # # # 
# #     
# #     

Versão anterior desta implementação:

""<>(±s_:=s&~Array~#;{b=±{a=±"# ",n="\n"},±{a,a,a,a}<>n,b})&

Submissão original:

""<>If[(m=n~Mod~t)==0,"\n",If[n<t#||#<m<=2#,"# ","  "]]~Table~{n,4(t=3#+1)#}&

Constrói um a série de 4*(3#+1)peças, cada uma das quais é ou "# ", " ", ou "\n"; simplesmente calcula quais peças usar com base no índice n. Exemplo de saída quando #=2:

# # # # # # 
# # # # # # 
    # #     
    # #     
    # #     
    # #     
    # #     
    # #     

5

JavaScript (ES6), 59 bytes

f=
n=>`141`.replace(/./g,m=>`${`# `.repeat(n*m)}\n`.repeat(n))
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

A saída inclui um espaço à direita no final de cada linha e uma nova linha à direita.


5

Ruby, 36 bytes

f=->n{puts (t=[s="# "*n]*n)+[s*4]*n+t}

Uso:

f=->n{puts (t=[s="# "*n]*n)+[s*4]*n+t}
f[3]
# # #
# # #
# # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # #
# # #
# # #

Ruby, 38 bytes

Essa forma é mais longa no Ruby, mas espero que haja alguns idiomas em que seja mais curta.

->n{puts [s="# "*n*3]*n+[" "*n*4+s]*n}

Uso:

g=->n{puts [s="# "*n*3]*n+[" "*n*4+s]*n}
g[3]
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
            # # # # # # # # #
            # # # # # # # # #
            # # # # # # # # #

Ambas as respostas podem ser mais curtas se for permitido retornar (preferencialmente) uma matriz de cadeias ou (menos preferencialmente) uma única cadeia em vez de imprimir.


Retornar uma string é considerado uma forma válida de saída.
dkudriavtsev

4

Scala, 56 bytes

(n:Int)=>Seq(1,4,1)map("# "*_*n+"\n")map(_*n)mkString ""

4

JavaScript (ES6), 71

n=>((z='# '[R='repeat'](n))[R](3)+`
`)[R](n)+('  '[R](n)+z+`
`)[R](n*3)

Teste

f=
n=>((z='# '[R='repeat'](n))[R](3)+`
`)[R](n)+('  '[R](n)+z+`
`)[R](n*3)

function update() {
  O.textContent=f(I.value)
}

update()
<input id=I type=number value=3 oninput='update()'><pre id=O></pre>


Não tenho muita certeza, mas acho que você precisa gerar os espaços junto com os hashes. (Eu também cometi esse erro de não incluir os espaços na primeira edição da minha resposta)
Kritixi Lithos

@KritixiLithos uh, entendi. Graças
edc65

4

Java 8, 99 bytes

l->{for(int i=-1,j;++i<3*l;)for(j=-1,k=(i/l==2)?4*l:l;++j<k;)System.out.print("# "+j>k-2?"\n":"");}

4

V , 24 23 20 18 20 bytes

Ài# ddÀpLyGïp3PGïp

Com todos os caracteres ocultos mostrados

Ài# ^[ddÀp^VLyGïp3PGoïp

^[is 0x1b(caractere de escape literal) e ^Vis 0x16( C-v)

Experimente online!

Eu tive que aumentar o número porque o Äcomando estava sendo buggy nessa nova tração em V

Saídas neste formato:

# 
# # # # 
# 

com uma nova linha líder

Hexdump:

00000000: c069 2320 1b64 64c0 7016 4c79 47ef 7033  .i# .dd.p.LyG.p3
00000010: 5047 ef70                                PG.p

Explicação

Ài# ^[              " Argument times insert "# "
ddÀp                " Argument times duplicate line

Agora que uma face da rede foi concluída, temos que criar a rede

^VLy                " Copy the face
Gïp                 " Paste it at the end of buffer
3P                  " Paste 3 times (these form the line)
Gïp                 " Paste at end of buffer again

Solução alternativa se não produzirmos os espaços:

21 20 18 16 18 bytes

Àé#ddÀpLyGïp3pGïp

(pelo mesmo motivo da solução principal, esse link do TIO é modificado)

Experimente online!


4

V , 14 bytes (não concorrente)

Ài# 5Ù4JjòÀÄk

Experimente online!

00000000: c069 2320 1b35 d934 4a6a f2c0 c46b       .i# .5.4Jj...k

Por qualquer motivo, esse desafio descobriu vários bugs. Agora que estão todos corrigidos, infelizmente esta versão não é competitiva, mas é bom ver como deve ser uma resposta em V para esse desafio quando não for necessário adicionar toneladas de bytes para acompanhar minha codificação desleixada.

Explicação:

À                   " Arg 1 times:
 i# <esc>           "   Insert the string "# "
         5Ù         " Make 5 copies of this line, and put the cursor on the second copy
           4J       " Join four of these lines together
             j      " Move down to the last line
              ò     " Recursively:
               ÀÄ   "   Make Arg 1 copies of this line
                 k  "   And move up a line

Para ser justo, o Jproblema não era a codificação desleixada do AFAIK, acho que era apenas o padrão nvim?
nmjcman101

Sim, é verdade. Mas o operador duplicado definitivamente era desleixado. Felizmente, esta nova versão é muito mais simples.
DJMcMayhem

4

Geléia , 20 19 bytes

”#xẋ³Wẋ³K€Y
141DÇ€Y

Experimente online!

-1 graças a 44874 (steenbergh).

NÃO POSSO SABER MUDDYFISH AJUDAR!

Isso é golfável ??? 20 19 bytes parecem demais , vendo o Link 1.

Explicação:

”#xẋ³Wẋ³K€Y Helper link. Arguments: z
”#          Character #.
            y (implicit)
  x         Repeat each element of y x times.
    ³       1st command-line argument.
   ẋ        Repeat x y times.
     W      Wrap z.
       ³    1st command-line argument.
      ẋ     Repeat x y times.
        K   Join z on spaces.
         €  Map this link on x.
          Y Join z on newlines.

141DÇ€Y Main link. Arguments: 0
141     Integer 141.
   D    Convert z to base 10.
    Ç   The above link as a monad.
     €  Map this link on x.
      Y Join z on newlines.

É V versus Jelly agora :)
Kritixi Lithos

@KritixiLithos Nah, sua solução foi a primeira.
Erik the Outgolfer

V é a 18 bytes agora :)
Kritixi Lithos

Você pode deixar cair um byte por não usar @, mas trocando os operandos para xsi mesmo: ”#xẋ³Wẋ³K€Y.
precisa saber é o seguinte

3

Carvão , 20 bytes

NλG↑λ←×⁶λ↓λ# DM×⁴λ← 

O código termina com um espaço. Experimente online!

Explicação

O carvão vegetal é uma linguagem especializada na arte ASCII. Também está incompleto, com erros e com pouca documentação. Basta dizer que isso levou uma quantidade razoável de tentativa e erro antes de fazer o que deveria.

  • Nλinsere um número em λ.
  • é o comando polygon, que usaremos aqui para desenhar um retângulo. ↑λ←×⁶λ↓λespecifica a borda do polígono: λetapas para cima , para a esquerda 6 vezes λe para baixo λ. (São três λporλ blocos lado a lado.) A borda inferior do retângulo é inferida. O polígono é então preenchido com a sequência # .
  • despeja a tela atual em stdout, resultando em algo como isto:
 # # # # # # # # #
 # # # # # # # # #
 # # # # # # # # #
  • Após o comando, o cursor está no canto inferior esquerdo da tela. M×⁴λ←move-o para a esquerda quatro vezes λ(equivalente a dois λem λblocos).
  • gera um espaço lá, estendendo a tela para a esquerda na quantidade correta.
  • No final do programa, a tela é (novamente) enviada para o stdout:
             # # # # # # # # #
             # # # # # # # # #
             # # # # # # # # #

Coloque-os juntos e você terá uma rede de cubos.


Uau, você realmente teve que lutar naquela época! (Oblong não foi adicionado até várias semanas mais tarde.)
Neil

2

Utilitários Bash / Unix, 72 69 68 66 bytes

b()(yes `dc<<<2o4d$n^$1^3/p`|tr 01 ' #'|head -$n);n=$1;b 1;b 4;b 1

Experimente online!

Isso funciona usando o fato de que [4 ^ k / 3], quando escrito na base 2, é 10101010 ... 01, com k 1's. (Os colchetes aqui indicam a função do piso.)


2

Pyke, 16 bytes

uAD,sXF**"# 

Experimente aqui!

Equivalente a

1 4 1]3AD,sXF**"# 

Por causa dos imprimíveis

Isso usa alguns truques para diminuir a contagem de bytes:

  • Ele usa alguns imprimíveis para representar a lista [1, 4, 1]
  • XF despeja automaticamente a saída na pilha
  • A cadeia "#no final é trocada pela última *, o que significa que o fechamento "não é necessário. Isso acontece implicitamente quando o último token é uma string.


u                -      [1, 4, 1]
     AD          -     apply(*, ^, input)
       ,         -    zip(^)
        s        -   sum(^)
          F**"#  -  for i in ^:
           *     -    ^ * input
            *    -   ^ * v
             "#  -    "# "
         X       - splat(^)

2

Python 2 , 68 71 65 bytes

-6 com agradecimentos a @sagiksp

def f(i,c=1):
 print(' '*i*4,'')[c>i]+'# '*i*3
 if i*2>c:f(i,c+1)

Experimente online!

Na falta de uma maneira de vencer o @xnor, postarei minha função recursiva simplesmente como uma abordagem alternativa. Para impressões f (5)

                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 

Esse padrão foi escolhido simplesmente porque pode ser dividido em duas partes, diferente de todas as outras.


2
Onde estão os espaços?
precisa saber é o seguinte

1
Sem os espaços na saída, isso não é válido.
Mego 14/01

Meu erro +3 para adicionar os espaços. Atualizada.
ElPedro

1
Na verdade, por que você ainda precisa de j? Você pode redefinir a coisa toda em termos de ie salvar ~ 6 bytes!
23417 sagiksp #

@sagiksp - Obrigado. Atualizado usando sua sugestão.
ElPedro

2

PHP, 64 62 bytes

Economizou 2 bytes graças a Christoph .

while($a="282"[$i++/$s=$argv[1]]*$s)echo str_pad("
",$a,"# ");

Imprime uma rede como esta:

# #
# #
# # # # # # # #
# # # # # # # #
# #
# #

(com uma nova linha líder)


1
while($a="282"[$i++/$s=$argv[1]]*$s)echo str_pad("\n",$a,"# ");economiza 2 bytes.
Christoph

1

Lote, 111 bytes

@set s=
@set i=@for /l %%i in (1,1,%1)do @
%i%call set s=%%s%% #
%i%echo%s%
%i%echo%s%%s%%s%%s%
%i%echo%s%


1

Retina , 39 37 bytes

Esta é a primeira vez que uso Retina, ainda estou tentando entender como fazer as coisas.

.+
$*#
#
# 
\`# 
$_¶
G`.
)*%`^
$_$_$_

(com dois espaços à direita após as linhas 4 e 5)

Agradecimentos a Martin Ender por jogar 2 bytes!

Experimente online!


@ MartinEnder Obrigado, eu não tinha notado esse requisito, agora deve estar correto. Você tem alguma sugestão de como eu deveria tentar jogar isso?
Leo

Não tendo muitas idéias brilhantes, mas tio.run/nexus/… salva dois bytes. Você pode evitar os feeds de linha finais, agrupando tudo em um grupo que possui seu sinalizador de saída (e, como o grupo é a última coisa que o programa, o sinalizador de saída é padronizado como não silencioso). O outro byte evita o quarto $_na parte inferior, alternando algumas coisas após remover a linha vazia. tio.run/nexus/… é a mesma contagem de bytes, mas um pouco mais feia.
Martin Ender

@MartinEnder Obrigado pelas dicas e também por esse idioma, é muito bom!
Leo

Obrigado pelas amáveis ​​palavras. :) Existe uma sala de bate-papo se você tiver alguma dúvida ou quiser discutir coisas. No momento, é bastante silencioso, mas tento mantê-lo descongelado, caso as pessoas tenham dúvidas (e você poderá me enviar mensagens a qualquer momento).
Martin Ender

1

QBIC , 52 67 40 bytes

Reescrita completa:

:[a*3|G=G+@#`][a*2|G=G+@ `][a|?G][a|?_fG

Agora, esse padrão é usado:

###--
--###

Onde o -são preenchidos com espaços.

:        Read 'a' from the command line        > Assume 3
[a*3|    Create 3 segments times 'a' filling   > 3*3 = 9
G=G+@#`] Define A$ to be '#' and add this to G > G = "#########" 
[a*2|    Create 2 segments times 'a' spacer
G=G+@ `] Define B$ to be ' ' and add this to G > G = "#########       " 
[a|      FOR d == 1; d <= a; d++
?G]      Display G$:
            "#########       " 
            "#########       " 
            "#########       " 
[a|      FOR e == 1; e <= a; e++
?_fG     Display G$ in reverse (_f...|):
            "      #########" 
            "      #########" 
            "      #########" 
         (For loop and function call to Flip impicitly closed by QBIC)


@EriktheOutgolfer Updated.
precisa saber é o seguinte

2
Nome de idioma apropriado para o desafio!
FlipTack

1

Pip , 28 17 16 bytes

15 bytes de código, +1 para -nsinalizador.

"# "Xa*_RLaM141

Toma o tamanho como um argumento de linha de comando. Experimente online!

Explicação

                 a is 1st cmdline arg
       _         Build a lambda function
     a*          (a) times argument
"# "X            Repeat string "# " that many times
        RLa      Wrap in a list and repeat list (a) times
           M141  Map that function to the characters of 141
                 Autoprint (-n flag separating list items with newlines)

A seguir, não é exatamente como os dados são modificados, mas fornece a ideia básica (para a=2):

141

[1;4;1]

[2;8;2]

["# # ";"# # # # # # # # ";"# # "]

[["# # ";"# # "];["# # # # # # # # ";"# # # # # # # # "];["# # ";"# # "]]

# # 
# # 
# # # # # # # # 
# # # # # # # # 
# # 
# # 

0

05AB1E , 13 bytes

D141S×S*„# ×»

Experimente online!

Explicação

Exemplo de entrada n=2

D              # duplicate input
               # STACK: 2, 2
 141S          # push the list [1,4,1]
               # STACK: 2, 2, [1,4,1]
     ×         # repeat each item in the list input_no times
               # STACK: 2, [11, 44, 11]
      S        # split into list of digits
               # STACK: 2, [1, 1, 4, 4, 1, 1]
       *       # multiply each digit with input
               # STACK: [2, 2, 8, 8, 2, 2]
        „# ×   # repeat the string "# " for each item in the list
               # STACK: ['# # ','# # ','# # # # # # # # ','# # # # # # # # ','# # ','# # ']
            »  # join by newlines
               # OUTPUT: # # 
                         # # 
                         # # # # # # # # 
                         # # # # # # # # 
                         # # 
                         # # 

0

C #, 152 bytes

n=>{var m="";foreach(int c in new[]{1,4,1})for(int i=0,j;i++<n;){for(j=0;j++<c;)m+=new System.Text.StringBuilder().Insert(0,"# ",n);m+="\n";}return m;};

0

SmileBASIC, 57 50 bytes

INPUT S
E$=("#"*S*3+CHR$(10))*S?E$SCROLL-S*2,-1?E$

Explicado:

INPUT SIZE
PART$=("#"*SIZE*3+CHR$(10))*S 'generate half of the pattern
PRINT PART$ 'print half the pattern
SCROLL SIZE*-2,-1 'scroll the text 2 squares right (and 1 character down)
PRINT PART$ 'print half the pattern again

Após a primeira impressão (tamanho = 2, @ é a posição do cursor):

######
######

@ 

Após o SCROLL:

    ######
    ######
@

Após a segunda impressão:

    ######
    ######
######
######
@

Nesse caso, você pode pular os espaços
dkudriavtsev 02/02

0

Lisp comum, 83 81 79 bytes

(lambda(x)(format t"~v@{~v@{# ~}~:*~%~}~v@{~vt~0@*~v{# ~}~%~}"x(* x 3)(* x 2)))

Uso:

(funcall #'(lambda(x)(format t"~v@{~v@{# ~}~:*~%~}~v@{~vt~0@*~v{# ~}~%~}"x(* x 3)(* x 2)))2)

Saída:

# # # # # #
# # # # # #
    # # 
    # # 
    # # 
    # #       
    # # 
    # #           

Como funciona?

in format there is control string (inside "") and arguments after it
certain commands in string can use arguments (for example ~a displays argument)
~v{~} - takes argument and does commends inside {~} number of times 
                                      (number is given by argument)
       we can write text in loop body - it'll get displayed. Even if
       in loop body there are none commends to use arguments loop itself                 
       will consume one argument (it doesn't matter what it'll be -
       it doesn't seem to affect output)
~% - newline
~n* - jump n arguments forward (relative)
~n:* - jump n arguments backwards (relative)
~n@* - jump to argument n (global, counting from 0)

~v@{~v{# ~}~%~1@*~} <--- we make x rowns, 3x columns of string "# ". 
                         ~1@* is used during looping, it also means we end on argument 1. 
                         (second argument: (* x 3))
~v@{~vt~0@*~v{# ~}~%~} <--- we now make 3x rows, x columns of "(spaces)# "
                         ~vt - is used to move to accurate column. 
                         Here it takes argument (* x 2) - this is 
                         minimal number of columns to display. It uses
                         space as default character for missing characters
                         (when string inside <~> is shorter than min 
                         number of columns). I use it to make (* x 2) spaces, 
                         by giving it no text.
      ~0@* <--- after making spaces we have no new arguments, we go back to
                argument number zero - it is used to determine number of columns in our block

Idéias para melhoria são bem-vindas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.