Tạo fractals từ các mẫu bit trong ASCII


34

Tổng quan

Viết chương trình in ra các mẫu fractal đơn giản được cung cấp một mẫu bit mã hóa fractal, cộng với hệ số tỷ lệ trên mỗi thế hệ của fractal và số lượng thế hệ.

Giải trình

Dưới đây là một đại diện ASCII của Thảm Sierpinki :

Thế hệ 0:

# 

Thế hệ 1:

# # # 
#   # 
# # # 

Thế hệ 2:

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

Thế hệ n + 1 của Thảm Sierpinki ASCII được tạo thành từ lưới 3x3 chứa 8 bản sao của thế hệ n, với phần tử trung tâm của lưới bị thiếu.

Vì vậy, bởi vì nó được xác định bằng cách sử dụng lưới 3x3 và lớn hơn gấp 3 lần chiều rộng và chiều cao mỗi thế hệ, chúng ta có thể nói nó có hệ số tỷ lệ là 3.

Chúng ta có thể xác định một mẫu bit cho thảm Sierpinki bằng cách đánh số các phần tử trong lưới 3x3 từ 0 đến 8, từ trên xuống dưới, từ trái sang phải và đặt bit tương ứng của một số nguyên nếu thế hệ n + 1 chứa một bản sao của thế hệ n tại vị trí lưới đó:

bit:       place value:   bit pattern:   bit value:

0 1 2      1    2    4    1 1 1          1    2    4
3 4 5      8   16   32    1 0 1          8    0   32 
6 7 8      64 128  256    1 1 1          64 128  256 

integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495

Đối với hệ số tỷ lệ là 2, mẫu bit sẽ được sắp xếp như sau:

0 1
2 3

vân vân

Nhiệm vụ của bạn là viết một chương trình chấp nhận một mẫu bit ở dạng này, một hệ số tỷ lệ (ví dụ 3 cho Thảm Sierpinki) và một số thế hệ và tạo ra một fractal ASCII.

Đầu vào

Chương trình của bạn nên chấp nhận 3 số nguyên theo thứ tự sau: mẫu bit, hệ số tỷ lệ (từ 2 đến 5, bao gồm) và số lượng thế hệ (từ 0 đến 5, bao gồm).

Bạn không cần thực hiện bất kỳ xác thực đầu vào nào trên các giá trị này và nó hoàn toàn ổn nếu chương trình hoạt động với các giá trị lớn hơn phạm vi được chỉ định.

Các đầu vào có thể được chuyển qua dưới mọi hình thức (bộ dữ liệu, danh sách được phân tách bằng dấu phẩy / dấu cách, v.v.)

Đầu ra

Chương trình sẽ tạo ra một fractal tạo thành từ # ký tự theo sau là khoảng trắng ở các vị trí nơi fractal được xác định, khoảng trắng ở nơi không có và một ký tự dòng mới ở cuối mỗi dòng, in chúng ra hoặc trả về một chuỗi từ một chức năng.

Ví dụ

Đầu vào:

495,3,3

Đầu ra (Sierpinki Thảm thế hệ 3):

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

Đầu vào:

7,2,5

Đầu ra ( Tam giác Sierpinki ):

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

Đầu vào:

325,3,3

Đầu ra ( Bụi Cantor ):

#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 



#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 









#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 



#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 

Đầu vào

186,3,3

Đầu ra ( fractal Vicsek ):

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

Đầu vào:

279,3,3

Đầu ra (ví dụ về một fractal bất đối xứng):

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

v.v.

Ghi chú:

  • Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng
  • Chương trình của bạn có thể là một độc lập hoặc một hàm được gọi với 3 tham số đầu vào và trả về (hoặc in) một chuỗi
  • Thế hệ 0 được định nghĩa là #( #theo sau là khoảng trắng) ngay cả đối với mẫu bit là 0.
  • Một dòng mới ở cuối dòng là tùy chọn nhưng được phép, cũng như bất kỳ số lượng khoảng trắng ở cuối trên mỗi dòng.

