마인 크래프트 성 프랙탈


18

동료 PPCG 사용자 의 YouTube 동영상 에서 영감을받은 ...

ASCII 예술을 사용하여 Andesite와 Diorite의 Minecraft 성벽을 그리는 것이 도전입니다. 벽 의 모양Cantor Set 입니다. 참고로 Cantor Set은 다음 N 번 반복합니다 .

  • 현재 단계의 3 배
  • 가운데 공간을 빈 공간으로 교체
  • 그 아래에 전체 줄을 추가하십시오

처음 네 단계에 대해 다음을 작성합니다.

*

* *
***

* *   * *
***   ***
*********

* *   * *         * *   * *
***   ***         ***   ***
*********         *********
***************************

그러나 당신의 도전은 그렇게 간단하지 않습니다. 캔터 세트가 실제로 커지면 반복해서 같은 문자를 반복해서 보는 것이 지루해집니다. 따라서 별표 *와 파운드 기호를 번갈아 가며 겹쳐서 변경합니다 #. 세 문자마다 가로로, 모든 행에서 세로로 번갈아 가야합니다. (물론 공백은 그대로 두십시오) 예를 들어 두 번째 예는 다음과 같습니다.

* *
###

세 번째 예는 다음과 같습니다.

* *   * *
###   ###
***###***

완성도를 높이기 위해 예제 4와 5가 있습니다.

#4
* *   * *         * *   * *
###   ###         ###   ###
***###***         ***###***
###***###***###***###***###

#5
* *   * *         * *   * *                           * *   * *         * *   * *
###   ###         ###   ###                           ###   ###         ###   ###
***###***         ***###***                           ***###***         ***###***
###***###***###***###***###                           ###***###***###***###***###
***###***###***###***###***###***###***###***###***###***###***###***###***###***

그리고 하나의 메가 예, 여섯 번째 반복 :

* *   * *         * *   * *                           * *   * *         * *   * *                                                                                 * *   * *         * *   * *                           * *   * *         * *   * * 
###   ###         ###   ###                           ###   ###         ###   ###                                                                                 ###   ###         ###   ###                           ###   ###         ###   ###
***###***         ***###***                           ***###***         ***###***                                                                                 ***###***         ***###***                           ***###***         ***###***
###***###***###***###***###                           ###***###***###***###***###                                                                                 ###***###***###***###***###                           ###***###***###***###***###
***###***###***###***###***###***###***###***###***###***###***###***###***###***                                                                                 ***###***###***###***###***###***###***###***###***###***###***###***###***###***
###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###

도전

입력에 양의 정수를 허용 하고이 마인 크래프트 성 프랙탈 의 N 세대를 출력하는 전체 프로그램 또는 함수를 작성해야합니다 . 합리적인 방법으로 입력 및 출력을 수행 할 수 있으며 유효하지 않은 입력 (예 : 1보다 작은 숫자, 부동 소수점 숫자, 비 숫자 등)에 대해 걱정할 필요가 없습니다.

바이트 단위로 측정 된 최단 답변이 승리합니다!


답변:


5

젤리 , 43 36 35 바이트

ḶṚ3*µ5B¤xЀṁ€Ṁ×\Ṛ©1,‘xS$¤ṁ×®ị“*# ”Y

시작일 뿐인데, 이것이 더 짧을 수 있다고 확신합니다.

온라인으로 사용해보십시오!

* n > 5의 경우 브라우저가 출력을 줄 바꿈 할 수 있지만 랩핑되지 않은 편집기에 복사하여 붙여 넣으면 올바른 출력이 표시됩니다.

설명

ḶṚ3*µ5B¤xЀṁ€Ṁ×\Ṛ©1,‘xS$¤ṁ×®ị“*# ”Y  Input: integer n
Ḷ                                    Create the range [0, n)
 Ṛ                                   Reverse it
  3*                                 Raise 3 to the power of each
    µ                                Begin a new monadic chain on the powers of 3
     5B¤                             Nilad. Get the binary digits of 5 = [1, 0, 1]
        xЀ                          Duplicate each of [1, 0, 1] to a power of 3 times
             Ṁ                       Get the maximum of the powers of 3
           ṁ€                        Reshape each to a length of that value
              ×\                     Cumulative products
                Ṛ©                   Reverse and save the result
                  1,‘xS$¤            Niladic chain.
                  1                    Start with 1
                    ‘                  Increment it
                   ,                   Pair them to get [1, 2]
                       $               Operate on [1, 2]
                      S                  Sum it to get 3
                     x                   Repeat each 3 times to get [1, 1, 1, 2, 2, 2]
                         ṁ           Reshape that to the saved table
                          ×®         Multiply elementwise with the saved table
                            ị“*# ”   Use each to as an index to select from "*# "
                                  Y  Join using newlines
                                     Return and print implicitly

3

자바 스크립트 (ES7) 132 125 바이트

