アスキーアートスクエアアフィンフラクタル


9

アフィンフラクタルを作成するための最小のプログラムを記述します。以下のルールと同じ結果が得られると思われる任意の方法を使用できます。提案された方法からアイデアを使用する必要はありません!

プログラムは、形式でパターンを定義する最初の2つの入力をとる074第2の入力のサイズを定義する7 0〜3桁からなる3、8×8なり4、16×16など(2 ^ n)の上になります。プログラムは、0(1x1)から少なくとも5(32x32)までのすべてのサイズについて正しい結果を出力する必要があります。それ以上の数の出力を生成する場合、それは正しい必要があります。つまり、特定のサイズまでは正しい出力を生成する必要がありますが、間違っている場合はそのサイズを超える出力は生成しません。最大サイズは15(32768x32768)と想定できます。これは、すでにASCIIアート(1GB)の非常識なサイズだからです。

8x8パターンは以下のようになります(ルール160)。左端の桁はblock A、中央の桁(失礼な考えはありません!)はblock B、右端の桁はblock Cです。フラクタルを作成するには、両方の次元で半分に縮小し、ブロックに回転/ミラーリングルールを適用します。パターンを縮小するには、2x2の領域に均等に分割します。各エリアに3つの表示文字があるか、何も表示されません。目に見える文字がある場合は、小さいブロックの適切な場所に文字を配置し、そうでない場合はスペースを配置します。ルール0- 3ミラーリングされません、ルール4- 7ミラーリングされます。ルール04回転されていない、15時計回りに90度回転され、2そして6回転180度であり、3そして7時計回りに270度回転されます。3つのブロックをA左上隅、B左下、C右下の順序で縫い合わせます。

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

縮小、回転、ルール番号でミラーリング:

 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 

ルール:

  1. ミラーリングなし、時計回りに90度回転
  2. ミラーリングなし、時計回りに180度回転
  3. ミラーリングなし、時計回りに270度回転
  4. ミラーリングされるが回転されない
  5. ミラーリングしてから時計回りに90度回転
  6. ミラーリングしてから時計回りに180度回転
  7. ミラーリングしてから時計回りに270度回転
  8. ルール0:ミラーリングされない、回転されない

ミラーリングは常に最初に行われ、空白のコーナーを斜めに通過して行われます。たとえば、ルール0とルール4です。

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

唯一のルール16及び0そのために、上記のパターンで使用されています。変換が適用され、ブロックがつなぎ合わされた後は、各ブロックの間隔を1つ空けていることを除いて、次のようになります。コードには、この余分なスペースはありません。「親」画像と比較すると、同じ位置に文字が表示されていることがわかります。

 BAA
BB A
CC  
C   

AAB  AA  
A BB A   
  CC BBC 
   C  BCC

縮小せずに画像を生成する別の方法は次のとおりです。1つの文字で開始します。

X

3つのブロックのそれぞれに変換を適用し(1つの文字だけなので、なし)、ブロックをつなぎ合わせます。

X
XX

3つのブロックそれぞれに変換を再度適用します。

1 
--
XX
X 

6     0 
--    --
XX    X 
 X    XX

それらを一緒にステッチします。

XX
X 
XXX 
 XXX

3つのブロックそれぞれに変換を再度適用します。

 1  
----
 XXX
XX X
XX  
X   

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

それらを一緒にステッチします。

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

パターンの可視部分には任意の印刷可能文字(0x21-0x7E)を使用できますが、空白にはスペース文字(0x20)のみを使用できます。末尾のスペースは許可されますが、正方形全体の外側に空白があってはなりません(つまり、8x8の正方形の場合、8列目以降に文字があってはなりません)。

512の異なるルールがありますが、それらのいくつかは同じパターンを生成します。サイドノートとして、任意のパターンのみを含有0し、4シェルピンスキーの三角形(8つの異なるルール)を生成します。

オプションとして、お気に入りのパターンとそれを生成するルールを投稿できます。その場合、同様のルールと区別するために、サイズが少なくとも3(8x8)であることを確認してください。


@trichoplax完全に塗りつぶされた正方形、または1文字のみが表示されている正方形から始めることができます。どちらの方法でも、ルールをn回繰り返すと(nは入力サイズ)、同じ結果が保証されます。ただし、この方法でパターンを生成する必要はありません。この方法で行うのと同じパターンを生成するだけです。
CJデニス

@trichoplax私はあなたの入力を感謝します。私が物事を見る方法は、必ずしも他の人が物事を見る方法ではなく、私が彼らのために苦労していることを知りません!
CJデニス

2
+1ありがとうございます。説明がわかりやすくなりました。将来的には、サンドボックスを介し実行することをお勧めします。そうすることで、人々があなたが求めていることを前もって明確に把握できるようになります。私はまもなくこの課題に取り組みます:)
BrainSteel

ええ、みんなは物事を違う見方をしています。フィードバックをいただければ幸いです。良い質問は明確にする価値があります。今よく読めます。
trichoplax

@BrainSteelありがとうございます、やります!私は長年SEを利用していますが、PCGはまだ比較的新しいです。
CJデニス

回答:


1

CJam、63 57 54 52バイト

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

仕組み

基本的な考え方は、2番目の入力回数であるループを実行することです。各ループでは、0[[0]])を含む配列の単一の配列から始めて、3つのルールを使用して次のステップのフラクタルを構築し、空の象限を埋めて、次のループの象限を準備します。

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

ここでオンラインでお試しください


非常にきれい!パターンがで始まり0、James Bondがキルするライセンスを持っている場合、印刷可能な文字が少なすぎます。007:IndexOutOfBoundsException
CJ Dennis

@CJDennis先行ゼロのバグがあります。今修正されました。
オプティマイザ、

よくやった!出力は今完璧に見えます!
CJデニス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.