3
+1, tôi thích cái này trong hộp cát và tôi thích nó hơn ở đây, với biểu tượng được thay đổi từ "##"thành "# ". Tôi thấy một khoảng trống ở cuối dòng được bao gồm trong các ví dụ của bạn, có bắt buộc không? . Theo quy tắc cuối cùng tôi sẽ cho rằng đó là tùy chọn, nhưng thực tế là bạn yêu cầu một không gian kéo dài cho thế hệ 0 khiến tôi tự hỏi. Ngoài ra tôi nghĩ bạn nên chỉ ra khoảng trắng tối đa và dòng mới (bạn có số nhiều) được phép. Như một ví dụ cực đoan, tôi luôn có thể bắt đầu với một mảng 5 ^ 6 = 15625 dòng 2 * 5 ^ 6 khoảng trắng sau đó thay thế #s. Trong hầu hết các trường hợp đầu vào, đó là một lượng lớn khoảng trắng chưa sử dụng
Level River St

@steveverrill Tôi không yêu cầu không gian dấu khi xuất ra thế hệ 0, tuy nhiên không gian dấu là một phần định nghĩa của nó, mà các thế hệ tiếp theo được định nghĩa theo. Số nhiều của dòng mới là một lỗi đánh máy, đã được sửa.
samgak

Bạn có thể gửi đầu ra dự kiến ​​cho một cái gì đó ít đối xứng, chẳng hạn như 279,3,3?
aditsu

@aditsu chắc chắn, xem câu hỏi đã được chỉnh sửa
samgak

Câu trả lời:


4

APL (Dyalog Unicode) , 37 byte SBCS

'# '{⊃⍪/,/⍺\⍤1⊂⍉⍪⍉⍵}⍣⎕⍨(2⍴⎕)⍴⌽⎕⊤⍨992
                                      input the bit pattern
                               ⊤⍨992  decode 99 binary digits from it
                                        (53 is the limit for floating point)
                                      reverse, least significant bit goes first
                                      input the scale factor
                       (2 )           twice, to use as dimensions of a matrix
                                      reshape bit pattern into such a matrix
                                      input the number of generations
'# '{              }⍣                 apply that many times, starting from '# '
               ⍉⍪⍉⍵                    make sure the argument is a matrix
                                      enclose
          \⍤1                         expand using rows of bit-pattern matrix
                                        (1 for identical copy, 0 for zeroed out)
     ⊃⍪/,/                             concat all horizontally and vertically

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


11

Lisp thường gặp 248 242 byte