n=>[...Array(n)].map((_,i)=>[...Array(3**~-n)].map((_,j)=>/1/.test((j/3**i|0).toString(3))?" ":`*#`[j/3+i&1]).join``).join`\n`

어디 \n리터럴 개행 characer을 나타냅니다. 141 바이트 용 ES6 버전 :

f=
n=>[...Array(n)].map((_,i)=>[...Array(Math.pow(3,n-1))].map((_,j)=>/1/.test((j*3).toString(3).slice(0,~i))?" ":`*#`[j/3+i&1]).join``).join`
`
;
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>


2

파이썬 2 142 138 136 바이트

r=range
def f(n):
 for i in r(n+1):
  s="";d=i%2<1
  for k in r(3**i):s+="#*"[(6+d-1+k*(d*2-1))%6<3]
  exec"s+=len(s)*' '+s;"*(n-i);print s

이것은 here 의 코드 조각 이며이 도전 과제를 위해 편집되었습니다.

나중에 설명을 게시합니다.

또한 BTW에서 두 개의 공백은 탭입니다.

편집 1 : @DJMcMayhem 덕분에 4 바이트가 절약되었습니다.

편집 2 : @daHugLenny 덕분에 2 바이트가 절약되었습니다.


1
파이썬 2이므로 괄호를 제거 할 수 exec("s+=len(s)*' '+s;"*(n-i))없습니까?
acrolith

@daHugLenny 아 그래, 고마워! (죄송 곧 회신하지 않는)
clismique을

1

루비, 115 103 102 바이트

->n{g=->{T.tr"*#","#*"}
*s=?*
(n-1).times{|i|T=s[-1]
s=s.map{|l|l+' '*3**i+l}+[i<1??#*3:g[]+T+g[]]}
s}

표준 Cantor 세트 골프 에 대한 jsvnm의 솔루션을 기반으로 합니다.

Jordan 덕분에 -12 바이트


g=->{T.tr"*#","#*"}
Jordan

또한 s.map!{...}대신에 s=s.map{...};s.
Jordan

@Jordan s.map! +로 변경 해야하며 <<길이는 같습니다. 나는 s어느 쪽 끝에도 여전히 필요 하다고 생각합니다 .지도는 .times루프 안에 있습니다.
m-chrzan

아, 맞아
Jordan

1

J, 47 45 바이트

' *#'{~3(]*$@]$1 2#~[)(,:1)1&(,~],.0&*,.])~<:

Cantor 에 대한 나의 해결책 을 바탕으로 설정했습니다.

용법

   f =: ' *#'{~3(]*$@]$1 2#~[)(,:1)1&(,~],.0&*,.])~<:
   f 1
*
   f 2
* *
###
   f 3
* *   * *
###   ###
***###***

설명

' *#'{~3(]*$@]$1 2#~[)(,:1)1&(,~],.0&*,.])~<:  Input: n
                                           <:  Decrement n
                      (,:1)                    A constant [1]
                           1&(           )~    Repeating n-1 times on x starting
                                               with x = [1]
                                        ]        Identity function, gets x
                                   0&*           Multiply x elementwise by 0
                                      ,.         Join them together by rows
                                ]                Get x
                                 ,.              Join by rows
                           1  ,~                 Append a row of 1's and return
       3                                       The constant 3
        (                 )                    Operate on 3 and the result
                    [                          Get LHS = 3
               1 2                             The constant [1, 2]
                  #~                           Duplicate each 3 times
                                               Forms [1, 1, 1, 2, 2, 2]
           $@]                                 Get the shape of the result
              $                                Shape the list of [1, 2] to
                                               the shape of the result
         ]                                     Get the result
          *                                    Multiply elementwise between the
                                               result and the reshaped [1, 2]
' *#'                                        The constant string ' *#'
     {~                                       Select from it using the result
                                             as indices and return

1

PHP, 159 바이트

for($r=($n=--$argv[1])?["* *","###"]:["*"];++$i<$n;$r[]=$a.$b.$a){$a=strtr($b=end($r),"#*","*#");foreach($r as&$s)$s.=str_pad("",3**$i).$s;}echo join("\n",$r);

고장

for(
    $r=($n=--$argv[1])  // pre-decrease argument, initialize result
    ?["* *","###"]      // shorter than handling the special iteration 2 in the loop
    :["*"]              // iteration 1
    ;
    ++$i<$n             // further iterations:
    ;
    $r[]=$a.$b.$a       // 3. concatenate $a, $b, $a and add to result
)
{
                        // 1. save previous last line to $b, swap `*` with `#` to $a
    $a=strtr($b=end($r),"#*","*#"); 
                        // 2. duplicate all lines with spaces of the same length inbetween
    foreach($r as&$s)$s.=str_pad("",3**$i).$s;  # strlen($s)==3**$i
}
// output
echo join("\n",$r);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.