Buat penguasa biner

22

Diberi angka n , hasilkan n kolom pertama dari pola ini:

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

Ketinggian kolom di (1-diindeks) n adalah jumlah 0bit tambahan dalam representasi biner n , ditambah satu. Akibatnya, lapisan bawah memiliki setiap kolom diisi, lapisan kedua setiap kolom kedua, lapisan ketiga setiap kolom keempat, dll.

Aturan

  • Anda dapat input dan output melalui metode standar apa pun.
  • Anda dapat menganggap inputnya bilangan bulat antara 1 dan 999, inklusif.
  • Output dapat berisi jumlah spasi putih apa pun, asalkan polanya masih utuh.
  • Polanya harus diindeks 1, dan dalam format yang sama seperti yang ditunjukkan di sini.
  • Anda dapat menggunakan karakter non-spasi tunggal apa pun sebagai pengganti #, tetapi Anda tidak dapat mengubah karakter spasi.

Uji kasus

1
#

2
 #
##

3
 # 
###

4
   #
 # #
####

5
   # 
 # # 
#####

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

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

Beberapa kasus uji yang lebih besar dapat ditemukan di sini .

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte di setiap bahasa menang.

Produksi ETH
sumber
2
Terkait .
ETHproduk
Sekarang saya bisa mengukur jarak dalam biner! Oh, tunggu ...
Okx
2
1. Apakah penguasa harus horizontal? 2. Apakah tanda harus #?
Jonathan Allan
1
@ JonathanAllan 1. Ya, dan 2. Tidak, mereka dapat berupa karakter non-spasi tunggal. Saya telah menambahkan ini ke aturan.
ETHproduk
Urutan di OEIS: A001511
Bukan pohon

Jawaban:

11

Python 2 , 54 byte

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

Cobalah online!

Mencetak dengan banyak spasi putih terkemuka. Setiap baris imenghitung mundur dari npengulangan pola 2**i-1spasi diikuti oleh a #. Pola ini diulang hingga lebar penggaris, yang merupakan input n. Ini dilakukan dengan mengalikan string pola dengan ndan mengambil nkarakter pertama [:n].

Pola dapat dibuat dengan memformat string untuk alternatif dengan panjang yang sama.

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

Metode mengiris yang lucu lebih lama.

n=input();s=~-2**n*' '+'#'
exec"s=s[1::2]*2;print s[:n];"*n
Tidak
sumber
Apakah ~ adalah -1 atau +1?
Stan Strum
Sudahlah, (-x) - 1
Stan Strum
10

Python 3 , 74 byte

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

Cobalah online!

Biarawati Bocor
sumber
Wow, butuh beberapa saat untuk mencari tahu bagaimana baris dihasilkan. Sudah selesai dilakukan dengan baik.
ETHproduk
2
a=2**len(bin(n))untuk 72 bytes
ovs
2
Ini akan mengenai kesalahan memori dengan cepat, dan mencetak banyak ruang ekstra putih (diizinkan) - tetapi Anda dapat melakukannya menggunakan Python 2 .
Jonathan Allan
9

V , 17 , 16 byte

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

Cobalah online!

Hexdump:

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

Terima kasih kepada @KritixiLithos karena telah menghemat satu byte!

Algoritma ini sangat tidak efisien, tetapi harus bekerja secara teori untuk input ukuran apa pun.

Ia bekerja dengan menghasilkan pertama n iterasi dari pola berikut:

#

 #
##

   #
 # #
####

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

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

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

Dan kemudian memotong semua kecuali kolom n pertama . Dengan demikian, ini akan menghasilkan satu ton spasi putih terkemuka, tetapi OP mengatakan:

Output dapat berisi jumlah spasi putih, asalkan polanya masih utuh

Penjelasan:

é#                      " 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
sumber
Saya tidak sepenuhnya yakin, tapi saya pikir Anda dapat menghapus |.
Kritixi Lithos
@KritixiLithos Aha! Kalau dipikir-pikir, itu sangat jelas! Terima kasih atas tipnya. :)
DJMcMayhem
5

JavaScript (ES6), 61 58 byte

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

Disimpan 1 byte berkat @ETHProductions, lalu 2 byte lagi ketika saya melihat bahwa karakter apa pun dapat digunakan.

Solusi rekursif.

Kasus uji:

Animasi:

Rick Hitchcock
sumber
1
Sudah selesai dilakukan dengan baik. Anda dapat mengubah c/2|0ke c>>1untuk menyimpan byte.
ETHproduk
Bagus, saya perlu memoles operator bitwise saya.
Rick Hitchcock
4

APL (Dyalog) , 21 byte

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

Cobalah online!

