ASCII sanat kare afin fraktallar


9

Afin fraktallar oluşturmak için yapabileceğiniz en küçük programı yazın. Aşağıdaki kurallarla aynı sonuçları veren herhangi bir yöntemi kullanabilirsiniz. Önerilen yöntemlerden herhangi bir fikir kullanmak zorunda değilsiniz!

Programınız iki giriş alacaktır, birincisi, deseni 0740 ile 7 arasında üç basamaktan oluşan formatta tanımlamaktır. İkinci giriş, boyutu tanımlayacak, 38x8, 416x16 ve benzeri olacaktır (2 ^ n). Programınız 0 (1x1) ile en az 5 (32x32) arasındaki tüm boyutlar için doğru sonucu vermelidir. Daha yüksek sayılar için herhangi bir çıktı üretiyorsa, doğru olmalıdır, yani belirli bir boyuta kadar doğru çıktı üretmeli, ancak yanlış olursa bu boyutun üzerinde çıktı üretmemelidir. ASCII sanatı (1GB) için zaten çılgın bir boyut olduğu için maksimum 15 (32768x32768) boyutuna sahip olabilirsiniz!

8x8 modeli aşağıdaki gibi görünecektir (kural 160). En soldaki rakam blok için A, orta rakam (lütfen kaba düşünceler yok!) Ve blok için Ben sağdaki rakam olacaktır C. Fraktal oluşturmak için, her iki boyutta da yarım küçültün ve blok için döndürme / yansıtma kuralını uygulayın. Deseni daraltmak için eşit olarak 2x2 alana bölün. 3 görünür karakter olacak veya her alanda hiçbiri olmayacak. Görünür karakterler varsa, bir karakteri daha küçük blokta uygun yere yerleştirin, aksi takdirde bir boşluk bırakın. Kurallar 0- 3yansıtılmaz, kurallar 4- 7yansıtılır. Kurallar 0ve 4döndürülmez 1ve 5saat yönünde 90 derece döndürülür 2ve6180 derece döndürülür 3ve 7saat yönünde 270 derece döndürülür. Üç bloğu, Asol üst köşede, Bsol Caltta ve sağ altta gösterilen sırada birleştirin .

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

Kural numarasına göre küçültülmüş, döndürülmüş ve yansıtılmış:

 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 

Kurallar:

  1. Aynalı değil, saat yönünde 90 derece döndürüldü
  2. Aynalı değil, 180 derece saat yönünde döndürüldü
  3. Aynalı değil, 270 derece saat yönünde döndürülmüş
  4. Yansıtılmış ancak döndürülmemiş
  5. Aynalanmış sonra saat yönünde 90 derece döndürülmüş
  6. Aynalı ve daha sonra saat yönünde 180 derece döndürüldü
  7. Aynalanmış sonra saat yönünde 270 derece döndürülmüş
  8. Kural 0: Aynalı değil, Döndürülmedi

Yansıtma her zaman önce yapılır ve boş köşeden çapraz olarak yapılır, örneğin kural 0'a karşı kural 4:

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

Sadece kuralları 1, 6ve 0bu sırayla, yukarıdaki desen kullanılmaktadır. Dönüşümler uygulandıktan ve bloklar birbirine dikildikten sonra, her bloğu birbirinden bir boşlukla ayırmam dışında aşağıdaki gibi görünecektir. Kodunuzda bu fazladan boşluk olmayacak. "Üst" görüntü ile karşılaştırdığınızda, aynı konumlarda görünür karakterler olduğunu görürsünüz.

 BAA
BB A
CC  
C   

AAB  AA  
A BB A   
  CC BBC 
   C  BCC

Görüntüyü daraltmadan oluşturmanın başka bir yolu da şöyledir: Bir karakterle başlayın:

X

Üç bloğun her biri için dönüşümleri uygulayın (yalnızca bir karakter olduğu için yok) ve blokları birbirine dikin:

X
XX

Üç bloğun her biri için dönüşümleri tekrar uygulayın:

1 
--
XX
X 

6     0 
--    --
XX    X 
 X    XX

Onları birleştirin:

XX
X 
XXX 
 XXX

Üç bloğun her biri için dönüşümleri tekrar uygulayın:

 1  
----
 XXX
XX X
XX  
X   

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

Onları birleştirin:

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

Desenin görünen kısmı için herhangi bir yazdırılabilir karakter veya karakter (0x21 - 0x7E) kullanabilirsiniz, ancak boşluklar için yalnızca boşluk karakteri (0x20) kullanabilirsiniz. Sondaki boşluklara izin verilir, ancak tüm karenin dışında boşluk olmamalıdır (yani 8x8 kare için sütun 8'den sonra hiç karakter olamaz).

512 farklı kural vardır, ancak bazıları aynı modeli üretir. Yan not olarak, sadece Sierpinski üçgenini içeren 0ve 4üretecek herhangi bir desen (8 farklı kural).

İsteğe bağlı olarak favori deseninizi ve onu oluşturan kuralı gönderebilirsiniz. Bunu yaparsanız, benzer kurallardan ayırt etmek için boyutun en az 3 (8x8) olduğundan emin olun.


@trichoplax Tamamen dolu bir kare veya içinde yalnızca 1 görünür karakter bulunan bir kare ile başlayabilirsiniz. Her iki durumda da, n'nin giriş boyutu olduğu kuralları n kez tekrarlamak aynı sonuçları garanti eder. Ancak, bu şekilde desen oluşturmak zorunda değilsiniz, sadece bu şekilde yapmakla aynı modeli üretmeniz gerekir.
CJ Dennis

@trichoplax Girişinizi takdir ediyorum. Bazı şeyleri görme şeklim, diğer insanların şeyleri görme şekli değil, onlar için zorlaştırdığımı bilmiyorum!
CJ Dennis

2
+1 Teşekkürler, açıklamayı çok daha açık hale getirdiniz! Gelecekte, insanların vaktinden ne istediğini daha net bir şekilde görebilmeleri için sanal alanımızda bir şeyler yürütmeni tavsiye ederim . Bu meydan okuma üzerinde kısa süre içinde çalışacağım :)
BrainSteel

Evet herkes işleri farklı görür. Geri bildirim vermekten mutluluk duyuyoruz - iyi bir soru netleştirilmeye değer. Şimdi iyi okuyor.
trichoplax

@BrainSteel Teşekkür ederim, yapacağım! Yıllardır SE'de bulundum ama hala PCG için nispeten yeniyim!
CJ Dennis

Yanıtlar:


1

CJam, 63 57 54 52 bayt

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

Nasıl çalışır :

Temel fikir, bir döngü çalıştırmanızdır, ikinci giriş sayısı. Her döngüde, 0( [[0]]) içeren tek bir dizi diziden başlayarak , üç kuralı kullanarak bir sonraki adım için fraktal oluşturur, boş çeyreği doldurur ve bir sonraki döngü için çeyrekleri hazırlarız.

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

Buradan çevrimiçi deneyin


Çok güzel! Kalıp başlarsa 0ve James Bond'un öldürme lisansı varsa çok az yazdırılabilir karakter üretir . 007: IndexOutOfBoundsException
CJ Dennis

@CJDennis Başında sıfır bulunan bir hata var. Şimdi düzeltildi.
Doktor,

Aferin! Çıktı şimdi mükemmel görünüyor!
CJ Dennis

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.