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


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

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


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.


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):''

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)

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

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.


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


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.


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.


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.

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 ...



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.


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

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

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.


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.