'# '[... `] mengindeks string dengan

 dapatkan input

 yang banyak saya ntegers

2⊥⍣¯1 konversikan ke biner, gunakan sebanyak digit yang diperlukan (satu angka di setiap kolom )

 terbalik terbalik

∨⍀ kumulatif ATAU reduksi vertikal

0⍪ angka nol di atas

 flip terbalik (yaitu kembali lagi)

1+ tambahkan satu (untuk pengindeksan berbasis 1)

Adm
sumber
3

Jelly , 11 10 byte

Rọ2‘4ẋz⁶ṚY

Cobalah online!

1 byte disimpan setelah OP menambahkan relaksasi yang tidak harus dilakukan oleh karakter #.

Biarawati Bocor
sumber
2

Oktaf, 45 byte

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

Cobalah di Octave Online!

Alih-alih '#'mencetak '!'.

rahnema1
sumber
2

PHP , 139 byte

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

Cobalah online!

Jörg Hülsermann
sumber
2

Japt , 20 17 byte

Disimpan 3 byte berkat @Shaggy dan @ETHproduksi

õ_¤q1 o Ä ço÷z w

Cobalah online!

Penjelasan:

Input: 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
sumber
20 byte
Shaggy
@ Shaggy Sebenarnya, Anda bahkan tidak perlul
Produk ETH
@ ETHproductions: ya, baru tahu itu. 18 byte
Shaggy
17 byte
Shaggy
Trik keren dengan operator bitwise adalah melakukan n&-nuntuk menangkap hanya final 1dan semua trailing 0s n. Tidak yakin apakah ini akan membantu, tetapi patut dicoba ...
ETHproduksi
2

C, 84 74 byte

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

Tidak Disatukan:

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

Tes dengan:

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

Penjelasan

Sekali lagi, rekursi mengambil lebih sedikit karakter dalam C daripada iterasi, sehingga dua loop dinyatakan sebagai dua doa rekursional.

Juga, C adalah bahasa yang bagus untuk memainkan trik dengan ekspresi boolean, memungkinkan keputusan apakah akan mengosongkan atau #untuk diekspresikan oleh ekspresi 32+3*!(i&m). Spasi memiliki nilai ASCII 32, #yaitu ASCII 35, jadi kami mendapatkan nilai kosong jika ada bit dalam mask yang disetel i.

cmaster
sumber
Apakah Anda memerlukannya int i,l,m?
Zacharý
@ ZakaryT Tidak, ternyata saya tidak. Terima kasih telah menyimpan 10 byte itu :-)
cmaster
2

Pyth , 15 Bytes

j_.tm*Nhx_.Bd1S

Cobalah!

penjelasan

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
sumber
@JasonS Ini adalah bahasa golf yang didasarkan pada Python! Saya sekarang menghubungkan github pyth . Saya pikir Cobalah! tautan ke Pelaksana online akan cukup.
KarlKastor
2

Python 2 , 47 byte

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

Cobalah online!

Anders Kaseorg
sumber
1

JavaScript (ES8), 71 bytes

The padStart() function was introduced in 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
sumber
1
@RickHitchcock Fixed.
darrylyeo
1

Mathematica, 69 bytes

Rotate[Grid["#"~Table~#&/@(IntegerExponent[2*#,2]&/@Range[#])],Pi/2]&
J42161217
sumber
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),"")

Alright. 'splaining time.

First off, replace every COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1 with simply [i], for input. the token counts the number of cells, not including itself, that contain a formula, and then adds one, to include itself. Since WESRRMICGSE drags a formula according to the input you give it, this token always results in the input.

we have:

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

This is much more readable. You're going to see the FLOOR(LOG([i],2),1) token a lot, which simply means take the nearest power of 2 which is less than the input ([i]) number. eg: 4->4, 5->4, 6->4, 7->4, 8->8 ...etc. I'll replace that with GS[[i]]

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

better. breaking down the if clause, we're testing if the row is less than or equal to GS[[i]]+3, because all rulers' height is equal to the GS[[i]]+1, this selects the rows which are equal to the height of the ruler. +1 for 1-indexing rows, and +1 again for WESRRMICGSE offset.

The FALSE result yields an empty cell (""), and a true result yields LEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i])

currently still editing, stay tuned

tuskiomi
sumber
1

Haskell, 64 62 bytes

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

Try it online! Example usage: f 10.

Laikoni
sumber
1

k, 33 bytes

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

This only seems to work in AW's interpreter.

Example of it working in AW's interpreter.

The oK version (which you can try online) seems to have a bug, requiring a slight change to make it work:

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

C#, 174 bytes

This method has two parameters, an input for the ruler length, and an output which is the ruler as string.

Golfed:

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

Indented:

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

Try it online!

Hand-E-Food
sumber
Would converting to a Func<int, string> save you some bytes?
TheLethalCoder
1

Charcoal, 27 23 bytes

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

Try it online! Link is to verbose version of code. Edit: Saved 4 bytes by switching to JumpTo.

Neil
sumber
It's still absolute, just now it's called JumpTo (sorry)
ASCII-only
@ASCII-only Ah, the wiki could do with an update. (Or I assume I could do it should you want to give me edit permission...)
Neil
@ASCII-only Huh, I should have remembered that from codegolf.stackexchange.com/a/119904 ...
Neil
Do you have a GitHub account?
ASCII-only
@ASCII-only I have two... I can't decide which one is more appropriate...
Neil
1

J, 38 bytes

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

Not great. Lmk if the byte count is off -- I'm on my phone.

cole
sumber
Looks like 38 to me, unless the 3 at the beginning is input...
ETHproductions
@ETHproductions thanks, shame switching from a tacit definition didn't save any bytes...
cole
1
28 bytes with 0|.@|:'#'#"0~1#.2~:/\i.#:@,]
miles
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;}

Try it 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
sumber
0

CJam, 34 bytes

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

Meh.

Esolanging Fruit
sumber
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);}

Try it online!

Giacomo Garabello
sumber
Suggest n+~x instead of n^x+1
ceilingcat