Crie uma régua binária

22

Dado um número n , gere as primeiras n colunas deste padrão:

                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################ ...

A altura da coluna em (indexado 1) n é o número de 0bits à direita na representação binária de n , mais um. Como resultado, a camada inferior tem todas as colunas preenchidas, a segunda camada a cada segunda coluna, a terceira camada a cada quarta coluna, etc.

Regras

  • Você pode inserir e enviar através de qualquer método padrão.
  • Você pode assumir que a entrada é um número inteiro entre 1 e 999, inclusive.
  • A saída pode conter qualquer quantidade de espaço em branco, desde que o padrão esteja intacto.
  • O padrão deve ser indexado em 1 e no mesmo formato mostrado aqui.
  • Você pode usar qualquer caractere que não seja um espaço em branco no lugar de #, mas não pode alterar o caractere de espaço.

Casos de teste

1
#

2
 #
##

3
 # 
###

4
   #
 # #
####

5
   # 
 # # 
#####

7
   #   
 # # # 
#######

32
                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################

Alguns casos de teste maiores podem ser encontrados aqui .

Pontuação

Isso é , então o código mais curto em bytes em cada idioma vence.

ETHproductions
fonte
2
Relacionado .
ETHproductions
Agora eu posso medir a distância em binário! Ah, espere ...
Okx,
2
1. A régua precisa ser horizontal? 2. As marcações precisam ser #?
Jonathan Allan
1
@ JonathanAllan 1. Sim e 2. Não, eles podem ser qualquer caractere não espacial único. Eu adicionei isso às regras.
ETHproductions
A sequência no OEIS: A001511
Não é uma árvore

Respostas:

11

Python 2 , 54 bytes

i=n=input()
while i:i-=1;print((' '*~-2**i+'#')*n)[:n]

Experimente online!

Imprime com muitos espaços em branco à esquerda. Cada linha da icontagem regressiva nrepete um padrão de 2**i-1espaços seguido por a #. Esse padrão é repetido até a largura da régua, que é a entrada n. Isso é feito multiplicando a sequência padrão ne levando os primeiros ncaracteres com [:n].

O padrão pode ser feito pela formatação de sequência para uma alternativa de comprimento igual.

i=n=input()
while i:i-=1;print('%%%ds'%2**i%'#'*n)[:n]

Um método de fatiar bonito é mais longo.

n=input();s=~-2**n*' '+'#'
exec"s=s[1::2]*2;print s[:n];"*n
xnor
fonte
O ~ é -1 ou +1?
Stan Strum
Não importa, é (-x) - 1
Stan Strum 08/17
10

Python 3 , 74 bytes

n=int(input())
a=1
while a<n:a*=2
while a:print(("%%%dd"%a%4*n)[:n]);a//=2

Experimente online!

Freira Furada
fonte
Uau, demorei um pouco para descobrir como as linhas são geradas. Bem feito.
ETHproductions
2
a=2**len(bin(n))para 72 bytes
ovs
2
Irá detectar erros de memória rapidamente e imprimir um monte de espaço em branco extra (permitido) - mas você pode fazer 54 usando o Python 2 .
Jonathan Allan
9

V , 17 , 16 bytes

é#Àñä}Är {ñÎÀlD

Experimente online!

Hexdump:

00000000: e923 c0f1 e416 7dc4 7220 7bf1 cec0 6c44  .#....}.r {...lD

Agradecemos a @KritixiLithos por salvar um byte!

Esse algoritmo é terrivelmente ineficiente, mas deve funcionar em teoria para qualquer tamanho de entrada.

Ele funciona gerando as primeiras n iterações do seguinte padrão:

#

 #
##

   #
 # #
####

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

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

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

E depois cortando todas, exceto as primeiras n colunas. Como tal, isso produzirá uma tonelada de espaços em branco, mas o OP disse:

A saída pode conter qualquer quantidade de espaço em branco, desde que o padrão esteja intacto

Explicação:

é#                      " Insert an '#'
  Àñ           ñ        " 'N' times:
    ä<C-v>}             "   Duplicate every line blockwise (duplicating horizontally instead of vertically)
           Ä            "   Duplicate the top line. This conveniently puts us on the first non-whitespace character (that is, '#')
            r           "   Replace this character with a space
              {         "   Move to the beginning of the buffer
                Î       " On every line:
                 Àl     "   Move 'N' characters to the right ('l' for right, makes sense, right?)
                   D    "   And delete everything after the cursor
DJMcMayhem
fonte
Não tenho certeza, mas acho que você pode remover o |.
Kritixi Lithos
@KritixiLithos Aha! Em retrospectiva, é tão óbvio! Obrigado pela dica. :)
DJMcMayhem
5

