Minecraft kale fraktal


18

Diğer PPCG kullanıcılarından bir youtube videosundan ilham aldı ...

Meydan okuma ASCII-art Andesite ve Diorite bir Minecraft kale duvarı çizmek kullanmaktır. Şekil duvarı olan Cantor ayarlayın . Referans olarak, Cantor Set aşağıdaki N kez tekrarlanarak yapılır :

  • Mevcut adımı üçe katla
  • Ortadaki yeri boşlukla değiştirin
  • Altına tam bir satır ekleyin

Bu, ilk dört adım için aşağıdakileri oluşturur:

*

* *
***

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

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

Ancak, meydan okuma o kadar da basit değil. Gördüğünüz gibi, cantor seti gerçekten büyüdükten sonra, tekrar tekrar aynı karaktere bakmak sıkıcı bir hal alıyor. Bu yüzden, bir dizi yıldız *ve pound işaretini kaplayarak değiştireceğiz #. Her üç karakterde yatay olarak ve her satırda dikey olarak değişiklik yapmalısınız. (Elbette boşlukları aynı bırakmak) Örneğin, ikinci örnek:

* *
###

ve üçüncü örnek:

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

Bütünlük için, örnek dört ve beş:

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

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

Ve bir mega örnek, 6. yineleme:

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

Meydan okuma

Sen girişi için pozitif bir tamsayı kabul eder ve çıktılar bir tam program veya fonksiyon yazmalısınız N 'Bu Minecraft kale fraktal inci nesil. Girdi ve çıktıları makul bir yöntemle alabilir ve geçersiz girdiler (1'den küçük sayılar, kayan nokta sayıları, sayı olmayanlar vb.) Hakkında endişelenmenize gerek yoktur.

Bayt cinsinden ölçülen en kısa cevap kazanır!


Yanıtlar:


5

Jöle , 43 36 35 bayt

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

Sadece bir başlangıç, eminim bu daha kısa olabilir.

Çevrimiçi deneyin!

* N > 5 için tarayıcınız çıktıyı sarabilir, ancak kopyalamayı kaydırıcı olmayan bir düzenleyiciye yapıştırırsanız, doğru çıktıyı görürsünüz.

açıklama

ḶṚ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

JavaScript (ES7), 132 125 bayt

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`

Nerede \ngerçek satırsonu karakter temsil eder. 141 bayt için ES6 sürümü:

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

Python 2, 142 138 136 bayt

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

Bu, buradan gelen kod parçasıdır ve daha sonra bu meydan okuma için düzenlenmiştir.

Daha sonra bir açıklama gönderecek.

Ayrıca, BTW, iki boşluk sekmelerdir.

@DJMcMayhem sayesinde 1: 4 bayt düzenleyin.

@DaHugLenny sayesinde 2: 2 bayt kaydedildi.


1
Python 2 olduğundan, parantezleri kaldıramaz exec("s+=len(s)*' '+s;"*(n-i))mısınız?
akrolit

@daHugLenny Ah evet, teşekkürler! (Maalesef yakında yanıtlarken değil)
clismique

1

Yakut, 115 103 102 bayt

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

JSVNM'nin standart Cantor set golf çözümüne dayanmaktadır .

Ürdün sayesinde -12 bayt.


g=->{T.tr"*#","#*"}
Ürdün

Ayrıca, s.map!{...}yerine s=s.map{...};s.
Ürdün

@Jordan s.map! +değişmesini gerektirecek ve <<aynı uzunlukta olacaktı. sSonunda hala gerekli olduğuna inanıyorum - harita bir .timesdöngü içinde.
m-chrzan

Ah, haklısın.
Ürdün

1

J, 47 45 bayt

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

Dayanarak benim Cantor set meydan okuma çözüm .

kullanım

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

açıklama

' *#'{~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 bayt

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

Yıkmak

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