[Question]
  [
Produce this square snowflake.
```
XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
XX   X   X   X   X   X   X   X   X   X   X   X   X   X   X   XX
X XXXX   XXXXX   XXXXX   XXXXX   XXXXX   XXXXX   XXXXX   XXXX X
  XX       X X   X X       X X   X X       X X   X X       XX  
X X XXX XXXX       XXXX XXXX       XXXX XXXX       XXXX XXX X X
XXX XX   X X X   X X X   X X X   X X X   X X X   X X X   XX XXX
X   X XXXX XXX   XXX XXXXX XXX   XXX XXXXX XXX   XXX XXXX X   X
      XX               X X   X   X   X X               XX      
X   X X XXX XXX XXX XXXX               XXXX XXX XXX XXX X X   X
XXX XXX XX   X   X   X X X   X   X   X X X   X   X   XX XXX XXX
X X X   X XXXX   XXXXX XXX XXX   XXX XXX XXXXX   XXXX X   X X X
  XXXXX   XX       X X   X X X   X X X   X X       XX   XXXXX  
X X   X X X XXX XXXX   XXXXX       XXXXX   XXXX XXX X X X   X X
XXXX XX XXX XX   X X X X   X X   X X   X X X X   XX XXX XX XXXX
X       X   X XXXX XXX XX XXXX   XXXX XX XXX XXXX X   X       X
              XX                               XX              
X       X   X X XXX XXX XXX XXX XXX XXX XXX XXX X X   X       X
XXXX XX XXX XXX XX   X   X   X   X   X   X   XX XXX XXX XX XXXX
X X   X X X X   X XXXX   XXXXX   XXXXX   XXXX X   X X X X   X X
  XXXXX   XXXXX   XX       X X   X X       XX   XXXXX   XXXXX  
X X X   X X   X X X XXX XXXX       XXXX XXX X X X   X X   X X X
XXX XXX XXXX XX XXX XX   X X X   X X X   XX XXX XX XXXX XXX XXX
X   X X X       X   X XXXX XXX   XXX XXXX X   X       X X X   X
      XXXXX XXX       XX               XX       XXX XXXXX      
X   X X   X X X X   X X XXX XXX XXX XXX X X   X X X X   X X   X
XXX XXXX XXXX   XXX XXX XX   X   X   XX XXX XXX   XXXX XXXX XXX
X X X       X X X X X   X XXXX   XXXX X   X X X X X       X X X
  XXXXX   XXXXX   XXXXX   XX       XX   XXXXX   XXXXX   XXXXX  
X X   X   X   X X X   X X X XXX XXX X X X   X X X   X   X   X X
XXXX XXX XXX XX XXXX XX XXX XX   XX XXX XX XXXX XX XXX XXX XXXX
X               X       X   X XXX X   X       X               X
                              XXX                              
X               X       X   X XXX X   X       X               X
XXXX XXX XXX XX XXXX XX XXX XX   XX XXX XX XXXX XX XXX XXX XXXX
X X   X   X   X X X   X X X XXX XXX X X X   X X X   X   X   X X
  XXXXX   XXXXX   XXXXX   XX       XX   XXXXX   XXXXX   XXXXX  
X X X       X X X X X   X XXXX   XXXX X   X X X X X       X X X
XXX XXXX XXXX   XXX XXX XX   X   X   XX XXX XXX   XXXX XXXX XXX
X   X X   X X X X   X X XXX XXX XXX XXX X X   X X X X   X X   X
      XXXXX XXX       XX               XX       XXX XXXXX      
X   X X X       X   X XXXX XXX   XXX XXXX X   X       X X X   X
XXX XXX XXXX XX XXX XX   X X X   X X X   XX XXX XX XXXX XXX XXX
X X X   X X   X X X XXX XXXX       XXXX XXX X X X   X X   X X X
  XXXXX   XXXXX   XX       X X   X X       XX   XXXXX   XXXXX  
X X   X X X X   X XXXX   XXXXX   XXXXX   XXXX X   X X X X   X X
XXXX XX XXX XXX XX   X   X   X   X   X   X   XX XXX XXX XX XXXX
X       X   X X XXX XXX XXX XXX XXX XXX XXX XXX X X   X       X
              XX                               XX              
X       X   X XXXX XXX XX XXXX   XXXX XX XXX XXXX X   X       X
XXXX XX XXX XX   X X X X   X X   X X   X X X X   XX XXX XX XXXX
X X   X X X XXX XXXX   XXXXX       XXXXX   XXXX XXX X X X   X X
  XXXXX   XX       X X   X X X   X X X   X X       XX   XXXXX  
X X X   X XXXX   XXXXX XXX XXX   XXX XXX XXXXX   XXXX X   X X X
XXX XXX XX   X   X   X X X   X   X   X X X   X   X   XX XXX XXX
X   X X XXX XXX XXX XXXX               XXXX XXX XXX XXX X X   X
      XX               X X   X   X   X X               XX      
X   X XXXX XXX   XXX XXXXX XXX   XXX XXXXX XXX   XXX XXXX X   X
XXX XX   X X X   X X X   X X X   X X X   X X X   X X X   XX XXX
X X XXX XXXX       XXXX XXXX       XXXX XXXX       XXXX XXX X X
  XX       X X   X X       X X   X X       X X   X X       XX  
X XXXX   XXXXX   XXXXX   XXXXX   XXXXX   XXXXX   XXXXX   XXXX X
XX   X   X   X   X   X   X   X   X   X   X   X   X   X   X   XX
XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
```
[TIO link](https://tio.run/##rVdLksQgCN1zCi7Q9@EAPdW73kzN@XuSUiM@0XTytCrlJwjiA4Tfn@fj9f77bM3MlPhk61Rvf9v@nUsaX@/VZB9oapb5fj3fBrv8oktd/26@75Q0znwv9fn@0lJhqcdhzuaJiVRVmmZw193/vCDHkVpce3rEPsuvayBvOnf2U6/F49vpC7gXpuINosMZe6d73iWeyOlugLcB7mWX5EUFOzCwNwPcc5fw13pN1v6uUgH3sktiWIcNCVD@uc@DfDiezuNBQ2cFf7i0mb8jrUSEE39HarEIprG/I600PtPbgQ5wd/ZfSQI70AHuiv5fN8TxwCnjjVtCE9Ux7nAH4nQHd41x9@HU@7867p0dNLIbapk9EBPcO//XIGhEuAO1QGAM7GDwC/xfHf6NHQDuQC1n7n4SEGj5vP7c/a/An7E/3v45/1vl/3fjDx//uPi7Iv4z7w///nHv7@L3/3L@wec/XP61Iv9j8k8@/@Xy70X5/@36g69/uPprQf1H1Z90/cvV3/8), and a [more square spaced-out version](https://tio.run/##zVlLdsMwCNxzCi7Q@3CA9nXXTV/O3@bTNLICjJEdj5RFLEtGIDSA4Pvj/e3z6/RzbqaXnyrlX27Peu0f/X9Z/c5P8/aQ/vlJ7v1ls47X/cevb8T@x1u9eLP3HP9bU9q3S15f129PXTun51CdXdk63vAhjjaSZuAs4@8XM@R5fzKcrqGOcN7K7s3KZRsf96yNd0YivGK9pvju@ZTIHmD8or6v78VaEtHx9W0Az5bju19LrNN4jn8DtsxyfHe9B97VPUOWfevKmeK7X0sK6BxogAKQfQ8/nsme7xvCv9bw7eodn69B/43oylp6Q/4b0RZbjZ8B/43oiiU4wfjXGr5dO@/RWId/reH7ycdF9jLa3yq@I9/j@3dkW6v4TvUvFmgm858VfEcxp@/fNeAb4z@WOaQtFfthqXYH7hZSjZVi/eOYQ4F/R0j19V/7KvPvGuA9xn@O75S2bPXemyIAsux8vfPO/Bx459g6vp3n@bi5/PuxsQ0/ruPFtHPE85y7DP8ex7vDznx/f3Xugp@34eWs5sjXcXKV/DwtL0c9U37@6NoEvy7Dq0nNUI9j1SLZdVhiDfoX).
**How it's made**
You start with a initial crystal (cell) at the center. Then, a new crystal is formed simultaneously at each empty space that touches exactly one existing crystal, looking at the 8 cells orthogonally or diagonally adjacent to it. Crystals remain indefinitely. Here is the snowflake after 3 steps, marking the crystals added at each step.
```
333 333
32   23
3 111 3
  101 
3 111 3
32   23
333 333
```
We continue this for 31 steps, making a 63-by-63 snowflake with 1833 crystals.
This process is the Life-like (totalistic) cellular automaton B1/S012345678, also known as H-trees or Christmas Life.
**Output**
Output or print in any 2D array format with two distinct entries for crystal and empty space, or anything that displays as such. The grid must by exactly 63 by 63, that is having no wasted margin. It's fine to have trailing spaces for non-crystals or jagged arrays truncated to the last crystal in each row. A trailing newline is also OK.
Bit representations are not valid unless they display with two distinct symbols for the bits by default.
---
I also posted this challenge [on Anarchy Golf](http://golf.shinh.org/p.rb?Square%20a%20snowflake). It requires a strict output format of the ASCII art above of `X`'s and spaces.
  
[Answer]
# [MATL](https://github.com/lmendo/MATL), ~~21~~ 19 bytes
```
l31:"TTYat3Y6Z+1=Y|
```
[**Try it online!**](https://tio.run/##y00syfn/P8fY0EopJCQyscQ40ixK29A2sub/fwA)
### Explanation
```
l         % Push 1 (this is the initial 1×1 array)
31:"      % Do 31 times
  TTYa    %   Extend with a frame of zeros in 2D
  t       %   Duplicate
  3Y6     %   Push [1 1 1; 1 0 1; 1 1 1] (8-neighbourhood; predefined literal)
  Z+      %   2D convolution, maintaining size. This gives the number of active
          %   neighbours for each cell
  1=      %   Equal to 1? Element-wise
  Y|      %   Logical OR
          % End (implicit)
          % Display (implicit)
```
[Answer]
# [APL (Dyalog Unicode)](https://www.dyalog.com/), ~~31~~ ~~29~~ 27 [bytes](https://github.com/abrudz/SBCS)
```
(⊢∨1={≢⍸⍵}⌺3 3)⍣≡∘.×⍨32=⍳63
```
[Try it online!](https://tio.run/##AV4Aof9hcGwtZHlhbG9n//8o4oqi4oioMT174omi4o244o21feKMujMgMynijaPiiaHiiJguw5fijagzMj3ijbM2M/9m4oaQ4o2O4oqDwq8z4oaR4o6VU1JD4o6VVEhJU/9m "APL (Dyalog Unicode) – Try It Online")
-4 bytes thanks to @ngn.
A full program that prints a boolean matrix.
### How it works
```
(⊢∨1={≢⍸⍵}⌺3 3)⍣≡∘.×⍨32=⍳63
                     32=⍳63  ⍝ A 63-length vector whose center element is 1
                             ⍝ and the rest is 0
                 ∘.×⍨  ⍝ Outer product self by ×, giving initial state of CA
(             )⍣≡  ⍝ Run the cellular automaton until it stabilizes...
     {≢⍸⍵}⌺3 3     ⍝ Count ones in 3-by-3 subgrids
   1=              ⍝ Test if the 3×3 subgrid has exactly one alive cell
 ⊢∨                ⍝ or the cell is already alive
```
[Answer]
# [Python 2](https://docs.python.org/2/) with scipy, 105 bytes
```
from scipy.signal import*
A=[1],
K=1,1,1
exec"A=convolve2d(A,[K,(1,9,1),K]);A=(A>8)+(A==1)+0;"*31
print A
```
[Try it online!](https://tio.run/##bZDBasMwDIbvfgrhXeLWlLm7bCse@JzLjoMkjKxxGo1ENo7TJU@fNU1gl0kgIfH9P0J@io2j4/wAvY1AQ@cn8AEpgvMRHUF02/yFFyhDKCeGnXdhg9m9Hm7izzu2qvokNsH2jWsrvQJItYQWyf5gFZu/pZjr4Droz7i44IXKFlb/HTM6U4VkqVbylsyO9syNPju6uvZqj1ViZJbKRMkXqYRMC3EyOjFvz2KfGK2V2D@e@O5JsfV@M6@d56T/jZzeg40Ra7QVuCH6IebEWe0CBEAC88q2V3B@@HZICYcPno3FQowLEcT8Cw)
Use convolution to grow the array. The convolution kernel used is:
```
[[1, 1, 1]
 [1, 9, 1]
 [1, 1, 1]]
```
and the criteria for living cell is:
```
c >= 9 or c==1
```
aka when the cell is already living or when there is exactly 1 neighbor.
Note that NumPy by default only prints a summary of a large array, like so:
```
[[1 1 1 ... 1 1 1]
 [1 1 0 ... 0 1 1]
 [1 0 1 ... 1 0 1]
 ...
 [1 0 1 ... 1 0 1]
 [1 1 0 ... 0 1 1]
 [1 1 1 ... 1 1 1]]
```
Thus, I have to call `numpy.set_printoptions` to force Numpy to prints the entire array. This part is not included in the byte count, since I dont't think it's relevant to the actual problem.
This [114 bytes function](https://tio.run/##Fc1BC4MgGIDhe7/iw5OWxGyXLXHguT8wiA6jbHOUypeL@vWueK8PvGGPH@@qlAYzwkhZrVUrOi4bJfiRNJvpiVa9d6ufVlMNVPO24VTwOxeMNx2TWlH9uLGCaqUEKy6S5Fch0cQfOtDZiH6GpbdhLxf7dq8J7Bw8xjxpUOcyGz0Cgj1wnUFA6yIQUn69dZTAk7Rbd4rtFMjSHw) returns the array instead of printing it out, thus circumventing the print option problem. 
[Answer]
# [J](http://jsoftware.com/), 38 34 bytes
```
3 3(1 e.+/,4&{)@,;._3^:31*/~0=i:62
```
[Try it online!](https://tio.run/##y/qvpKeepmBrpaCuoKNgoGAFxLp6Cs5BPm7/jRWMNQwVUvW09XVM1Ko1HXSs9eKN46yMDbX06wxsM63MjP5rcvk56SloYFVZY@VQo@ego2YQZ2WhCdKmo2fIlZqcka@gkPYfAA "J – Try It Online")
*-3 bytes thanks to ngn*
*-1 byte thanks to Bubbler*
[Try it online!](https://tio.run/##y/qvpKeepmBrpaCuoKNgoGAFxLp6Cs5BPm7/jRWMNQwVUvW09XVM1Ko1HXSs9eKN46yMDWO19OsMbDOtzIz@a3L5OekpaGBVWmPlUKPnoKNmEGdloQnSp6NnyJWanJGvoJD2HwA "J – Try It Online")
Core ideas taken from [Bubbler's elegant APL answer](https://codegolf.stackexchange.com/a/204636/15469) -- be sure to upvote him.
This was an experiment to see how close I could get using J, which lack's APL diamond operator and so is at a disadvantage.
Instead, J has [SubArrays](https://code.jsoftware.com/wiki/Vocabulary/semidot3), which requires you to manually add the padding of zeros. I opted here to add all the padding at once, up front: a 125 x 125 matix of zeros with a 1 in the center.
After each iteration, we'll lose 2 from our dimension, so after 31 iterations we'll be down to 63 x 63, which is what we need.
[Answer]
# JavaScript (ES6), ~~149 138 136~~ 135 bytes
Returns a binary matrix.
```
f=k=>k>31?m:f(-~k,m=(k?m:a=[...Array(63)]).map((r=a,y)=>r.map((v,x)=>k?v|!~(g=d=>d--&&g(d)-~~(m[y+~-(d/3)]||0)[x-1+d%3])(9):x*y==961)))
```
[Try it online!](https://tio.run/##LY3BioMwFEV/xS6mea@aOCIUKryU/kXBcRGMShtNJC2iIPl1x6GzPJzLuU81qVftH@ObW6ebbWvJkDQyz65D0QIPJhkIzA6KSiHEzXu1wDnHCsWgRgBPKlmQpP/glMw7mOu0HgJ0pElqzo/HDjTyEGAolzhw0OkeWNdvLGeexforrxAuWMynhehyzhBxq519ub4Rveughc@Zj0hGXjzdwwJjKHwz9qpuIBVpl0T2z7LozkpbIf6vfizbY78 "JavaScript (Node.js) – Try It Online")
### Commented
The same `map()` loops are used to initialize the 63x63 binary matrix `m[]` and to recursively update it. Doing a separate initialization of `m[]` before entering the recursion would cost more bytes.
```
f = k =>                         // f is a recursive function taking a counter k
  k > 31 ?                       // if k is greater than 31:
    m                            //   stop recursion and return m[]
  :                              // else:
    f(                           //   do a recursive call:
      -~k,                       //     increment k
      m = (                      //     update m[]
        k ? m                    //     if this is not the first iteration, use m[]
          : a = [...Array(63)]   //     otherwise, use a vector a[] of 63 entries
      ).map((r = a, y) =>        //     for each row r[] at position y, using a[]
                                 //     as a fallback for the first iteration:
        r.map((v, x) =>          //       for each value v at position x:
          k ?                    //         if this is not the first iteration:
            v | !~(              //           if v is already set, let it set
              g = d =>           //           or use the result of the recursive
                                 //           function g taking a direction d
              d-- &&             //             decrement d; stop if it's zero
              g(d) -             //             recursive call
              ~~(                //             subtract 1 if the cell at ...
                m[y + ~-(d / 3)] //               ... y + dy ...
                || 0             //
              )[x - 1 + d % 3]   //               ... and x + dx is set
            )(9)                 //           initial call to g with d = 9
          :                      //         else (first iteration):
            x * y == 961         //           set the cell iff x = y = 31 (because 31
                                 //           is prime, it's safe to test xy = 31²)
        )                        //       end of inner map()
      )                          //     end of outer map()
    )                            //   end of recursive call
```
[Answer]
# T-SQL, ~~330~~ ~~266~~ 232 bytes
This takes a long time to execute(reason: must be something wrong with the question).
-22 Bytes thanks to @RossPresser
```
SELECT top 3969' 'z,IDENTITY(INT,0,1)i,63x
INTO t FROM sys.messages
WHILE @@ROWCOUNT>0UPDATE
t SET z=1WHERE(SELECT SUM(1*z)FROM t x
WHERE(t.i/x-i/x)/2=0and(t.i%x-i%x)/2=0)=1or i=1984and''=z
SELECT string_agg(z,'')FROM t GROUP BY i/x
```
This will execute in Microsoft SQL Server 2017 or higher. [Try it online](https://dbfiddle.uk/markdown?rdbms=sqlserver_2019&fiddle=c2952fbb43b83592c96ce03106c5f541) on dbfiddle.uk; link is set to use markdown for output so you can see the whole snowflake.
Before execute press ctrl-t for output to text instead of grid. This takes 60 seconds to execute on my computer.
[Answer]
# [Python 2](https://docs.python.org/2/), 125 bytes
```
s="%64c"%10
exec's*=63;s="".join(s[n][(s[n+3967:][:191]*3)[::64].strip()=="X":n!=2015]or"X"for n in range(4032));'*32
print s
```
[Try it online!](https://tio.run/##FcjdCsIgGIDh812FCWPTYPiXMYf3EYgHMazs4FPUg7p6WycvPG/@tlcC0Xu1eNRqxyNnQ/iEfarUarkdGy/vFGGuDrz79yxXfTXeGb5yTyVxxmjll9pKzDOxFt@wgZMVjF98KoceqSBAEVC5wzPMiklByDZRKYZcIjRUe/8B "Python 2 – Try It Online")
This answer is by user "clock" based on hallvabo's solution, on the [Anarchy Golf version of this challenge](http://golf.shinh.org/p.rb?Square%20a%20snowflake) that I submitted. Note that output there is strict and is required to be exactly the picture of X's and spaces to STDOUT via a full program, with only an allowance for a trailing newline.
The most interesting part of this answer, in my opinion, is the concise construction `(s[n+3967:][:191]*3)[::64]` after `s*=63` to get the nine neighbors of the cell counting itself in a flat newline-joined string representing the grid. To check if there's exactly one `X` among them, `.strip()` is called to get rid of whitespace on either side, and the result is checked to equal just `"X"`.
It's interesting how simulating the steps on the string representation of the output directly (rather than an array of bits) not only saves on doing a conversion to characters later but also allows string-specific methods to be used in a golfy way.
Another neat trick, borrowed from hallvabo, is `"%64c"%10` used to initialize `s` to 63 spaces followed by a newline for a line of the initial empty grid. Using the `%c` format, which converts an ASCII value to a character, is shorter than `" "*63+"\n"` or `"%64s"%"\n"`.
[Answer]
# [Wolfram Language (Mathematica)](https://www.wolfram.com/wolframscript/) + my [LifeFind](https://github.com/AlephAlpha/LifeFind) package, 47 bytes
```
<<Life`
Last@CA[{{1}},31,Rule->"B1/S01234568"]&
```
There isn't any living cell with 7 living neighbors in the first 31 steps, so I can golf the rule by 1 byte: `B1/S012345678` -> `B1/S01234568`.
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), ~~38~~ 37 bytes
```
Ｊ³¹¦³¹XＦ³²«ＵＭＫＡXＦ⁶³Ｆ⁶³«Ｊκλ›⁼№ＫＭX¹⁼ＫＫX
```
[Try it online!](https://tio.run/##PYwxC8IwEIXn5FccnS4QhxpwcZJSBKHQwcE11IjStFdj4yL97TGxrcPB4973vuauXUPahnDy3XAmVLkElYs9r92jHzG7ZDHfyAGqrYAPZ5UeCuo63V@xNqY9WItCwsyxH7hTAv4hLtiibiXYBLFZfXRGj8Zh@fTavrAgH59JWRE5s0ol5PEWJrVrIZJq4lMIYfO2Xw "Charcoal – Try It Online") Link is to verbose version of code. Explanation:
```
Ｊ³¹¦³¹X
```
Output the `X` in the centre of the square.
```
Ｆ³²«
```
Grow the snowflake 31 times. (The last loop is just used for its side-effect of replacing the `-`s with `X`s.)
```
ＵＭＫＡX
```
Change all the `-`s to `X`s.
```
Ｆ⁶³Ｆ⁶³«
```
Iterate over the square.
```
Ｊκλ
```
Jump to each position in the square.
```
›⁼№ＫＭX¹⁼ＫＫX
```
If the cell does not yet have an `X` but it has one neighbouring `X` then print a `-`.
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E/wiki/Commands), 31 [bytes](https://github.com/Adriandmen/05AB1E/wiki/Codepage)
```
1¸¸31F0δ.ø¬0*¸.øD2Fε0.øü3O}ø}Θ~
```
05AB1E and matrices are not a good combination.. :/
Outputs as a 63x63 matrix of 0s and 1s for spaces and crystals respectively.
[Try it online.](https://tio.run/##yy9OTMpM/f/f8NCOQzuMDd0Mzm3RO7zj0BoDrUM7gAwXI7dzWw2AjMN7jP1rD@@oPTej7n@s16HdIY8a5kUoPGpY@P@/rm5evm5OYlUlAA) (The footer is to pretty-print it, feel free to remove it to see the actual result.)
**Explanation:**
```
1¸¸            # Start with a matrix containing 1: [[1]]
 31F           # Loop 31 times:
    0δ.ø       #  Surround each row with leading and trailing 0
               #   i.e. [[1,1,1],[1,1,1],[1,1,1]] → [[0,1,1,1,0],[0,1,1,1,0],[0,1,1,1,0]]
    ¬          #  Take the first row (without popping the matrix)
               #   → [0,1,1,1,0]
     0*        #  Multiply each value by 0
               #   → [0,0,0,0,0]
       ¸       #  Wrap it into a list
               #   → [[0,0,0,0,0]]
        .ø     #  And surround the matrix with that row of 0s
               #   i.e. [[0,0,0,0,0],[0,1,1,1,0],[0,1,1,1,0],[0,1,1,1,0],[0,0,0,0,0]]
    D          #  Duplicate it
     2F        #  Loop 2 times:
       ε       #   Map each row to:
        0.ø    #    Surround the row with leading and trailing 0
               #     i.e. [0,1,1,1,0] → [0,0,1,1,1,0,0]
           ü3  #    Create overlapping triplets
               #     → [[0,0,1],[0,1,1],[1,1,1],[1,1,0],[1,0,0]]
             O #    Sum each triplet
               #     → [1,2,3,2,1]
       }ø      #   After the map: transpose/zip; swapping rows/columns
               #    i.e. [[0,0,0,0,0],[1,2,3,2,1],[1,2,3,2,1],[1,2,3,2,1],[0,0,0,0,0]]
               #     → [[0,1,1,1,0],[0,2,2,2,0],[0,3,3,3,0],[0,2,2,2,0],[0,1,1,1,0]]
      }Θ       #  After the inner loop: check for each whether it's 1 (1 if 1; 0 otherwise)
               #   i.e. [[1,2,3,2,1],[2,4,6,4,2],[3,6,9,6,3],[2,4,6,4,2],[1,2,3,2,1]]
               #    → [[1,0,0,0,1],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[1,0,0,0,1]]
        ~      #  Take the bitwise-OR of the values at the same positions in the matrices
               #   → [[1,0,0,0,1],[0,1,1,1,0],[0,1,1,1,0],[0,1,1,1,0],[1,0,0,0,1]]
               # (after the loop, the resulting matrix is output implicitly)
```
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), ~~41~~ 34 bytes
```
ı*Ɱ5I;$Ṗ+)FċⱮẹ1ịƲ;
32×1ıWÇṛ¡’ÆiḞŒṬ
```
[Try it online!](https://tio.run/##AVEArv9qZWxsef//xLEq4rGuNUk7JOG5lispRsSL4rGu4bq5MeG7i8ayOwozMsOXMcSxV8OH4bmbwqHigJnDhmnhuJ7FkuG5rP/CouG7i@KBvlggWf8 "Jelly – Try It Online")
*-7 because to nobody's surprise there's two shorter ways to get \$32+32i\$ than `“ ‘Æị`, the symmetry of the neighborhood lets `+Ɲ` golf to `I`, we can trade two `¤`s and a `€` for `)` and `$`, `ẹ` exists, `œ|` is overkill, and selfing `ċⱮ` is outright superfluous*
This is an absolute mess that could probably be outdone easily by someone with any clue as to how to mimic others' convolution-based approach. Outputs a two-dimensional list of ones and zeros, which are conveniently translated to the example's Xs and spaces by the testing footer provided.
```
ı*Ɱ5I;$Ṗ+)FċⱮẹ1ịƲ;    Monadic helper link: grow a list of complex numbers
         )            For each number:
ı*Ɱ5                  raise the imaginary unit 1j to each power from 1 to 5,
    I;$               prepend the differences between its adjacent elements,
       Ṗ              remove the extra 1j,
        +             and add each to the number.
          F           Flatten the resulting list of lists,
               ịƲ     take the elements at indices
             ẹ1       which are indices of 1 in
           ċⱮ         the list of how many times each element occurs,
                 ;    and append the original list.
32×1ıWÇṛ¡’ÆiḞŒṬ    Niladic main link: generate the snowflake
32                 Set the argument to 32,
  ×1ı              then multiply it by 1+1j
     W             and wrap it in a singleton list.
      Ç ¡          Grow that a number of times equal to
       ṛ ’         the argument minus 1.
          ÆiḞ      Convert the complex numbers to pairs of integers,
             ŒṬ    and interpret the pairs as coordinates of 1s in a 2D array.
```
[Answer]
# [PHP](https://php.net/), 206 bytes
```
for($a[][]=1;++$n<32;){$b=$a;for($i=$n;$i>=-$n;$i--)for($j=$n;$j>=-$n;$j--){$a[$i][$j]=$a[$i][$j]&1;$c=0;for($k=2;--$k>-2;)for($l=2;--$l>-2;)if($k|$l)$c+=$b[$i+$k][$j+$l];1!=$c?:$a[$i][$j]=1;}}var_dump($a);
```
[Try it online!](https://tio.run/##TY9dS8MwFIbv@yuO5TAWSsTOu2XZ8KLCroQpgnRB0o/RpDUtrQpS@9trkg3mTT6e95znJF3VzZtdZ9dT2y9RpiIVPGZRhGZzv2JkxIyjZD5UHA1DteXU75QSj7XH@oK1xaP1oBIpasGvx0XMMOd3Z1fNV4xSrLfUDvGkOZPGE3WyJb/YEMwjjplVRFg7S4SNYPENx3y3/jclZtP0Lfv34uujs78gbC7zqg2P5miSh@d9coCXJ3hNDvvHN1gObf9ZFlCooWvkD1m7qpBBULvAdwf2RaXMK3sBOSwwI2MAcMkzmwM4P@hWGQduQ2cIpvkP "PHP – Try It Online")
Well I'm getting used to horrible PHP answers :D don't blame the language, there are libs for matrixes.. displays an unordered array of 1 and 0, but with proper keys. change the first loop value (32) to generate any size snowflake..
24 bytes could have been saved by removing `$a[$i][$j]=$a[$i][$j]&1;` if we only needed the truthy values.
[Answer]
# [Python 2](https://docs.python.org/2/), ~~146~~ 130 bytes
Prints a 2d-list of booleans.
```
R=range(63)
for i in R:m=[[i>0==(x*y-961)*0**m[y][x]*~-sum(sum(k[x+x%~x:x+2])for k in m[y+y%~y:y+2])for x in R]for y in R]
print m
```
[Try it online!](https://tio.run/##RY3NCsIwEITveYq9lPyUSq0gGIgP0ZMQcvDgTyxJS62we@mrx6aiHpYZhtlvBprufWxSas14jreL2O8ku/YjePARWh2Mtf5YGyNQUXXYb6WqlQqWnEWn5ur5CiJfZ7HEYkaNZeNkBnQZsBRLKmbS9I1x5bps6WPZMPo4QUirsv@vZrBGnG8evY@Cw4kvq/DDdDK9AQ "Python 2 – Try It Online")
[Answer]
# [R](https://www.r-project.org/), ~~144~~ ~~122~~ 118 bytes
```
m=matrix(!-2112:2112,65)
for(k in 1:31){l=m;for(i in 67:4159)if(sum(l[i+-3:5%/%3+-1:1*65][-5])==1)m[i]=1}
m[2:64,2:64]
```
[Try it online!](https://tio.run/##FchLCsMgEADQfU6RLgLaZCij0dIpnkRcZBMY6iRgW@iHnt3i5i1eqVWCLI/CL3UAg2ioMXmnu3Uv6tbz1iNZ1N8c5NqKW/kzzegumld1f4rKkUew5IbTYEdAwqN3KYJLOgTUEjkF/HUSDfl5aqRaK8C2Q14@7z8 "R – Try It Online")
My first code golf attempt (except for secret ones that I never dared to post...), so nothing really clever going on, I'm afraid...
*Edit 1: -4 bytes to remove useless variable definition*
*Edit 2: thanks to Giuseppe: -18 bytes!*
*Edit 3: thanks **again** to Giuseppe: -4 more bytes* 
[Answer]
# [Java (JDK)](http://jdk.java.net/), 243 bytes
```
v->{int N=63,K=N*N,g[][]=new int[N][N],w[]=new int[K],i=31,x,c,y;for(g[i][i]=1;i-->0;){for(x=K;x-->0;w[x]=c==1?x+1:0)for(c=0,y=K;y-->0;)if(g[y%N][y/N]>0&(Math.abs(x%N-y%N)|Math.abs(x/N-y/N))<2)c++;for(int z:w)if(z-->0)g[z%N][z/N]=1;}return g;}
```
[Try it online!](https://tio.run/##ZVCxboMwFNzzFW9JZSfGIUHNEGqqLl2islTqghhcAtQpGGRMAqT59tQmqVqpki3r3d2793x7fuDOfvd5EWVdKQ17U9NWi4LO/Mk/LGtlokUlLZkUvGnghQsJpwlA3b4XIoFGc22eQyV2UBoOvWolZB7FwFXe4FEK8HzzeXgzOiKkjuIoDiBjl4MTnEwNIVt7ZMvCWUhySzKZHsEKw9gccvyDbGMimLckHUlI72eVQnkkYnPY0heOE7g@Plm0Y1u/G@tj1MUsYWz52M2XGxdbNmEu6Y2iv3aIzLj0UzOtX4Rx4N6hF64/KH9vUDcNHcPgr19kYZBFiPHDCifz@biD/cSwOVqjwVriPBqs3WDszGJnlepWScj988UfMzlwBR3LKK/rokeyLQp8JaybJQsh0w10PxkCvPaNTktatZrWJmRdSGQzuSaOnpTifUMbrVJeItuMaclrs00wzO7Xc2@Fqa5GFcLEJWsP3waeJ/aeL98 "Java (JDK) – Try It Online")
## Explanations
Basically, the algorithm is to fill two grids by consecutive merges to keep the data from being changed at runtime. For each square, we check if there are neighbours set (using a second full loop instead of a smaller 1-square distance to avoid byte-costly constraints). If there's exactly one neighbour, the square is added to the writing (to-be-merged) grid. Then when all the computation is done, the writing-grid is merged to the main grid. When all the 31 loops are done, the resulting grid is returned.
```
v->{
  int N=63,
      K=N*N,
      g[][]=new int[N][N],          // the grid and return-value, we read from it
      w[]=new int[K],               // the temp array to write in
      i=31,                         // the main iterator to expand the snowflakes
      x,c,y;                        // x the position being tested, c the count of neighbours, y the neighbour candidates
  for(    g[i][i]=1;                // Init the snowflake in its center
          i-->0;                    // Expand the snowflake 31 times
    ){
    for(    x=K;                     // init x to match all the positions
            x-->0;                   // For each position
            w[x]=c==1?x+1:0          // If the counter is exactly 1,
                                     // set x as a position that's not empty.
                                     // and store x+1 instead of 1 or x to ease the merge operation
                                     // and leave 0 as a default value
       )
      for(c=0,y=K;y-->0;)            // Reset the count and loop through all squares again
        if(  g[y%N][y/N]>0           // if y is set
            &( Math.abs(x%N-y%N)     // and if x and y are neighbours
              |Math.abs(x/N-y/N))<2
          )
          c++;                       // Then increase the neighbour-count.
    for(int z:w)                     // For each value to be merged
      if(z-->0)                      // which is +1'd and non default
        g[z%N][z/N]=1;               // Then place it in the grid.
  }
  return g;                          // Return the grid
}
```
[Answer]
# [C (gcc)](https://gcc.gnu.org/), ~~207~~ ~~206~~ 192 bytes
-1 -14 bytes thanks to ceilingcat!
```
#define F(x)for(x=64;--x;
#define z M[r][c]
M[65][65]={[32][32]=32},r,c,i=32,x;main(s){for(;--i;)F(r))F(c)z=s-!z?z:i)for(s=0,x=-9;x++;)s+=M[x/3-~r][x%3-~c]>i;F(r)puts(""))F(c))putchar(33-!z);}
```
[Try it online!](https://tio.run/##NY3BCsIwEETv/YpaERKaoDRa0BC99dYvCDmUtdUcrJIohJT66zFRPMzsLsO@AXoBCGF57gc99nmDHB7uBjlRbzmljmf/xOetNEqCylpZ71SSmCSrVJJg1UwMAaLjRhy/dXpEFk8JFTGa4wYZHA2wF5Yu/Mkf9LfIig1xgu65K0uObSla6daMvmOVW8UJ6qh5en68nhYVxQ@SLrh2BjEWYZjPIXwA "C (gcc) – Try It Online")
To avoid having to use two tables (one for current iteration and one for the next), each new crystal is written using the current iteration number, instead of just using 1. This allows for ignoring any crystals from the current iteration when counting neighbours.
A lot of the counting is done backwards for golfing reasons, including the iteration number, which is why we seed the table with 32 in the middle.
The table is made too large so as to have padding, allowing us to count neighbours without having to care about edge-cases.
A more elegant solution is bound to exist. This many loops is hardly ever a good sign.
```
#define F(x)for(x=64;--x;       To make recurring loops more compact.
                                Goes from 63 down to 1, to skip padding in table.
M[65][65]={[32][32]=32},        Make padded table seeded with first crystal.
r,c,i=32,x,y;main(s){           Misc variables; i holds iteration.
for(;--i;)F(r))F(c)             Loop through table for each iteration.
s==!M[r][c]?M[r][c]=i:0)        Update current cell according to neighbour count
                                found in loop below. We only update if cell is empty
                                (M[r][c] == 0) and if s == 1, combined as shown.
for(s=0,x=r-2;x++<=r;)          Go through 3x3 grid with current cell in center.
for(y=c-2;y++<=c;)
s+=M[x][y]>i;                   If a cell contains a crystal NOT from current gen,
                                increase our neighbour count.
F(r)puts(""))F(c))              Output loop
putchar(33-!M[r][c]);}          Make any non-zero cell a exclamation mark; space otherwise
```
[Answer]
# [JavaScript (V8)](https://v8.dev/), 465 bytes
```
[w=1414812756,269488144,357569872,285212944,22304e3,286265616,353718608,69648,1414856704,269553680,357650768,17830160,1426150656,286327056,1364280656,0,w,1343229968,1162876240,83886352,1146377472,1414533392,1078284624,327680,1078219860,1414811664,1145062736,89392384,1141130324,1427395664,1073758277,5].map(e=>(Array(32).fill().map(l=>(c.push(1&e?"X":" "),e>>=1),c=[]),c.slice(1).reverse``.concat(c)),o=e=>console.log(e.join``)||e).map(o).reverse``.slice(1).map(o);
```
[Try it online!](https://tio.run/##TU/vSsNADH8V2Qdp4SyX5C7JKZ34FsIYrJSbbtR1tHND2LvPtAPxy5H8/ub2zbkZ22F3PD2d9batb6tLDQGCAkpkh5yCKoTgKNqeVNChRgRMhiGSD5kMYeTIwKYiAWWvjhMHdXNUZPFhioqRWP0UxdELGy1KHtibDhmi56lSmVC8TUAcUGfQu4utgRBTmnzAqMIYvFNSM0Q0LDCJBLtwao1ElGz0oqjBpM5Sp/YZgaRz6/RRYA6T2@pRiJ0mM5LOGAB5Mq/dJ5TirPRCEhVFXFxXX82xyPWyeBuG5qcgLKvtruuKciY6I9rq@D1@FvCYXxfvi@fFw6J0ebmsoXRtvVrbW43drs0FlNWQz3kY82ZTtf2hbU5FW5aury3f9rHvctX1H0Wu9v3usNmU12u@9/T/rX9pd@bldvsF "JavaScript (V8) – Try It Online")
]