JavaScript (ES6), 61 58 bytes

f=(n,c=n,s='')=>c?f(n,c>>1,s+s+' ')+`
`+(s+1).repeat(c):''

Salvei 1 byte graças a @ETHProductions e mais 2 bytes quando vi que qualquer caractere poderia ser usado.

Uma solução recursiva.

Casos de teste:

Animação:

Rick Hitchcock
fonte
1
Bem feito. Você pode mudar c/2|0para c>>1salvar um byte.
ETHproductions
Bom, preciso atualizar meus operadores bit a bit.
Rick Hitchcock
4

APL (Dyalog) , 21 bytes

'# '[1+⊖0⍪∨⍀⊖2⊥⍣¯1⍳⎕]

Experimente online!

'# '[… `] Indexe a string com

 obter entrada

 que muitos i ntegers

2⊥⍣¯1 converter para binário, usando quantos dígitos forem necessários (um número em cada coluna )

 virar de cabeça para baixo

∨⍀ redução OR cumulativa vertical

0⍪ concatenar zeros na parte superior

 virar de cabeça para baixo (ou seja, voltar para cima)

1+ adicione um (para indexação baseada em 1)

Adão
fonte
3

Geléia , 11 10 bytes

Rọ2‘4ẋz⁶ṚY

Experimente online!

1 byte salvo após o OP adicionou um relaxamento que o personagem não precisa ser #.

Freira Furada
fonte
2

Oitava, 45 bytes

@(n)[[sort(cummin(de2bi(g=0:n)'));g|1]+32 '']

Experimente no Octave Online!

Em vez de '#'impressões '!'.

rahnema1
fonte
2

PHP , 139 bytes

for($f=array_fill(0,$l=1+log($a=$argn,2)," ");$n++<$a;)for($h=1+strspn(strrev(decbin($n)),$i=0);$i<$h;)$f[$l-++$i][$n]=3;echo join("
",$f);

Experimente online!

Jörg Hülsermann
fonte
2

Japonês , 20 17 bytes

Economizou 3 bytes graças a @Shaggy e @ETHproductions

õ_¤q1 o Ä ço÷z w

Experimente online!

Explicação:

Entrada: 5

õ_¤q1 o Ä ço÷z w
õ           Ã       // Create a range [1...Input] [1,2,3,4,5]
 _                  // Map; At each item:
  ¤                 //   Convert to binary        ["1","10","11","100","101"]
   q1               //   Split on "1"             [["",""],["","0"],["","",""],["","00"],["","0",""]]
      o             //   Get the last item        ["","0","","00",""]
        Ä           //   Add 1                    [["1","01","1","001","1"]]
          ço        //   Fill with "o"            ["o","oo","o","ooo","o"]
             ·      // Join with new-lines        ["o\noo\no\nooo\no"]
              z     // Rotate 90 degrees          ["ooooo\n o o \n o   "]
                w   // Reverse                    ["   o \n o o \nooooo"]
Oliver
fonte
20 bytes
Shaggy
@Shaggy Na verdade, você nem precisa dol
ETHproductions
@ ETHproductions: sim, acabei de descobrir isso. 18 bytes
Shaggy
17 bytes
Shaggy
Um truque legal com operadores bit a bit é fazer n&-npara capturar apenas a final 1e todos à direita 0s em n. Não tenho certeza se isso vai ajudar, mas vale a pena um tiro ...
ETHproductions
2

C, 84 bytes

f(i,l,m){putchar(32+3*!(i&m));i<l?f(i+1,l,m):m?putchar(10),f(1,l,m>>1):1;}

Ungolfed:

void f(int counter, int length, int mask) {
    putchar((counter&mask) ? ' ' : '#');
    if(counter<length) {
        f(counter+1, length, mask);
    } else if(mask) {
        putchar('\n');
        f(1, length, mask>>1);
    }
}

Teste com:

int main() {
    f(1, 32, 1023);
    putchar('\n');
    f(1, 1, 1023);
    putchar('\n');
    f(1, 999, 1023);
    putchar('\n');
}

Explicação

Mais uma vez, a recursão ocupa menos caracteres em C que a iteração, portanto os dois loops são expressos como as duas invocações recursivas.

Além disso, C é uma ótima linguagem para fazer truques com expressões booleanas, permitindo a decisão de colocar um espaço em branco ou um #a ser expresso pela expressão 32+3*!(i&m). Um espaço tem o valor ASCII de 32, #é o ASCII 35, portanto, ficamos em branco se algum dos bits da máscara estiver definido i.

cmaster
fonte
Você ainda precisa do int i,l,m?
Zachary
@ZacharyT Não, acontece que não. Obrigado por salvar essas 10 bytes :-)
cmaster
2

Pyth , 15 bytes

j_.tm*Nhx_.Bd1S

Tente!

explicação

j_.tm*Nhx_.Bd1S
    m         SQ   # map over the numbers from 0 to the implicit input (lambda variable: d)
          .Bd      # Convert d to a binary string: (12 -> 1100)
         _         # reverse: (1100 -> 0011)
        x    1     # get the location of the first 1 ( 2 )
     *Nh           # make one more than that " quotation marks (""")
 _.t               # transpose the list of quotation mark strings and reverse it
j                  # join on newline
KarlKastor
fonte
@JasonS É uma linguagem de golfe baseada em Python! Agora liguei o github de pyth . Eu pensei que o Experimente! um link para o Executor on-line seria suficiente.
KarlKastor
2

Python 2 , 47 bytes

f=lambda n:n and' '.join(f(n/2))+'\n'+n*'#'or''

Experimente online!

Anders Kaseorg
fonte
1

JavaScript (ES8), 71 bytes

A função padStart () foi introduzida no ECMAScript 2017!

N=>eval(`for(s='',n=1;n<=N;n*=2)s='\\n'+'#'.padStart(n).repeat(N/n)+s`)


JavaScript (ES6), 77 bytes

N=>eval(`for(s='',n=1;n<=N;n*=2)s='\\n'+(' '.repeat(n-1)+'#').repeat(N/n)+s`)

darrylyeo
fonte
1
@RickHitchcock Fixed.
darrylyeo
1

Mathematica, 69 bytes

Rotate[Grid["#"~Table~#&/@(IntegerExponent[2*#,2]&/@Range[#])],Pi/2]&
J42161217
fonte
1

( WESRRMICGSE ): 237 bytes

IF(ROW()<=FLOOR(LOG(COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1,2),1)+2,LEFT(REPT(REPT(" ",FLOOR(POWER(2,LOG(COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1,2)-ROW()+2),1)-1) &"#",COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1),COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1),"")

Bem. 'tempo de torcer.

Primeiro, substitua todos COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1por simplesmente [i], para entrada. o token conta o número de células, sem incluir a si mesmo, que contêm uma fórmula e, em seguida, adiciona uma, para incluir a si mesma. Como o WESRRMICGSE arrasta uma fórmula de acordo com a entrada fornecida, esse token sempre resulta na entrada.

temos:

IF(ROW()<=FLOOR(LOG([i],2),1)+3,LEFT(REPT(REPT(" ",FLOOR(POWER(2,LOG([i],2)-ROW()+2),1)-1) &"#",[i]),[i]),"")

Isso é muito mais legível. Você verá muito o FLOOR(LOG([i],2),1)token, o que significa simplesmente tomar a potência mais próxima de 2, que é menor que o [i]número de entrada ( ). por exemplo: 4->4, 5->4, 6->4, 7->4, 8->8 ...etc. Vou substituir isso porGS[[i]]

IF(ROW()<=GS[[i]]+3,LEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i]),"")

Melhor. quebrando a cláusula if, estamos testando se a linha é menor ou igual a GS[[i]]+3, porque a altura de todas as réguas é igual a GS [[i]] + 1, isso seleciona as linhas que são iguais à altura da régua. +1para linhas de indexação 1 e +1novamente para o deslocamento WESRRMICGSE.

O FALSEresultado gera uma célula vazia ("") e um resultado verdadeiro geraLEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i])

atualmente ainda editando, fique atento

tuskiomi
fonte
1

Haskell , 64 62 bytes

l m=([2..2^m]>>" ")++'#':l m
f n=unlines$take n.l<$>[n,n-1..0]

Experimente online! Exemplo de utilização: f 10.

Laikoni
fonte
1

k, 33 bytes

`0:|" #"{(1+!x){~y!x}/:(x>)(2*)\1}

Isso parece funcionar apenas no intérprete do AW .

Exemplo dele trabalhando no intérprete do AW.

A versão oK (que você pode experimentar on-line) parece ter um bug, exigindo uma pequena alteração para fazê-lo funcionar:

`0:|" #"{(1+!x){~y!x}/:{x>y}[x](2*)\1}
zgrep
fonte
1

C #, 174 bytes

Este método possui dois parâmetros, uma entrada para o comprimento da régua e uma saída que é a régua como string.

Golfe:

void R(int n,out string s){var l=new int[++n];int i,x=n,y=0;for(s="";x-->1;)for(i=0;0==(l[x]=(x>>i++&1)*i);y=y<i?i:y);for(y++;y-->0;s+='\n')for(x=0;++x<n;s+=y<l[x]?'#':' ');}

Recuado:

void R(int n,out string s){                       // Return the result in an out parameter.
    var l=new int[++n];                           // Use a 1-based array.
    int i,x=n,y=0;                                //
    for(s="";x-->1;)                              // For each number x on the ruler
        for(i=0;0==(l[x]=(x>>i++&1)*i);y=y<i?i:y) // ... find lowest set bit of x, counting the maximum value.
            ;                                     //
    for(y++;y-->0;s+='\n')                        // Count down each line.
        for(x=0;++x<n;s+=y<l[x]?'#':' ')          // Output # for numbers that are tall enough.
            ;                                     //
}

Experimente online!

Mão-E-Comida
fonte
A conversão para uma Func<int, string>economia de alguns bytes?
TheLethalCoder
1

Carvão , 27 23 bytes

↶F…·¹N«Jι⁰#W¬﹪鲫A÷ι²ι#

Experimente online! Link é a versão detalhada do código. Editar: salvou 4 bytes mudando para JumpTo.

Neil
fonte
Ainda é absoluto, agora é chamado JumpTo(desculpe)
somente ASCII
@ Somente ASCII Ah, o wiki poderia fazer com uma atualização. (Ou eu suponho que eu poderia fazê-lo se você quiser me dar permissão de edição ...)
Neil
@ ASCII-only Huh, eu deveria ter lembrado que a partir codegolf.stackexchange.com/a/119904 ...
Neil
Você possui uma conta no GitHub?
somente ASCII
@ ASCII somente eu tenho dois ... Eu não posso decidir qual é o mais apropriado ...
Neil
1

J, 38 bytes

3 :'|.|:''#''#~,.(1+|.i.1:)@#:"0>:i.y'

Nada bom. Lmk se a contagem de bytes estiver desativada - estou no meu telefone.

Cole
fonte
Looks como 38 para mim, a menos que o 3no início é a entrada ...
ETHproductions
@ETHproductions graças, vergonha mudar de uma definição tácita não salvou nenhum bytes ...
cole
1
28 bytes com0|.@|:'#'#"0~1#.2~:/\i.#:@,]
milhas
0

Java (OpenJDK 8) , 91 bytes

n->{int i=10,j;String s="";for(;i-->0;s+="\n")for(j=0;j++<n;)s+=j>>i<<i<j?' ':35;return s;}

Experimente online!

Ungolfed:

n->{
    int i=10,j; // Since we are allowed extra whitespace, set columns always to 10
    String s = "";
    for(;i-->0;s+="\n")      // Every iteration add a newline, i=9..0
        for(j=0;j++<n;)      // j=1..n+1
            s+= j>>i<<i<j    // if j has less than i trailing 0s in binary form
                ?' '         // add a space else
                :35          // # (java handles ternary return types weirdly)
}
PunPun1000
fonte
0

CJam, 34 bytes

ri{2bW%0+0#)}%_'#f*\:e>f{Se]}zW%N*

Meh.

Esolanging Fruit
fonte
0

C (gcc) , 70 bytes

f(x,l,n){for(l=512;l/=2;)for(n=0;n++<=x;)putchar(n^x+1?n%l?32:35:10);}

Experimente online!

Giacomo Garabello
fonte
Sugerir em n+~xvez den^x+1
ceilingcat 31/01