Fractals affine nghệ thuật ASCII


9

Viết chương trình nhỏ nhất bạn có thể để tạo fractals affine. Bạn có thể sử dụng bất kỳ phương pháp nào bạn cảm thấy như thế sẽ tạo ra kết quả giống như các quy tắc dưới đây. Bạn không phải sử dụng bất kỳ ý tưởng từ các phương pháp được đề xuất!

Chương trình của bạn sẽ có hai đầu vào, đầu tiên để xác định mẫu theo định dạng 074gồm ba chữ số từ 0 đến 7. Đầu vào thứ hai sẽ xác định kích thước, 3sẽ là 8x8, 4sẽ là 16x16, v.v. (2 ^ n). Chương trình của bạn phải xuất kết quả chính xác cho tất cả các kích thước từ 0 (1x1) đến ít nhất 5 (32x32). Nếu nó tạo ra bất kỳ đầu ra nào cho số cao hơn thì nó phải chính xác, nghĩa là nó phải tạo ra đầu ra chính xác đến một kích thước nhất định nhưng không tạo ra đầu ra nào trên kích thước đó nếu nó sai. Bạn có thể giả sử kích thước tối đa là 15 (32768x32768) vì đó đã là kích thước điên rồ cho nghệ thuật ASCII (1GB)!

Một mô hình 8x8 sẽ trông giống như dưới đây (quy tắc 160). Chữ số nhiều nhất bên trái sẽ dành cho khối A, chữ số giữa (xin vui lòng không nghĩ thô lỗ!) Cho khối Bvà chữ số bên phải nhất cho khối C. Để xây dựng fractal, thu nhỏ nó một nửa theo cả hai chiều và áp dụng quy tắc xoay / phản chiếu cho khối. Để thu nhỏ mô hình chia đều thành các khu vực 2x2. Sẽ có 3 ký tự hiển thị hoặc không có trong mỗi khu vực. Nếu có các ký tự hiển thị, đặt một ký tự ở vị trí thích hợp trong khối nhỏ hơn, nếu không thì đặt một khoảng trắng. Quy tắc 0- 3không được nhân đôi, quy tắc 4- 7được nhân đôi. Các quy tắc 04không được xoay, 15được xoay 90 độ theo chiều kim đồng hồ, 26được quay 180 độ, 37được quay 270 độ theo chiều kim đồng hồ. Khâu ba khối lại với nhau theo thứ tự hiển thị, Aở góc trên bên trái, Bdưới cùng bên trái và Cdưới cùng bên phải.

 AAA    
AA A    
AA      
A       
BBB CC  
B BBC   
  BBCCC 
   B CCC

Thu nhỏ, xoay và nhân đôi theo số quy tắc:

 0       1       2       3       4       5       6       7  
----    ----    ----    ----    ----    ----    ----    ----
AA       BAA    CCB        C    C        BCC    AAB       AA
A       BB A     CBB      CC    CC      BBC     A BB       A
BBC     CC         A    A BB    BB A    A         CC     CBB
 BCC    C         AA    AAB      BAA    AA         C    CCB 

Quy tắc:

  1. Không được nhân đôi, xoay 90 độ theo chiều kim đồng hồ
  2. Không được nhân đôi, Xoay 180 độ theo chiều kim đồng hồ
  3. Không được nhân đôi, xoay 270 độ theo chiều kim đồng hồ
  4. Nhân đôi nhưng không được xoay
  5. Nhân đôi sau đó xoay 90 độ theo chiều kim đồng hồ
  6. Nhân đôi sau đó xoay 180 độ theo chiều kim đồng hồ
  7. Nhân đôi sau đó xoay 270 độ theo chiều kim đồng hồ
  8. Quy tắc 0: Không được nhân đôi, Không được xoay

Việc phản chiếu luôn được thực hiện trước tiên và được thực hiện theo đường chéo qua góc trống, ví dụ quy tắc 0 so với quy tắc 4:

 0       4  
