ASCII 아트 스퀘어 아핀 프랙탈


9

아핀 프랙탈을 만들 수있는 가장 작은 프로그램을 작성하십시오. 아래 규칙과 동일한 결과를 생성하는 느낌이 드는 방법을 사용할 수 있습니다. 제안 된 방법으로 아이디어를 사용할 필요는 없습니다!

프로그램은 두 개의 입력을 취합니다. 첫 번째 074는 0에서 7까지의 세 자릿수 형식 으로 패턴을 정의합니다 . 두 번째 입력은 크기를 정의하고 38x8 4이되고 16x16이됩니다 (2 ^ n). 프로그램은 0 (1x1)에서 5 (32x32) 이상의 모든 크기에 대해 올바른 결과를 출력해야합니다. 더 높은 숫자에 대한 출력을 생성하는 경우 정확해야합니다. 즉, 특정 크기까지 올바른 출력을 생성해야하지만 잘못된 경우 해당 크기보다 큰 출력을 생성하지 않아야합니다. ASCII 아트 (1GB)의 경우 이미 크기가 최대이므로 최대 크기는 15 (32768x32768)입니다.

8x8 패턴은 다음과 같습니다 (rule 160). 가장 왼쪽 숫자는 블록 A, 중간 숫자 (무례한 생각은하지 마십시오!), 블록의 B가장 오른쪽 숫자는 블록 C입니다. 프랙탈을 구성하려면 두 차원 모두에서 절반으로 축소하고 블록에 회전 / 미러링 규칙을 적용하십시오. 패턴을 축소하려면 패턴을 2x2 영역으로 균일하게 나눕니다. 각 영역에 3 개의 보이는 문자가 있거나없는 문자가 있습니다. 보이는 문자가있는 경우 작은 블록의 적절한 위치에 문자를 배치하고 그렇지 않으면 공백을 배치하십시오. 규칙 0- 3규칙, 미러링되지 않습니다 4- 7미러링됩니다. 규칙 04회전되지 않습니다 15시계 방향으로 90도 회전, 26180도 회전 3하고 7시계 방향으로 270도 회전합니다. A왼쪽 상단, B왼쪽 C하단 및 오른쪽 하단에 표시된 순서대로 3 개의 블록을 연결합니다 .

 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

만은 규칙 1, 6그리고 0순서대로, 위의 패턴으로 사용됩니다. 변환이 적용되고 블록이 함께 스티칭 된 후 각 블록을 한 칸씩 간격을두고 제외하고는 아래와 같습니다. 코드에는이 여분의 공간이 없습니다. 이미지를 "부모"이미지와 비교하면 동일한 위치에 보이는 문자가있는 것을 볼 수 있습니다.

 BAA
BB A
CC  
C   

AAB  AA  
A BB A   
  CC BBC 
   C  BCC

축소하지 않고 이미지를 생성하는 다른 방법은 다음과 같습니다. 한 문자로 시작하십시오.

X

세 개의 블록 각각에 대해 변형을 적용하고 (단 하나의 문자이므로 없음) 블록을 함께 연결하십시오.

X
XX

세 블록 각각에 대해 변환을 다시 적용하십시오.

1 
--
XX
X 

6     0 
--    --
XX    X 
 X    XX

함께 스티치 :

XX
X 
XXX 
 XXX

세 블록 각각에 대해 변환을 다시 적용하십시오.

 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 완전히 채워진 사각형 또는 그 안에 보이는 문자가 하나 뿐인 사각형으로 시작할 수 있습니다. 어느 쪽이든, 규칙을 n 번 반복하면 , 여기서 n 은 입력 크기이며 동일한 결과를 보장합니다. 그러나이 방법으로 패턴을 생성 할 필요는 없으며,이 방법으로 패턴을 생성하는 것과 동일한 패턴 만 생성하면됩니다.
CJ 데니스

@trichoplax 귀하의 의견에 감사드립니다. 내가 사물을 보는 방식이 다른 사람들이 사물을 보는 방식 일 필요는 없으며, 내가 그들을 어렵게 만들고 있다는 것을 모르겠습니다!
CJ 데니스

2
+1 감사합니다. 설명을 훨씬 명확하게 만들었습니다. 앞으로는 샌드 박스를 통해 작업을 수행 하여 사람들이 미리 요청한 내용을보다 명확하게 파악할 수 있도록 권장합니다 . 나는이 도전에 대해 곧
노력할

예, 모두 다르게 보입니다. 의견을 보내 주셔서 감사합니다. 좋은 질문은 설명 할 가치가 있습니다. 잘 읽습니다.
trichoplax

@BrainSteel 감사합니다. 나는 몇 년 동안 SE에 있었지만 여전히 PCG를 처음 접했습니다!
CJ 데니스

답변:


1

CJam, 63 57 54 52 바이트

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

작동 방식 :

기본 아이디어는 두 번째 입력 횟수 인 루프를 실행하는 것입니다. 각 루프에서 0( [[0]])을 포함하는 단일 배열 배열에서 시작 하여 세 가지 규칙을 사용하여 다음 단계에 대한 프랙탈을 만들고 빈 사분면을 채우고 다음 루프에 대한 사분면을 준비합니다.

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 데니스

@CJDennis 앞에 0이있는 버그가 있습니다. 지금 수정했습니다.
Optimizer

잘 했어! 출력은 이제 완벽 해 보입니다!
CJ 데니스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.