Katedral Fraktal

22

Diberikan bilangan bulat positif n >= 1, output nbaris pertama dari struktur berikut:

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

Baris nke-1 yang diindeks adalah representasi biner dari n, dicerminkan tanpa menyalin karakter terakhir, dengan #di tempat 1 dan <space>di tempat 0. Semua baris dipusatkan.

Anda harus menampilkan sebagai ASCII-art tetapi Anda dapat menggunakan karakter non-spasi putih di tempat yang saya gunakan #dalam contoh. Trailing whitespace diizinkan, dan baris baru trailing diizinkan. Keluaran harus terlihat seperti contoh, dan tidak ada spasi putih tambahan atau baris baru terkemuka.

Anda dapat melihat 1023 baris pertama dari katedral fraktal di sini .

Untuk menghasilkan kasus uji yang lebih besar, berikut ini adalah implementasi referensi yang tidak diklik dalam Python

HyperNeutrino
sumber
Ide bagus. Saya tidak akan menebak angka biner telah menghasilkan seni ascii yang begitu cantik.
Jonah
@Jonah Terima kasih :) Senang Anda menyukainya
HyperNeutrino
7
Kedua tautan menunjuk ke katedral yang dihasilkan.
Otávio
@ Otávio: Saya akan memperbaikinya, terima kasih
HyperNeutrino

Jawaban:

6

MATL , 10 byte

:B2&Zv35*c

Cobalah online!

Penjelasan

:      % Implicitly input n. Push range [1 2 ... n]
B      % Convert to binary. Gives a matrix where each row corresponds to
       % a number. Rows have left-padding zeros if needed
2      % Push 2
&Zv    % Symmetrize along sepecified dimension (2nd means horizontally),
       % without repeating the last element
35*    % Multiply by 35 (ASCII code for '#')
c      % Convert to char. Char 0 is shown as space. Implicitly display
Luis Mendo
sumber
1
Saya bertanya-tanya apakah akan sangat membantu untuk menambahkan semacam builtin yang sesuai dengan mengalikan dengan 35 kemudian dikonversi ke char. Tampaknya sering digunakan
Conor O'Brien
@ ConorO'Brien Sering digunakan, ya. Tapi itu akan menjadi built-in dua-char, jadi tidak akan ada keuntungan
Luis Mendo
Tidak ada untung? 35*cadalah 4 karakter
Conor O'Brien
@ ConorO'Brien Ah, maksudmu dengan 35memperbaiki? Tampaknya agak spesifik. Di sisi lain, beberapa tantangan memungkinkan char apa pun, jadi itu mungkin ide yang bagus. Apakah menurut Anda #yang paling umum?
Luis Mendo
2
Untuk referensi, fitur ini telah diterapkan (fungsi Zc, dengan karakter 35, yaitu #). Terima kasih, @ ConorO'Brien!
Luis Mendo
5

05AB1E , 9 byte

Kode:

Lb€û.c0ð:

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

L              # List [1, .., input]
 b             # Convert each to binary
  €û           # Palindromize each binary number
    .c         # Join the array by newlines and centralize
      0ð:      # Replace zeroes by spaces
Adnan
sumber
4

Jelly , 12 byte

RBUz0ZUŒBo⁶Y

Cobalah online!

Biarawati Bocor
sumber
1
Saya juga harus pergi, jadi saya akan membaca komentar ketika saya kembali. Jangan ragu untuk bermain golf dengan saya.
Leaky Nun
+1 untuk "merasa bebas untuk mengalahkan saya" dan untuk jawaban yang bagus.
Magic Gurita Guci
3

Python 2 , 92 byte

n=input()
for x in range(n):s=bin(2**len(bin(n))/4+x+1)[3:].replace(*'0 ');print s+s[-2::-1]

Cobalah online!

Dalam Python 3, s=f'{x+1:0{len(bin(n))-2}b}'.replace(*'0 ')lebih pendek, tetapi int(input())dan parens di sekitar printargumen dorong hingga 95 byte.

Lynn
sumber
Itu salinan milikku :) (tapi penggunaan cerdik 2**len(bin(n))/4)
Erik the Outgolfer
3