----    ----
AA /    C  /
A /     CC/ 
BBC     BB A
/BCC    /BAA

Chỉ cai trị 1, 60được sử dụng trong các mô hình trên, theo thứ tự đó. Sau khi các phép biến đổi đã được áp dụng và các khối được ghép lại với nhau, nó sẽ trông giống như bên dưới ngoại trừ tôi đã cách nhau từng khối với nhau bằng một khoảng trắng. Mã của bạn sẽ không có thêm không gian trong đó. Nếu bạn so sánh nó với hình ảnh "cha mẹ", bạn sẽ thấy rằng nó có các ký tự hiển thị ở cùng vị trí.

 BAA
BB A
CC  
C   

AAB  AA  
A BB A   
  CC BBC 
   C  BCC

Một cách khác để tạo hình ảnh mà không thu nhỏ như sau: Bắt đầu với một ký tự:

X

Áp dụng các phép biến đổi cho mỗi trong ba khối (không có khối nào chỉ có một ký tự) và ghép các khối lại với nhau:

X
XX

Áp dụng các phép biến đổi cho mỗi trong ba khối một lần nữa:

1 
--
XX
X 

6     0 
--    --
XX    X 
 X    XX

Khâu chúng lại với nhau:

XX
X 
XXX 
 XXX

Áp dụng các phép biến đổi cho mỗi trong ba khối một lần nữa:

 1  
----
 XXX
XX X
XX  
X   

 6       0  
----    ----
XXX     XX  
X XX    X   
  XX    XXX 
   X     XXX

Khâu chúng lại với nhau:

 XXX    
XX X    
XX      
X       
XXX XX  
X XXX   
  XXXXX 
   X XXX

Bạn có thể sử dụng bất kỳ ký tự hoặc ký tự có thể in (0x21 - 0x7E) cho phần hiển thị của mẫu nhưng chỉ ký tự khoảng trắng (0x20) cho khoảng trống. Không gian lưu trữ được cho phép nhưng không được có khoảng trống bên ngoài toàn bộ hình vuông (nghĩa là đối với hình vuông 8 x 8 không thể có ký tự nào qua cột 8).

Có 512 quy tắc khác nhau, nhưng một số trong số chúng tạo ra cùng một mẫu. Là một lưu ý phụ, bất kỳ mẫu nào chỉ chứa 04sẽ tạo ra tam giác Sierpinki (8 quy tắc khác nhau).

Bạn có thể tùy ý đăng mẫu yêu thích của bạn và quy tắc tạo ra nó. Nếu bạn làm như vậy, hãy đảm bảo kích thước tối thiểu là 3 (8x8) để phân biệt với các quy tắc tương tự.


@trichoplax Bạn có thể bắt đầu với một hình vuông hoàn toàn hoặc hình vuông chỉ có 1 ký tự hiển thị trong đó. Dù bằng cách nào, việc lặp lại quy tắc n lần, trong đó n là kích thước đầu vào, sẽ đảm bảo kết quả tương tự. Tuy nhiên, bạn không phải tạo mẫu theo cách này, chỉ tạo mẫu tương tự như thực hiện theo cách này.
CJ Dennis

@trichoplax Tôi đánh giá cao đầu vào của bạn. Cách tôi nhìn nhận mọi thứ không nhất thiết là cách người khác nhìn thấy mọi thứ và tôi không biết tôi đang làm khó họ!
CJ Dennis

2
+1 Cảm ơn bạn, bạn đã giải thích rõ ràng hơn nhiều! Trong tương lai, tôi sẽ khuyên bạn nên điều hành mọi thứ thông qua hộp cát của chúng tôi để mọi người có thể có được bức tranh rõ ràng hơn về những gì bạn đang hỏi trước thời hạn. Tôi sẽ sớm thực hiện thử thách này :)
BrainSteel 17/05/2015

