Nhà thờ Fractal


22

Cho một số nguyên dương n >= 1, xuất ra các nhàng đầu tiên của cấu trúc sau:

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

Hàng nthứ 1 được lập chỉ mục là biểu diễn nhị phân của n, được nhân đôi mà không sao chép ký tự cuối cùng, #ở vị trí 1 và <space>thay cho 0. Tất cả các hàng được căn giữa.

Bạn phải xuất dưới dạng nghệ thuật ASCII nhưng bạn có thể sử dụng bất kỳ ký tự không phải khoảng trắng nào thay cho nơi tôi sử dụng #trong ví dụ. Khoảng trắng lưu trữ được cho phép và một dòng mới được cho phép. Đầu ra phải giống như ví dụ và không có khoảng trắng hàng đầu hoặc dòng mới hàng đầu.

Bạn có thể xem 1023 hàng đầu tiên của nhà thờ fractal ở đây .

Để tạo các trường hợp thử nghiệm lớn hơn, đây là một triển khai tham chiếu không được chỉnh sửa trong Python


Ý kiến ​​hay. Tôi sẽ không đoán được số nhị phân đã tạo ra nghệ thuật ascii đẹp như vậy.
Giô-na

@Jonah Cảm ơn :) Rất vui vì bạn thích nó
HyperNeutrino

7
Cả hai liên kết đang chỉ vào nhà thờ được tạo ra.
Otávio

@ Otávio: Tôi sẽ sửa, cảm ơn
HyperNeutrino

Câu trả lời:


6

MATL , 10 byte

:B2&Zv35*c

Hãy thử trực tuyến!

Giải trình

:      % 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
Tôi tự hỏi nếu nó sẽ hữu ích để thêm một số loại dựng sẵn tương ứng với nhân với 35 sau đó chuyển đổi thành char. Nó dường như được sử dụng thường xuyên
Conor O'Brien

@ ConorO'Brien Nó được sử dụng thường xuyên, vâng. Nhưng nó sẽ là một char hai tích hợp, vì vậy sẽ không có lợi
Luis Mendo

Không đạt? 35*clà 4 ký tự
Conor O'Brien

@ ConorO'Brien Ah, ý bạn là 35cố định? Điều đó có vẻ hơi cụ thể. Mặt khác, một số thách thức cho phép bất kỳ char nào, vì vậy nó có thể là một ý tưởng tốt. Bạn có nghĩ #là phổ biến nhất?
Luis Mendo

2
Để tham khảo, tính năng này đã được triển khai (chức năng Zc, với ký tự 35, nghĩa là #). Cảm ơn, @ ConorO'Brien!
Luis Mendo

5

05AB1E , 9 byte

Mã số:

Lb€û.c0ð:

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình:

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]

Hãy thử trực tuyến!

Trong Python 3, s=f'{x+1:0{len(bin(n))-2}b}'.replace(*'0 ')ngắn hơn, nhưng các int(input())xung quanh printđối số đẩy nó lên tới 95 byte.


Đó là bản sao của tôi :) (nhưng sử dụng thông minh 2**len(bin(n))/4dù sao đi nữa)
Erik the Outgolfer 14/08/17

3

JavaScript (ES6), 106 byte

Sử dụng 1như là nhân vật không khoảng trắng.

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

Bản giới thiệu

Phiên bản thay thế (cùng kích thước)

Không có 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
Rất đẹp! Lần đầu tiên tôi nhìn thấy Math.clz32- tôi thậm chí không biết nó tồn tại!
Birjolaxew

@Birjolaxew Yup, đây là bổ sung ES6. Nó có ích mỗi lần trong một thời gian.
Arnauld

3

Husk , 21 20 18 byte

Cảm ơn @Zgarb vì đã chơi golf 2 byte!

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

Hãy thử trực tuyến!

Ungolfed / Giải thích

Để tránh phần đệm dài, điều này xác định chiều rộng của fractal được đưa ra 2*len(bin(N))-1và tạo ra tất cả các chuỗi có độ dài đó bằng các ký hiệu #,_('_' biểu thị một khoảng trắng).

Vì sức mạnh của Cartesian được tạo ra theo thứ tự và các số nhị phân cũng vậy, điều này là tốt. Tất cả những gì chúng ta cần làm để có được fractal vào thời điểm này, là lọc ra tất cả các palindromes và về cơ bản là như vậy:

                    -- 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
Ṙ;có thể chỉ R, và ȯlà không cần thiết. Ý tưởng trả lời tốt đẹp!
Zgarb

2

Toán học, 94 byte

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

2
Tôi cũng thực sự phải đi ...
J42161217

2

Toán học, 98 byte

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

Hãy thử nó tại hộp cát Wolfram ! Các ba byte mỗi.

Đó là một cách tiếp cận khác với các câu trả lời khác cho đến nay, sử dụng tính chất fractal của mẫu. Bước quan trọng là ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&, trong đó các công cụ fractally, được giải thích tốt nhất ở dạng hình ảnh:

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

Mã lặp lại bước này đủ số lần để có ít nhất n hàng, sau đó cắt bỏ các hàng thừa và hiển thị độc đáo.




2

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

cảm ơn TheLethalCoder đã giúp đỡ.

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

Hãy thử trực tuyến!

khá chắc chắn rằng điều này có thể được giảm đi rất nhiều, rất có thể là trong phần đệm và đảo ngược của chuỗi.


