Crea una regla binaria


22

Dado un número n , genere las primeras n columnas de este patrón:

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

La altura de la columna en (1-indexado) n es el número de 0bits finales en la representación binaria de n , más uno. Como resultado, la capa inferior tiene cada columna rellenada, la segunda capa cada segunda columna, la tercera capa cada cuarta columna, etc.

Reglas

  • Puede ingresar y salir a través de cualquier método estándar.
  • Puede suponer que la entrada es un número entero entre 1 y 999, inclusive.
  • La salida puede contener cualquier cantidad de espacio en blanco, siempre que el patrón esté intacto.
  • El patrón debe estar indexado en 1 y en el mismo formato que se muestra aquí.
  • Puede usar cualquier carácter que no sea un espacio en blanco en lugar de #, pero no puede cambiar el carácter del espacio.

Casos de prueba

1
#

2
 #
##

3
 # 
###

4
   #
 # #
####

5
   # 
 # # 
#####

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

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

Aquí se pueden encontrar algunos casos de prueba más grandes .

Tanteo

Este es el , por lo que gana el código más corto en bytes en cada idioma.



¡Ahora puedo medir la distancia en binario! Oh, espera ...
Okx

2
1. ¿La regla tiene que ser horizontal? 2. ¿Las marcas tienen que ser #?
Jonathan Allan

1
@JonathanAllan 1. Sí, y 2. No, pueden ser cualquier personaje no espacial. He añadido esto a las reglas.
ETHproductions

La secuencia en OEIS: A001511
No es un árbol

Respuestas:


11

Python 2 , 54 bytes

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

Pruébalo en línea!

Imprime con muchos espacios en blanco líderes. Cada fila que icuenta hacia abajo nrepite un patrón de 2**i-1espacios seguido de a #. Este patrón se repite hasta el ancho de la regla, que es la entrada n. Esto se hace multiplicando la cadena del patrón por ny tomando los primeros ncaracteres con [:n].

El patrón puede hacerse formateando cadenas para una alternativa de igual longitud.

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

Un lindo método de corte es más largo.

n=input();s=~-2**n*' '+'#'
exec"s=s[1::2]*2;print s[:n];"*n

¿El ~ es -1 o +1?
Stan Strum

No importa, es (-x) - 1
Stan Strum


9

V , 17 , 16 bytes

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

Pruébalo en línea!

Hexdump:

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

¡Gracias a @KritixiLithos por guardar un byte!

Este algoritmo es terriblemente ineficiente, pero debería funcionar en teoría para cualquier entrada de tamaño.

Funciona generando las primeras n iteraciones del siguiente patrón:

#

 #
##

   #
 # #
####

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

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

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

Y luego cortando todas menos las primeras n columnas. Como tal, esto producirá una tonelada de espacios en blanco líderes, pero el OP dijo:

La salida puede contener cualquier cantidad de espacio en blanco, siempre que el patrón esté intacto

Explicación:

é#                      " 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

No estoy completamente seguro, pero creo que puedes eliminar el |.
Kritixi Lithos

@KritixiLithos ¡Ajá! En retrospectiva, ¡es tan obvio! Gracias por el consejo. :)
DJMcMayhem

5

JavaScript (ES6), 61 58 bytes

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

Ahorré 1 byte gracias a @ETHProductions, luego 2 bytes más cuando vi que se podía usar cualquier carácter.

Una solución recursiva.

Casos de prueba:

Animación:


1
Bien hecho. Puede cambiar c/2|0a c>>1para guardar un byte.
ETHproductions

Bien, necesito repasar mis operadores bit a bit.
Rick Hitchcock

4

APL (Dyalog) , 21 bytes

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

Pruébalo en línea!

