Fractale du château de Minecraft

18

Inspiré par une vidéo YouTube d'un autre utilisateur de PPCG ...

Votre défi est d'utiliser l'art ASCII pour dessiner un mur de château Minecraft d'Andésite et Diorite. La forme du mur est l' ensemble Cantor . Pour référence, le Cantor Set est réalisé en répétant les N fois suivants:

  • Tripler l'étape actuelle
  • Remplacez celui du milieu par un espace vide
  • Ajouter une ligne complète en dessous

Cela crée les éléments suivants pour les quatre premières étapes:

*

* *
***

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

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

Cependant, votre défi n'est pas aussi simple que cela. Vous voyez, une fois que le jeu de cantor est devenu très gros, il devient ennuyeux de regarder le même personnage répété encore et encore et encore. Nous allons donc changer cela en superposant une série alternée d'astérisques *et de signes dièse #. Vous devez alterner tous les trois caractères horizontalement et sur chaque ligne verticalement. (Bien sûr, en laissant les espaces identiques) Par exemple, le deuxième exemple deviendra:

* *
###

et le troisième exemple deviendra:

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

Pour être complet, voici les exemples quatre et cinq:

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

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

Et un méga exemple, la 6ème itération:

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

Le défi

Vous devez écrire un programme complet ou une fonction qui accepte un entier positif pour l' entrée, et émet le N ième génération de cette fractale du château de minecraft. Vous pouvez prendre l'entrée et la sortie par n'importe quelle méthode raisonnable, et vous n'avez pas à vous soucier des entrées non valides (telles que les nombres inférieurs à 1, les nombres à virgule flottante, les non-nombres, etc.).

La réponse la plus courte, mesurée en octets, gagne!

DJMcMayhem
la source
1
Connexes
DJMcMayhem

Réponses:

5

Gelée , 43 36 35 octets

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

Pour commencer, je suis sûr que cela pourrait être plus court.

Essayez-le en ligne!

* Pour n > 5, votre navigateur peut encapsuler la sortie, mais si vous la copiez-collez dans un éditeur sans encapsulation, vous verrez la sortie appropriée.

Explication

ḶṚ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
miles
la source
3

JavaScript (ES7), 132 125 octets

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`

\nreprésente le caractère de nouvelle ligne littéral. Version ES6 pour 141 octets:

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
la source
2

Python 2, 142 138 138 136 octets

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

Ceci est le morceau de code d' ici , puis édité pour ce défi.

Publiera une explication plus tard.

De plus, BTW, deux espaces sont des tabulations.

Edit 1: 4 octets enregistrés grâce à @DJMcMayhem.

Edit 2: 2 octets enregistrés grâce à @daHugLenny.

clismique
la source
1
Comme c'est Python 2, ne pouvez-vous pas supprimer les parenthèses exec("s+=len(s)*' '+s;"*(n-i))?
acrolith
@daHugLenny Ah oui, merci! (Désolé de ne pas avoir répondu assez tôt)
clismique
1

Rubis, 115 103 102 octets

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

Basé sur la solution de jsvnm pour le golf standard Cantor .

-12 octets grâce à Jordan.

m-chrzan
la source
g=->{T.tr"*#","#*"}
Jordan
Aussi, s.map!{...}au lieu de s=s.map{...};s.
Jordan
@Jordan s.map! nécessiterait le +changer en <<, et il finirait par la même longueur. Je crois que sc'est toujours nécessaire à la fin de toute façon - la carte est à l'intérieur d'une .timesboucle.
m-chrzan
Ah, vous avez raison.
Jordan
1

J, 47 45 octets

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

Basé sur ma solution au défi d'ensemble de Cantor.

Usage

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

Explication

' *#'{~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
miles
la source
1

PHP, 159 octets

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

panne

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
la source