Vâng mọi người thấy mọi thứ khác nhau. Rất vui khi được phản hồi - một câu hỏi hay đáng để làm rõ. Nó đọc tốt bây giờ.
trichoplax 17/05/2015

@BrainSteel Cảm ơn bạn, sẽ làm! Tôi đã ở SE trên nhiều năm nhưng tôi vẫn còn khá mới với PCG!
CJ Dennis

Câu trả lời:


1

CJam, 63 57 54 52 byte

0aarari*{\f{\~7"W%z"a*3"Wf%"t<s~}({__Ser+}%\~.++}/N*

Cách thức hoạt động :

Ý tưởng cơ bản là bạn chạy một vòng lặp, số lần nhập thứ hai của số lần. Trong mỗi vòng lặp, bắt đầu từ một mảng duy nhất chứa 0( [[0]]), chúng ta xây dựng fractal cho bước tiếp theo bằng ba quy tắc, điền vào góc phần tư trống và chuẩn bị các góc phần tư cho vòng lặp tiếp theo.

0aa                           e# Starting condition, equivalent to a single A
   ra                         e# Read the rule string and wrap it in an array
     ri*                      e# Repeat the rule array, second input number of times
        { ...  }/             e# Loop for each rule in the rule array
                              e# In each loop, we will have the current fractal and
                              e# then the rule on stack
\f{\~7"W%z"a*3"Wf%"t<s~}      
\f{                    }      e# Move the rule on top of stack and for each of the rule
                              e# character, run this loop on the current fractal
   \~                         e# Move the rule char on top and convert to int by face value
     7"W%z"a*3"Wf%"t          e# This is the array which has the logic to perform the rules
                              e# ["W%z" "W%z" "W%z" "Wf%" "W%z" "W%z" "W%z"]
                    <s        e# Based on the rule number value, take that many first items
                              e# from the above array and do a toString on the array
                              e# For rule 0 through 7, you will get the following strings:
                              e# 0: "", 1: "W%z", 2: "W%zW%z", 3: "W%zW%zW%z",
                              e# 4: "W%zW%zW%zWf%", 5: "W%zW%zW%zWf%W%z",
                              e# 6: "W%zW%zW%zWf%W%zW%z", 7: "W%zW%zW%zWf%W%zW%zW%z"
                              e# This works because each W%z will rotate the block of
                              e# fractal 90 degrees in clockwise direction.
                              e# For rule 4, where we need to mirror diagonally, we first
                              e# rotate it 279 degrees clock wise and then reverse each row
                              e# of the block. The rest of the rules after 4 take that
                              e# mirroring as base and rotate 90 degrees additionally
                      ~       e# Simply evaluate the string to apply the rule.
\f{ ... }                     e# After this for each loop, we get 3 copies of the fractal
                              e# block before the for loop. Each copy gets each one of the
                              e# three rule gets applied.
         ({      }%           e# We take out the first part corresponding to the 1st
                              e# quadrant and run each row through this loop to fill the
                              e# second quadrant with spaces
           __Ser              e# Take a copy of the row and replace everything in the
                              e# copy with spaces
                +             e# Append it to the original row
                   \~         e# Bring the last two quadrant array on top and unwrap it
                     .+       e# Append corresponding rows from the 4th quadrant to 3rd
                       +      e# Append the rows from lower half to the upper half
                              e# Now we have a full block ready to be run through
                              e# the next iteration which will double its size
                          N*  e# Finally, we join the rows of final fractal block with
                              e# newlines and automatically print the result

Dùng thử trực tuyến tại đây


Rất đẹp! Nó tạo ra quá ít ký tự có thể in được nếu mẫu bắt đầu bằng 0và James Bond có giấy phép để giết. 007: IndexOutOfBoundException
CJ Dennis

@CJDennis Có một lỗi với các số 0 đứng đầu. Đã sửa bây giờ.
Trình tối ưu hóa

Làm tốt! Đầu ra trông hoàn hảo ngay bây giờ!
CJ Dennis

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.