(lambda(n r g &aux(s(expt r g)))(labels((f(g x y s)(or(= g 0)(#2=multiple-value-bind(q x)(floor x s)(#2#(p y)(floor y s)(if(logbitp(+ q(* p r))n)(f(1- g)x y(/ s r))))))))(#3=dotimes(y s)(#3#(x s)(princ(if(f g x y(/ s r))"# ""  ")))(terpri))))

Bị đánh cắp

(defun fractal (n r g &aux (s (expt r g)))
  (labels((f(g x y s)
            (or(= g 0)
               (multiple-value-bind (px x) (truncate x s)
                 (multiple-value-bind (py y) (truncate y s)
                   (and
                    (logbitp (+ px (* py r)) n)
                    (f (1- g) x y (/ s r))))))))
    (fresh-line)
    (dotimes(y s)
      (dotimes(x s)
        (princ
         (if (f g x y(/ s r))
             "# "
             "  ")))
      (terpri))))

Giải trình

  • Đầu vào:
    • N là mẫu được mã hóa
    • R là kích thước của mẫu
    • G là thế hệ
  • Đầu ra là một ma trận vuông ẩn có độ dài S = R G
  • Chúng tôi lặp lại qua từng hàng y , cột x (lồng nhau dotimes) và tính toán xem mỗi ô có được vẽ hay không (cách tiếp cận giống như raycasting). Điều này được thực hiện bằng cách đệ quy bên trong fractal với fchức năng phụ trợ.
  • Nếu fractal tại vị trí (x, y) sẽ được vẽ, in "# "hoặc in khác " ". Tất nhiên chúng tôi cũng in dòng mới ở cuối mỗi hàng.

Ví dụ, tam giác của Sierpinky được đại diện bởi S=7R=2. Ở thế hệ 3 kích thước hình vuông là 2 3 = 8. Đối với mỗi ô (x, y) , điều sau đây xảy ra:

  • fđược gọi với x , y , g liên kết với 3 và s bị ràng buộc với 4 (8/2)
  • Chúng tôi cắt x theo s , để biết x thuộc về bên trái hay bên phải của ma trận ẩn. truncatetrả về cả thương số và phần còn lại, được ràng buộc tương ứng với pxx (chúng tôi sử dụng lại cùng một ký hiệu x , nhưng đây không phải là vấn đề).
  • Điều tương tự cũng xảy ra với y , nó cho pyy mới .
  • Trong ví dụ này, pxpy có thể là 0 hoặc 1 (vì mẫu là hình vuông có chiều dài 2). Chúng xác định vị trí (x, y) trong mẫu của fractal: khi bit ở vị trí py.R + px của N là 0, xy đại diện cho một vị trí không nên vẽ gì.
  • Mặt khác, chúng ta phải "phóng to" vào phần tương ứng của fractal và chúng ta gọi fđệ quy với các ràng buộc mới cho xy . Đó là những vị trí tương đối bên trong fractal bên trong. Chúng tôi vượt qua G-1 cho thế hệ và s / 2 để biểu thị nửa chiều dài của fractal.
  • Trường hợp cơ sở của đệ quy gặp phải khi G bằng 0, trong trường hợp đó , vị trí (x, y) hiện tại sẽ được vẽ.

Thí dụ

(fractal 186 3 3)

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

Việc tính toán thế hệ thứ 8 của Thảm Sierpinki sử dụng (fractal 495 3 8)mất 24,7 giây và tạo ra tệp văn bản đầu ra là 83 MB. Tôi đã viết một phiên bản sửa đổi một chút mà đầu ra một hình ảnh. Đối với các tham số giống nhau, tệp GIF có trọng lượng 1,5 MB (cùng thời gian tính toán):

Thảm của Sierpinky, thế hệ 8

Vicsek (bấm vào để xem kích thước ban đầu):

Fractal Vicsek


1
+1 cho những gì trông giống như một chương trình ngắn gọn trong một ngôn ngữ dài dòng khủng khiếp. 8 lồng nhau )!
Cấp sông St

@steveverrill Tôi không bao giờ thắng được golf mã ... nhưng tôi vẫn nghĩ rằng cú pháp trả hết cho các chương trình lớn hơn. Và thành thật mà nói, tôi gần như không thấy dấu ngoặc đơn nữa, chỉ là một cái cây đẹp.
coredump

Hình ảnh gif đó thực sự làm sập trình duyệt web điện thoại của tôi ... Chơi golf tuyệt vời với ngôn ngữ khác thường hơn
Glenn Smith

@HiGuy Cảm ơn. CodeGolf có huy hiệu khiến trình duyệt của người khác bị sập không? Nó nên :-)
coredump

5

Bình thường, 38 byte

VJ^UQvwjdm@" #".A@L_.[0^Q2jvz2+V*RQNdJ

Dùng thử trực tuyến: Bộ kiểm tra đầu vào / kiểm tra thường xuyên

Giải thích sau.


1+ Tôi vẫn đang chờ đầu ra của 186 3 5(phiên dịch trực tuyến), nhưng ngoài ra tôi thực sự ấn tượng bởi sự ngắn ngủi này.
coredump

1
@coredump Tôi không nghĩ bạn sẽ có được sản lượng lớn như vậy khi sử dụng trình thông dịch trực tuyến. Nếu bạn muốn kiểm tra nó, bạn sẽ phải tải xuống trình biên dịch Pyth . Mất khoảng 10 giây trên máy tính xách tay của tôi.
Jakube

4

Ruby, 154

Điểm chỉ dành cho chức năng. Trình bày vô căn cứ dưới đây trong chương trình thử nghiệm. Việc chơi golf duy nhất tôi tuyên bố tại thời điểm này là loại bỏ các bình luận và thụt lề. Tôi sẽ chơi gôn sau. Hiện tại, tôi đang vui vẻ chơi với chương trình.

Hàm này có sáu đối số, nhưng trong cuộc gọi ban đầu, chỉ có 3 đối số đầu tiên được cung cấp cho mỗi thông số. Điều này khiến ba đối số còn lại được đặt thành giá trị mặc định và đặc biệt là chuỗia nơi đầu ra được lưu trữ được tạo và khởi tạo thành các dòng không gian được kết thúc bởi dòng mới. Là một tác dụng phụ, biến toàn cục $wcũng được tạo ra, cho biết số lượng ký hiệu trên mỗi dòng.

Khi hàm tự gọi đệ quy, nó cung cấp tất cả sáu đối số, bao gồm cả chuỗi a và tọa độ x và y của góc trên cùng bên trái của đệ quy tiếp theo

Phần còn lại của chương trình là khá đơn giản, như được nêu trong các ý kiến.

#function
f=->b,s,g,x=0,y=0,a=(' '*(-1+2*$w=s**g)+'
')*$w{                                         #accept arguments, if x,y,a are not provided create them. $w = number of symbols per row 
  v=s**g/s                                     #v=width of blocks for this recursion depth
  if g==0
    a[2*y*$w+2*x]=?#                           #if g==0 plot a #
  else                                         #else iterate s*s times through the bits of b, and recurse as necessary
    (s*s).times{|i|b>>i&1>0&&f.call(b,s,g-1,x+i%s*v,y+i/s*v,a)} 
  end
  a
}

#test program (requires 3 input numbers separated by newlines)
b=gets.to_i
s=gets.to_i
g=gets.to_i
#get return value and output to stdout
puts f.call(b,s,g)

Đầu ra

Đây là một tập hợp các fractals lỏng lẻo dựa trên hình thức các chữ cái của từ GOLF. Các chữ cái thực tế hơn có thể đạt được với bitmap lớn hơn. Như ví dụ cuối cùng cho thấy, các fractals thú vị nhất được phát hiện tình cờ.

63775,4,2 (G)

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

495,3,3 (O, sierpinski carpet)

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

457,3,3 (L)

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

7967,4,2 (F)

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

1879,3,3 (skull and crossbones discovered by accident)

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

3

CJam, 45

3aaq~@2b2$_*0e[W%@/a*{ffff*:.+:.+}/' ff+Sf*N*

Thực hiện ý tưởng đầu tiên của tôi. Dùng thử trực tuyến

Về cơ bản, nó bắt đầu với ma trận 1 * 1 chứa 3 (sự khác biệt giữa '#' và ''), sau đó lặp lại nhân mỗi số trong ma trận với mẫu bit (ma trận 0/1) và kết hợp các ma trận kết quả thành một ma trận lớn hơn. Cuối cùng, nó thêm một khoảng trắng cho mỗi số và tham gia với khoảng trắng và dòng mới.

Ý tưởng thứ 2, 49

q~@2bW%2$/z@@m*_,\_m*:z@f{3@@f{\~@==*}~' +}/Sf*N*

Dùng thử trực tuyến

Điều này tạo ra tất cả các tọa độ của ma trận đầu ra dưới dạng các mảng của các cặp số <thế hệ> nhỏ hơn hệ số tỷ lệ (tất cả các kết hợp như vậy), sau đó với mỗi cặp số, nó nhận được bit tương ứng từ mẫu và cho từng mảng tọa độ nó nhân các bit và nhân với 3. Quá trình xử lý cuối cùng là như nhau.

Có lẽ có chỗ để chơi gôn hơn.


2

C, 316 byte

main(a,_,b,s,g,i,w,o,z,x,y)char**_,*o;{b=atoi(_[1]);s=atoi(_[2]);g=atoi(_[3]);w=1;for(i=0;i<g;++i){w*=s;}o=malloc(w*w);for(i=0;i<w*w;++i)o[i]=35;z=w/s;while(z){for(y=0;y<w;++y)for(x=0;x<w;++x)if(!((b>>((y/z)%s*s+(x/z)%s))&1))o[y*w+x]=32;z/=s;}for(y=0;y<w;++y){for(x=0;x<w;++x)printf("%c ",o[y*w+x]);printf("\n");}}

Chưa chơi gôn:

#include <stdio.h>

int main(int argc, char *argv[]) 
{
    int bitpattern;
    int scale;
    int generation;

    bitpattern = atoi(argv[1]);
    scale = atoi(argv[2]);
    generation = atoi(argv[3]);

    int i;
    int width = 1;
    for (i=0; i<generation; ++i) {width*=scale;}

    char *out=malloc(width*width);

    for (i=0; i<width*width; ++i) out[i]='#';


    int blocksize = width/scale;
    for (i=0; i<generation; ++i) {
        int x,y;
        for (y=0; y<width; ++y) {
            for (x=0; x<width; ++x) {
                int localX = x/blocksize;
                localX %= scale;
                int localY = y/blocksize;
                localY %= scale;
                int localPos = localY*scale+localX;
                if (!((bitpattern>>localPos)&1))out[y*width+x]=' ';
            }
        }
        blocksize/=scale;
    }

    int x,y;
    for (y=0; y<width; ++y) {
        for (x=0; x<width; ++x)
            printf("%c ",out[y*width+x]);
        printf("\n");
    }
    return 0;
}

3
Theo các gạch đầu dòng ở cuối thông số kỹ thuật, một chức năng được phép thay vì một chương trình. Thay đổi nó thành một hàm và chỉ cần truyền ba tham số đầu vào cho nó - điều đó sẽ loại bỏ tất cả những thứ đó và giúp bạn tiết kiệm khoảng 40 byte.
Cấp sông St

2

Scala 293 299

(e:Int,s:Int,g:Int)=>{def b(x:Int,y:Int)=(1<<x*s+y&e)>0;def f(n:Int):Seq[Seq[Char]]=if(n<1)Seq(Seq('#'))else if(n<2)Seq.tabulate(s,s)((i,j)=>if(b(i,j))'#'else' ')else{val k=f(n-1);val t=k.size;Seq.tabulate(t*s,t*s)((i,j)=>if(b(i/t,j/t))k(i%t)(j%t)else' ')};f(g).map(_.mkString(" ")).mkString(" \n")}

vô dụng:

//create an anonymous function
(encoded: Int, size: Int, generation: Int) => {

  // method will return true if coords (x,y) should be drawn as '#'
  def isBlackInPattern(x: Int, y: Int): Boolean = (1 << x * size + y & encoded) > 0

  // recurse until generation is 1
  def fillRecursively(gen: Int): Seq[Seq[Char]] = {

    // this is just to satisfy OP requirements.
    // if the stopping condition were generation = 1,
    // I could have spared this line...
    if(gen < 1) Seq(Seq('#'))

    //actual stopping condition (generation 1). 
    // fill a matrix of characters with spaces
    // and hashes acording to the pattern.
    else if(gen < 2) Seq.tabulate(size, size)((i, j) => 
      if (isBlackInPattern(i,j)) '#' 
      else ' '
    )

    // recurse, and use previously created fractals to fill
    // the current generation according to the `isBlackInPattern` condition
    else {
      val previousGeneration = fillRecursively(gen-1)
      val previousSize = previousGeneration.size
      // create the current matrix and fill it
      Seq.tabulate(previousSize*size,previousSize*size)((i,j)=>
        if(isBlackInPattern(i/previousSize,j/previousSize))
          previousGeneration(i%t)(j%t)
        else ' '
      )
    }
  }
  // call to recursive function and format matrix of characters to string
  fillRecursively(generation).map(_.mkString(" ")).mkString(" \n")
}

ví dụ:

val f = (e:Int,s:Int,g:Int)=>{def b(x:Int,y:Int)=(1<<x*s+y&e)>0;def f(n:Int):Seq[Seq[Char]]=if(n<1)Seq(Seq('#'))else if(n<2)Seq.tabulate(s,s)((i,j)=>if(b(i,j))'#'else' ')else{val k=f(n-1);val t=k.size;Seq.tabulate(t*s,t*s)((i,j)=>if(b(i/t,j/t))k(i%t)(j%t)else' ')};f(g).map(_.mkString(" ")).mkString(" \n")}
f: (Int, Int, Int) => String = <function3>

scala> println(f(495,3,3))
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # #       # # #                   # # #       # # # 
#   #       #   #                   #   #       #   # 
# # #       # # #                   # # #       # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # #

scala> println(f(7,2,5))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   #   #   #   #   #   #   #   #   #   #   #   #   #   #   #   
# #     # #     # #     # #     # #     # #     # #     # #     
#       #       #       #       #       #       #       #       
# # # #         # # # #         # # # #         # # # #         
#   #           #   #           #   #           #   #           
# #             # #             # #             # #             
#               #               #               #               
# # # # # # # #                 # # # # # # # #                 
#   #   #   #                   #   #   #   #                   
# #     # #                     # #     # #                     
#       #                       #       #                       
# # # #                         # # # #                         
#   #                           #   #                           
# #                             # #                             
#                               #                               
# # # # # # # # # # # # # # # #                                 
#   #   #   #   #   #   #   #                                   
# #     # #     # #     # #                                     
#       #       #       #                                       
# # # #         # # # #                                         
#   #           #   #                                           
# #             # #                                             
#               #                                               
# # # # # # # #                                                 
#   #   #   #                                                   
# #     # #                                                     
#       #                                                       
# # # #                                                         
#   #                                                           
# #                                                             
# 

scala> println(f(18157905,5,2))
#       #                               #       # 
  #   #                                   #   #   
    #                                       #     
  #   #                                   #   #   
#       #                               #       # 
          #       #           #       #           
            #   #               #   #             
              #                   #               
            #   #               #   #             
          #       #           #       #           
                    #       #                     
                      #   #                       
                        #                         
                      #   #                       
                    #       #                     
          #       #           #       #           
            #   #               #   #             
              #                   #               
            #   #               #   #             
          #       #           #       #           
#       #                               #       # 
  #   #                                   #   #   
    #                                       #     
  #   #                                   #   #   
#       #                               #       # 

vết cắt đầu tiên, có lẽ có thể được đánh gôn thêm một chút ...


Bạn đang thiếu một khoảng trống giữa mỗi của bạn #. Bên cạnh việc được yêu cầu bởi thông số kỹ thuật, nó thực sự tăng cường sự xuất hiện của đầu ra của bạn.
Cấp sông St

@steveverrill của bạn đúng. Tôi đã không nhận thấy rằng lúc đầu. Tôi đã chỉnh sửa với một sửa chữa nhanh chóng. cảm ơn :)
gilad hoch

2

Matlab, 115 byte

kronSản phẩm Kronecker giúp mọi thứ dễ dàng hơn nhiều:

function f(p,f,g);z=nan(f);z(:)=de2bi(p,f*f);x=3;for k=1:g;x=kron(x,z);end;disp([reshape([x;0*x],f^g,2*f^g)+32,''])

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

Mặc dù de2bichỉ hoạt động nếu bạn có Hộp công cụ Hệ thống Truyền thông. Không làm việc mà không có nó. Nó sẽ cần dec2bin.
Tom Carpenter

Có vẻ như hộp công cụ này được bao gồm trong phiên bản sinh viên tiêu chuẩn của tôi, vì vậy tôi nghĩ rằng điều này có thể chấp nhận được. (Lưu ý rằng de2bikhông giống như dec2bin.)
flawr

2

C, 158 byte

f(p,s,g,h,i,j,c){for(j=1;g--;j*=s);for(h=j;h;){h--;for(i=j;i;){i--;for(c=35,g=j/s;g;g/=s)c=!((p>>((h/g)%s*s+(i/g)%s))&1)?32:c;printf("%c ",c);}printf("\n");}}

1

K5, 70 byte

Đó là một sự khởi đầu:

{,/'("  ";"# ")$[z;(z-1){,/'+,/'+x@y}[(0*t;t)]/t:(2#y)#|(25#2)\x;,,1]}

Trong hành động:

{,/'("  ";"# ")$[z;(z-1){,/'+,/'+x@y}[(0*t;t)]/t:(2#y)#|(25#2)\x;,,1]}[186;3]'!4
(,"# "
 ("  #   "
  "# # # "
  "  #   ")
 ("        #         "
  "      # # #       "
  "        #         "
  "  #     #     #   "
  "# # # # # # # # # "
  "  #     #     #   "
  "        #         "
  "      # # #       "
  "        #         ")
 ("                          #                           "
  "                        # # #                         "
  "                          #                           "
  "                    #     #     #                     "
  "                  # # # # # # # # #                   "
  "                    #     #     #                     "
  "                          #                           "
  "                        # # #                         "
  "                          #                           "
  "        #                 #                 #         "
  "      # # #             # # #             # # #       "
  "        #                 #                 #         "
  "  #     #     #     #     #     #     #     #     #   "
  "# # # # # # # # # # # # # # # # # # # # # # # # # # # "
  "  #     #     #     #     #     #     #     #     #   "
  "        #                 #                 #         "
  "      # # #             # # #             # # #       "
  "        #                 #                 #         "
  "                          #                           "
  "                        # # #                         "
  "                          #                           "
  "                    #     #     #                     "
  "                  # # # # # # # # #                   "
  "                    #     #     #                     "
  "                          #                           "
  "                        # # #                         "
  "                          #                           "))
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.