Chào mừng đến với PPCG! Hiện tại câu trả lời này chỉ là một đoạn mã. Nó có thể được sửa bằng cách thêm x=>vào số byte và lưu ý bạn không cần bao gồm dấu chấm phẩy. Enumerable.Range(1,x).Select(zlà ngắn hơn new int[x].Select((_,z)(tôi nghĩ đó là chính xác). Khi bạn đang sử dụng Linq, bạn nên đưa using System.Linq;vào số byte của mình. Bạn cũng đang sử dụng Mathvì vậy bạn nên bao gồm using System;hoặc hoàn toàn đủ điều kiện. Lưu ý rằng điều này sau đó ngắn hơn lànamespace System.Linq{}
TheLethalCoder

Bạn không cần đưa ,' 'vào PadLeftcuộc gọi vì khoảng trắng là mặc định.
TheLethalCoder


@TheLethalCoder xin lỗi vì sự bất tiện này, hiện đã được sửa.
Dennis.Verweij

Đừng lo lắng +1 với tôi đó là một câu trả lời hay :)
TheLethalCoder

1

Than , 28 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

A…·¹Nθ

Tạo một danh sách các nsố tự nhiên đầu tiên .

W⌈θ«

Lặp lại cho đến khi tất cả các yếu tố bằng không.

Eθ§ #κ

In chữ số nhị phân cuối cùng của mỗi thành phần của danh sách dưới dạng hoặc #.

↓⸿

Di chuyển đến cột trước.

AEθ÷κ²θ

Chia tất cả các yếu tố của danh sách cho hai.

»‖O

Khi một nửa bên trái đã được vẽ, phản ánh nó.


Các phiên bản hiện tại của Char than có MapAssignRight(IntDivide, 2, q);tiết kiệm 3 byte.
Neil

1

J, 29 byte

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

Hãy thử trực tuyến!

giải trình

  • i. số nguyên lên đến n, đầu vào
  • (#.^:_1) chuyển đổi sang cơ sở 2
  • (],}.@|.)hàng theo hàng ( "1thực hiện phần đó), lấy số nhị phân ( ]là danh tính fn) và cat nó ( ,) với đảo ngược của nó ( |.), trong đó đảo ngược được chặt đầu ( }.).
  • ' #'{~chuyển đổi 1s và 0s thành băm và dấu cách.

Bạn có thể sử dụng #.invthay vì #.^:_1.
Conor O'Brien

@ ConorO'Brien, cảm ơn, đã không nhận thức được điều đó.
Giô-na

Đây không phải là một trong những? Đối với n = 1, bạn không in gì cả. Dù sao, bạn có thể tắt một vài byte với một vài thay đổi như vậy ' #'{~(,|.@}:)"1@#:@:>:@i.(nếu bạn được phép tắt một byte, bạn có thể xóa thêm 4 byte). Về cơ bản, hãy sử dụng một cái móc bởi vì nó hoạt động giống như một cái nĩa khi cột bên trái ]và sử dụng cái tích hợp #:mà AFAIK tương tự như #.inv. EDIT: Tôi cho rằng câu trả lời của tôi đủ tương tự để đảm bảo là một bình luận, hãy cho tôi biết nếu bạn nghĩ nó nên là một câu trả lời của riêng mình.
cole

@cole, cảm ơn! Tôi sẽ cập nhật nó một chút sau. Tôi nghĩ tôi đã thử #:và nó không hoạt động, nhưng tôi phải nhớ sai vì bạn đúng như vậy.
Giô-na

@Jonah bạn có thể đã thử 2 #:sẽ chỉ nhận được chữ số đúng nhất. Các #:hàm đơn trị giống như #.inv(hoặc #.&:_1). Điều này khác với dyadic #:, chỉ đưa ra nhiều chữ số như có các nguyên tử trong đối số bên trái của nó.
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',' '))}

Hãy thử trực tuyến!

Có quá nhiều lỗi để không có quá nhiều dấu ngoặc ... Tôi cần sửa trình phân tích cú pháp ...



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

Chạy như ống với -nRhoặc thử trực tuyến . Sử dụng 1như không khoảng trắng.


xin lỗi để làm hỏng nó, nhưng một cái gì đó sai ở đây. đầu ra cho $argn=1$argn=3không chính xác, và $argndựa trên 0 (được chỉ định là dựa trên 1)
Felix Palmen

1
@FelixPalmen đã sửa. Sự không chính xác là do cơ sở sai. Cảm ơn đã chú ý.
Tít




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

Hãy thử trực tuyến!

Đây là một hàm f(n)được gọi với số lượng hàng n, sử dụng dấu chấm than (! ) làm ký tự không phải khoảng trắng.

Giải thích :

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

Đề xuất --n&&o+p(n);o;thay vì --n?o,p(n),o:o;for(;c++<n;puts(""))p(b);thay vìwhile(c++<n)p(b),puts("");
trần mèo

0

JavaScript (Node.js) , 156 149 byte

-7 byte bởi @ 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"}
`

Hãy thử trực tuyến!

Hàm đệ quy. Thật không may, JS không hỗ trợ đảo ngược một chuỗi, vì vậy 19 byte được sử dụng để biến nó thành một mảng và quay lại.


1
Bạn có thể sử dụng [...b]thay vì b.split(""); bạn cũng có thể sử dụng .join``.substr(1)thay vì .join("").substr(1); cuối cùng, tôi nghĩ bạn có thể sử dụng s+1thay vìs+"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..$_

Hãy thử trực tuyến!

Sử dụng '1' thay vì '#' vì nó tiết kiệm được một vài byte.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.