'# '[... `] indexa la cadena con

 obtener entrada

 que muchos í ntegers

2⊥⍣¯1 convertir a binario, utilizando tantos dígitos como sea necesario (un número en cada columna )

 voltear al revés

∨⍀ reducción vertical acumulativa O

0⍪ concatenar ceros en la parte superior

 voltear al revés (es decir, retroceder de nuevo)

1+ agregar uno (para indexación basada en 1)





2

Japt , 20 17 bytes

Guardado 3 bytes gracias a @Shaggy y @ETHproductions

õ_¤q1 o Ä ço÷z w

Pruébalo en línea!

Explicación:

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"]


@Shaggy En realidad, ni siquiera necesitas ell
ETHproductions

@ETHproductions: sí, lo descubrí. 18 bytes
Shaggy


Un truco genial con operadores bit a bit consiste en n&-ncapturar solo el final 1y todos los 0s finales n. No estoy seguro de si esto ayudará, pero vale la pena
intentarlo

2

C, 84 74 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;}

Sin golf:

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);
    }
}

Prueba con:

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

Explicación

Una vez más, la recursión toma menos caracteres en C que la iteración, por lo que los dos bucles se expresan como las dos invocaciones recursivas.

Además, C es un gran lenguaje para jugar trucos con expresiones booleanas, permitiendo la decisión de poner un espacio en blanco o un #a ser expresado por la expresión 32+3*!(i&m). Un espacio tiene el valor ASCII de 32, #es ASCII 35, por lo que obtenemos un espacio en blanco si alguno de los bits de la máscara está configurado i.


¿Necesitas el int i,l,m?
Zacharý

@ ZacharyT No, resulta que no lo hice. Gracias por guardar esos 10 bytes :-)
cmaster

2

Pyth , 15 bytes

j_.tm*Nhx_.Bd1S

¡Intentalo!

explicación

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

@JasonS ¡Es un lenguaje de golf basado en Python! Ahora vinculé el github de pyth . Pensé que lo intente! un enlace al ejecutor en línea sería suficiente.
KarlKastor


1

JavaScript (ES8), 71 bytes

¡La función padStart () se introdujo en 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`)


1
@RickHitchcock fijo.
darrylyeo

1

Mathematica, 69 bytes

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

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),"")

Bien. 'tiempo explicativo.

En primer lugar, reemplace cada COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1con simplemente [i], para la entrada. el token cuenta el número de celdas, sin incluirse, que contienen una fórmula, y luego agrega una, para incluirse a sí misma. Como WESRRMICGSE arrastra una fórmula de acuerdo con la entrada que le da, este token siempre da como resultado la entrada.

tenemos:

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

Esto es mucho más legible. Vas a ver mucho el FLOOR(LOG([i],2),1)token, lo que simplemente significa tomar la potencia más cercana de 2, que es menor que el número input ( [i]). por ejemplo: 4->4, 5->4, 6->4, 7->4, 8->8 ...etc. Reemplazaré eso conGS[[i]]

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

mejor. desglosando la cláusula if, estamos probando si la fila es menor o igual a GS[[i]]+3, porque la altura de todas las reglas es igual a GS [[i]] + 1, esto selecciona las filas que son iguales a la altura de regla. +1para filas de indexación 1, y +1nuevamente para desplazamiento WESRRMICGSE.

El FALSEresultado produce una celda vacía (""), y un resultado verdadero produceLEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i])

Actualmente sigue editando, estad atentos



1

k, 33 bytes

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

Esto solo parece funcionar en el intérprete de AW .

Ejemplo de ello trabajando en el intérprete de AW.

La versión oK (que puede probar en línea) parece tener un error, que requiere un ligero cambio para que funcione:

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

1

C #, 174 bytes

Este método tiene dos parámetros, una entrada para la longitud de la regla y una salida que es la regla como cadena.

Golfizado:

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]?'#':' ');}

Sangrado:

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.
            ;                                     //
}

Pruébalo en línea!


¿La conversión a un le Func<int, string>ahorrará algunos bytes?
TheLethalCoder

1

Carbón , 27 23 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: guardado 4 bytes cambiando a JumpTo.


Todavía es absoluto, justo ahora se llama JumpTo(lo siento)
solo ASCII

@ Solo ASCII Ah, el wiki podría funcionar con una actualización. (O supongo que podría hacerlo si desea darme permiso de edición ...)
Neil

@ Solo ASCII Huh, debería haberlo recordado de codegolf.stackexchange.com/a/119904 ...
Neil

¿Tienes una cuenta de GitHub?
Solo ASCII

@ Solo ASCII Tengo dos ... No puedo decidir cuál es más apropiado ...
Neil

1

J, 38 bytes

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

No es bueno. Lmk si el conteo de bytes está apagado, estoy en mi teléfono.


A mí me parece 38, a menos que 3al principio se ingrese ...
ETHproductions

@ETHproductions gracias, la vergüenza se cambia de una definición tácita no ha guardado ningún byte ...
cole

1
28 bytes con0|.@|:'#'#"0~1#.2~:/\i.#:@,]
millas

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;}

Pruébalo en línea!

Sin golf:

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)
}



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.