Fraktal kastil Minecraft

18

Diinspirasikan oleh video youtube dari sesama pengguna PPCG ...

Tantangan Anda adalah menggunakan seni ASCII menggambar dinding kastil Andesite dan Diorite di Minecraft. The bentuk dinding adalah penyanyi Set . Untuk referensi, Cantor Set dibuat dengan mengulangi N kali berikut :

  • Lipat tigakan langkah saat ini
  • Ganti yang tengah dengan ruang kosong
  • Tambahkan baris penuh di bawahnya

Ini menciptakan yang berikut untuk empat langkah pertama:

*

* *
***

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

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

Namun, tantangan Anda tidak sesederhana itu. Anda tahu, setelah set cantor menjadi sangat besar, menjadi membosankan untuk melihat karakter yang sama berulang-ulang. Jadi kita akan mengubahnya dengan melapiskan serangkaian tanda bintang *dan tanda pound secara bergantian #. Anda harus mengganti setiap tiga karakter secara horizontal, dan pada setiap baris secara vertikal. (Tentu saja meninggalkan spasi sama) Misalnya, contoh kedua akan menjadi:

* *
###

dan contoh ketiga akan menjadi:

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

Untuk kelengkapan, berikut adalah contoh empat dan lima:

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

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

Dan satu contoh mega , iterasi ke-6:

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

Tantangan

Anda harus menulis program atau fungsi lengkap yang menerima bilangan bulat positif untuk input, dan menghasilkan generasi ke - N dari fraktal kastil minecraft ini. Anda dapat mengambil Input dan output dengan metode apa pun yang masuk akal, dan Anda tidak perlu khawatir tentang input yang tidak valid (seperti angka kurang dari 1, angka floating point, bukan angka, dll.).

Jawaban terpendek, diukur dalam bytes, menang!

DJMcMayhem
sumber
1
Terkait
DJMcMayhem

Jawaban:

5

Jelly , 43 36 35 byte

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

Hanya permulaan, saya yakin ini bisa lebih pendek.

Cobalah online!

* Untuk n > 5, browser Anda mungkin membungkus output tetapi jika Anda menyalinnya ke editor non-pembungkus, Anda akan melihat output yang tepat.

Penjelasan

ḶṚ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
mil
sumber
3

JavaScript (ES7), 132 125 byte

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`

Dimana \nmewakili karakter baris baru. Versi ES6 untuk 141 byte:

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>

Neil
sumber
2

Python 2, 142 138 136 byte

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

Ini adalah potongan kode dari sini , dan kemudian diedit untuk tantangan ini.

Akan memposting penjelasan nanti.

Juga, BTW, dua spasi adalah tab.

Sunting 1: 4 byte disimpan berkat @DJMcMayhem.

Sunting 2: 2 byte disimpan berkat @daHugLenny.

clismique
sumber
1
Karena ini Python 2, tidak bisakah Anda menghapus tanda kurung di dalamnya exec("s+=len(s)*' '+s;"*(n-i))?
acrolith
@daHugLenny Ah ya, terima kasih! (Maaf karena tidak segera membalas)
clismique
1

Rubi, 115 103 102 byte

->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}

Berdasarkan solusi jsvnm ke set standar golf Cantor .

Terima kasih -12 byte ke Jordan.

m-chrzan
sumber
g=->{T.tr"*#","#*"}
Jordan
Juga, s.map!{...}bukannya s=s.map{...};s.
Jordan
@Jordan s.map! akan membutuhkan +untuk mengubah <<, dan itu akan berakhir dengan panjang yang sama. Saya percaya sini masih diperlukan pada akhirnya - peta berada dalam satu .timeslingkaran.
m-chrzan
Ah, benar juga.
Jordan
1

J, 47 45 byte

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

Berdasarkan solusi saya untuk Cantor mengatur tantangan.

Pemakaian

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

Penjelasan

' *#'{~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
mil
sumber
1

PHP, 159 byte

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);

kerusakan

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);
Titus
sumber