Minecraft Schloss Fractal

18

Begeistert von einem Youtube-Video eines anderen PPCG-Benutzers ...

Ihre Herausforderung besteht darin, mit ASCII-Kunst eine Minecraft-Burgmauer aus Andesit und Diorit zu zeichnen. Die Form der Wand ist das Cantor Set . Zum Nachschlagen wird das Cantor-Set erstellt, indem die folgenden N Male wiederholt werden :

  • Verdreifache den aktuellen Schritt
  • Ersetzen Sie die mittlere durch ein Leerzeichen
  • Fügen Sie eine vollständige Zeile darunter ein

Dadurch wird für die ersten vier Schritte Folgendes erstellt:

*

* *
***

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

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

Ihre Herausforderung ist jedoch nicht ganz so einfach. Sie sehen, nachdem das Cantor-Set wirklich groß geworden ist, wird es langweilig, denselben Charakter immer und immer wieder zu betrachten. Also werden wir das ändern, indem wir eine abwechselnde Reihe von Sternchen *und Pfundzeichen überlagern #. Sie sollten alle drei Zeichen horizontal und jede Zeile vertikal abwechseln. (Lassen Sie die Leerzeichen natürlich unverändert.) Das zweite Beispiel lautet beispielsweise:

* *
###

und das dritte Beispiel wird:

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

Der Vollständigkeit halber hier die Beispiele vier und fünf:

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

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

Und ein Mega- Beispiel, die 6. Iteration:

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

Die Herausforderung

Sie müssen ein vollständiges Programm oder eine vollständige Funktion schreiben, die eine positive Ganzzahl für die Eingabe akzeptiert und die N -te Generation dieses Minecraft Castle-Fraktals ausgibt . Sie können Eingaben und Ausgaben mit jeder vernünftigen Methode vornehmen und müssen sich keine Gedanken über ungültige Eingaben machen (z. B. Zahlen unter 1, Gleitkommazahlen, Nichtzahlen usw.).

Die kürzeste Antwort, gemessen in Bytes, gewinnt!

DJMcMayhem
quelle
1
Related
DJMcMayhem

Antworten:

5

Jelly , 43 36 35 Bytes

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

Nur ein Anfang, ich bin sicher, das könnte kürzer sein.

Probieren Sie es online!

* Bei n > 5 wird die Ausgabe möglicherweise von Ihrem Browser umbrochen. Wenn Sie sie jedoch in einen nicht umbrochenen Editor kopieren, wird die richtige Ausgabe angezeigt.

Erläuterung

ḶṚ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
Meilen
quelle
3

JavaScript (ES7), 132 bis 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`

Wobei \ndas wörtliche Zeilenumbruchzeichen darstellt. ES6-Version für 141 Bytes:

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
quelle
2

Python 2, 142 138 136 Bytes

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

Dies ist der Code von hier , der dann für diese Herausforderung bearbeitet wird.

Werde später eine Erklärung posten.

Übrigens sind zwei Leerzeichen Registerkarten.

Bearbeiten Sie 1: 4 Bytes, die dank @DJMcMayhem gespeichert wurden.

Edit 2: 2 Bytes gespeichert dank @daHugLenny.

Clismique
quelle
1
Können Sie die Klammern in Python 2 nicht entfernen exec("s+=len(s)*' '+s;"*(n-i))?
Acrolith
@daHugLenny Ah ja, danke! (Entschuldigung, dass Sie nicht früh genug
geantwortet haben
1

Rubin, 115 103 102 Bytes

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

Basierend auf der Lösung von jsvnm zum Standard Cantor Set Golf .

-12 Bytes dank Jordan.

m-chrzan
quelle
g=->{T.tr"*#","#*"}
Jordanien
Auch s.map!{...}anstelle von s=s.map{...};s.
Jordanien
@Jordan an map! Es würde erfordern, dass das +zu ändern <<, und es würde die gleiche Länge enden. Ich glaube das sist am Ende sowieso noch nötig - die Map befindet sich innerhalb einer .timesSchleife.
m-chrzan
Ah, richtig du bist.
Jordanien
1

J, 47 45 Bytes

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

Basierend auf meiner Lösung für die Cantor Set Challenge.

Verwendung

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

Erläuterung

' *#'{~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
Meilen
quelle
1

PHP, 159 Bytes

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

Nervenzusammenbruch

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
quelle