JavaScript (ES6), 106 byte

Digunakan 1sebagai karakter non-spasi putih.

f=(n,k=0)=>k++<n?[...Array(32-Math.clz32(n))].reduce((s,_,i)=>(c=k>>i&1||' ')+s+(i?c:''),'')+`
`+f(n,k):''

Demo

Versi alternatif (ukuran yang sama)

Tanpa Math.clz32():

f=(n,a=[k=i=0])=>n>>i+1?f(n,a,a[++i]=i):k++<n?a.reduce((s,i)=>(c=k>>i&1||' ')+s+(i?c:''),'')+`
`+f(n,a):''
Arnauld
sumber
1
Sangat bagus! Pertama kali saya melihat Math.clz32- saya bahkan tidak tahu itu ada!
Birjolaxew
@Birjolaxew Yup, ini adalah tambahan ES6. Ini berguna sesekali.
Arnauld
3

Sekam , 21 20 18 byte

Terima kasih @Zgarb untuk bermain golf 2 byte!

S↑(tfS=↔ΠR" #"←DLḋ

Cobalah online!

Tidak Terikat / Penjelasan

Untuk menghindari padding yang panjang, ini menentukan lebar fraktal yang diberikan sebagai 2*len(bin(N))-1dan menghasilkan semua urutan panjang itu dengan simbol #,_('_' menunjukkan spasi).

Karena kekuatan Cartesian dihasilkan secara berurutan dan angka-angka binernya juga, ini tidak masalah. Yang perlu kita lakukan untuk mendapatkan fraktal pada saat ini, adalah menyaring semua palindrom dan hanya itu:

                    -- implicit input N
S↑(                 -- take N from the following list
        ΠR" #"      --   Cartesian power of [" #"] to
                Lḋ  --     number of bits in bin(N)
               D    --     2*
              ←     --     -1
    fS=↔            --   filter out palindromes
   t                --   drop the first line (all spaces)
ბიმო
sumber
1
Ṙ;bisa adil R, dan ȯtidak perlu. Ide jawaban yang bagus!
Zgarb
2

Mathematica, 94 byte

Column[Row/@Table[s=IntegerDigits[i,2];Join[s,Reverse@Most@s]/.{0->" ",1->"#"},{i,#}],Center]&
J42161217
sumber
2
Saya benar-benar harus pergi juga ...
J42161217
2

Mathematica, 98 byte

Riffle[Nest[ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&,{1},⌊Log2@#⌋]~Take~#"#"/. 0->" ","
"]<>""&

Cobalah di kotak pasir Wolfram ! Masing-masing dan tiga byte.

Ini pendekatan yang berbeda dari jawaban lain sejauh ini, menggunakan pola fraktal. Langkah kuncinya adalah ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&, yang melakukan hal-hal fraktal, paling baik dijelaskan dalam bentuk gambar:

                 [    ]
                 [grid]
[    ]           [    ]
[grid]   --->   #      #
[    ]          #[    ]#
                #[grid]#
                #[    ]#

Kode mengulangi langkah ini cukup kali untuk mendapatkan setidaknya n baris, kemudian memotong baris tambahan dan menampilkannya dengan baik.

Bukan pohon
sumber
2

Gaia , 11 byte

 #”B¦ₔṫ¦€|ṣ

Cobalah online!

Penjelasan

    ¦ₔ       For each number 1..input:
 #”B          Convert it to base 2 and use space as 0 and # as 1
      ṫ¦     Palindromize each
        €|   Centre the lines
          ṣ  Join with newlines
Kucing Bisnis
sumber
2

Python 2 , 120 118 107 byte

terima kasih @luismendo, @officialaimm, @ halvard-hummel

def f(l):
 for a in range(1,l+1):print(bin(a)[2:]+bin(a)[-2:1:-1]).replace(*'0 ').center(len(bin(l+1))*2-4)

Cobalah online!

tukang sihir
sumber
2
replace(*'0 ')untuk 2 byte
officialaimm
2
107 byte
Halvard Hummel
2

C # (.NET Core) , 192 178 byte 168 + 23

terima kasih TheLethalCoder untuk bantuannya.

x=>new int[x].Select((_,z)=>Convert.ToString(z+1,2).PadLeft((int)Math.Log(x,2)+2).Replace('0',' ')).Aggregate((y,z)=>y+"\n"+z+new string(z.Reverse().Skip(1).ToArray()))

Cobalah online!

cukup yakin ini bisa dikurangi banyak, kemungkinan besar di padding dan pembalikan string.

Dennis. Verweij
sumber
Selamat datang di PPCG! Saat ini jawaban ini hanyalah cuplikan kode. Itu dapat diperbaiki dengan menambahkan x=>ke dalam byte byte dan perhatikan Anda tidak perlu menyertakan semi-kolon trailing. Enumerable.Range(1,x).Select(zlebih pendek sebagai new int[x].Select((_,z)(saya pikir itu benar). Karena Anda menggunakan Linq, Anda harus memasukkan using System.Linq;ke dalam jumlah byte Anda. Anda juga menggunakan Mathsehingga Anda harus memasukkan using System;atau memenuhi syarat sepenuhnya. Perhatikan bahwa ini lebih pendek sebagainamespace System.Linq{}
TheLethalCoder
Anda tidak perlu memasukkan ,' 'dalam PadLeftpanggilan karena spasi adalah default.
TheLethalCoder
@TheLethalCoder maaf atas ketidaknyamanan ini, sekarang sudah diperbaiki.
Dennis. Verweij
Jangan khawatir +1 dari saya itu adalah jawaban yang bagus :)
TheLethalCoder
1

Arang , 28 byte

A…·¹NθW⌈θ«Eθ§ #κ↓⸿AEθ÷κ²θ»‖O

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

A…·¹Nθ

Buat daftar nbilangan asli pertama .

W⌈θ«

Ulangi sampai semua elemen nol.

Eθ§ #κ

Cetak digit biner terakhir dari setiap elemen daftar sebagai a atau #.

↓⸿

Pindah ke kolom sebelumnya.

AEθ÷κ²θ

Bagilah semua elemen daftar menjadi dua.

»‖O

Setelah setengah bagian kiri ditarik, refleksikanlah.

Neil
sumber
Versi Arang saat ini memiliki MapAssignRight(IntDivide, 2, q);yang menghemat 3 byte.
Neil
1

J, 29 byte

' #'{~(],}.@|.)"1@(#.^:_1)@i.

Cobalah online!

penjelasan

  • i. bilangan bulat hingga n, input
  • (#.^:_1) dikonversi ke basis 2
  • (],}.@|.)baris demi baris ( "1melakukan bagian itu), ambil nomor biner ( ]adalah identitas fn), dan cat itu ( ,) dengan kebalikannya ( |.), di mana kebalikannya dipenggal (}. ).
  • ' #'{~mengubah 1s dan 0s menjadi hash dan spasi.
Jonah
sumber
Anda bisa menggunakan #.invbukan #.^:_1.
Conor O'Brien
@ ConorO'Brien, terima kasih, tidak menyadarinya.
Jonah
Bukankah ini salah satu? Sebab n = 1, Anda tidak mencetak apa pun. Bagaimanapun, Anda dapat memangkas beberapa byte dengan beberapa perubahan seperti itu ' #'{~(,|.@}:)"1@#:@:>:@i.(jika Anda dibiarkan mati oleh satu Anda dapat menghapus 4 byte lebih). Pada dasarnya, gunakan pengait karena kinerjanya seperti garpu saat tine kiri ]dan gunakan #:bawaan yang AFAIK hampir sama #.inv. EDIT: Saya kira jawaban saya cukup mirip untuk menjamin menjadi komentar, beri tahu saya jika menurut Anda jawaban itu sendiri.
cole
@ole, terima kasih! saya akan memperbaruinya nanti. Saya pikir saya sudah mencoba #:dan itu tidak berhasil, tetapi saya harus ingat salah karena Anda benar itu berhasil.
Jonah
@Jonah, Anda mungkin sudah mencoba 2 #:yang hanya akan mendapatkan digit paling kanan. #:Fungsi monadik seperti #.inv(atau #.&:_1). Ini berbeda dengan diad #:, yang hanya memberikan digit sebanyak ada atom dalam argumen kirinya.
cole
1

Proton , 95 byte

r=>{for i:range(1,r)print(((bin(i)[2to]).rjust(len(bin(r))-2)[to-1,to by-1]).replace('0',' '))}

Cobalah online!

Ada terlalu banyak bug untuk tidak memiliki terlalu banyak tanda kurung ... Saya harus memperbaiki pengurai ...

HyperNeutrino
sumber
1

PHP, 98 97 95 94 + 1 byte

while($r++<$argn)echo$s=strtr(sprintf("%".-~log($argn,2).b,$r),0," "),substr(strrev("
$s"),1);

Jalankan sebagai pipa dengan -nRatau coba online . Digunakan 1sebagai non-spasi putih.

Titus
sumber
maaf merusaknya, tapi ada yang salah di sini. output untuk $argn=1dan $argn=3tidak benar, dan $argnberbasis 0 (ditentukan berbasis 1)
Felix Palmen
1
@ Feliksmen diperbaiki. Kesalahan itu disebabkan oleh basis yang salah. Terima kasih telah memperhatikan.
Titus
0

Python 2 , 93 byte

n=input()
for i in range(n):s=bin(2**n.bit_length()+i+1)[3:].replace(*'0 ');print s+s[-2::-1]

Cobalah online!

Erik the Outgolfer
sumber
0

C (gcc) , 146 108 105 byte

#define o putchar(33-!(c&(1<<n)))
b;c;p(n){--n?o,p(n),o:o;}f(n){while(n>>++b);while(c++<n)p(b),puts("");}

Cobalah online!

Ini adalah fungsi yang f(n)disebut dengan jumlah baris n, menggunakan tanda seru ( !) sebagai karakter non-spasi.

Penjelasan :

#define o putchar(33-!(c&(1<<n)))
b;c;
p(n)
{
    // least significant bit not yet reached?
    --n?
            // print bit twice with recursive step between
            o,
            p(n),
            o
        // for least significant, just print this bit
        :o;
}

// the main "cathedral function":
f(r)
{
    // determine max number of bits to shift
    while(r>>++b);

    // iterate over rows
    while(c++<r)

        // print row recursively
        p(b),

        // newline
        puts("");
}

/**
 * footer, just calling the function
 */
main(int argc, char **argv)
{
    f(atoi(argv[1]));
}
Felix Palmen
sumber
Sarankan --n&&o+p(n);o;alih-alih --n?o,p(n),o:o;dan for(;c++<n;puts(""))p(b);bukannyawhile(c++<n)p(b),puts("");
ceilingcat
0

JavaScript (Node.js) , 156 149 byte

-7 byte oleh @ ConorO'Brien

f=(n,w=n.toString(2).length,b=n.toString(2).replace(/0/g," "),s=" ".repeat(w-b.length))=>`${--n?f(n,w)+s+b+[...b].reverse().join``.substr(1):s+"1"}
`

Cobalah online!

Fungsi rekursif. Sayangnya JS tidak mendukung pembalikan string, jadi 19 byte digunakan untuk mengubahnya menjadi array dan kembali.

Birjolaxew
sumber
1
Anda bisa menggunakan [...b]sebagai ganti b.split(""); Anda juga bisa menggunakan .join``.substr(1)bukan .join("").substr(1); akhirnya, saya pikir Anda dapat menggunakan s+1sebagai gantinyas+"1"
Conor O'Brien
0

Perl 5 , 77 + 1 (-n) = 78 byte

$x=1+(log$_)/log 2;map{$_=sprintf"%0${x}b",$_;y/0/ /;say$_.chop.reverse}1..$_

Cobalah online!

Menggunakan '1' alih-alih '#' karena menghemat beberapa byte.

Xcali
sumber
0

Stax , 8 byte

ç▼┼Ö☺ǬÉ

Jalankan dan debug itu

Jawaban terpendek sejauh ini. Menggunakan karakter kode 1 CP437 sebagai pengganti# .

Setara ASCII:

{:B|pm|Cm
Weijun Zhou
sumber