[Question]
  [
**TLDR: This is the hexagonal version of [Is this square symmetrical?](https://codegolf.stackexchange.com/q/90214/9288)**
Given a hexagonal grid, decide if it is symmetric.
The shape of the grid is a regular hexagon. Each cell in the grid has two possible states.
Let's only consider reflections and rotations. Here are all the possible symmetries:
* Reflection symmetry, where the axis is the perpendicular bisector of an edge (there are 3 possible such axes):
[![enter image description here](https://i.stack.imgur.com/tKIzX.png)](https://i.stack.imgur.com/tKIzX.png)
[![enter image description here](https://i.stack.imgur.com/CPn3T.png)](https://i.stack.imgur.com/CPn3T.png)
[![enter image description here](https://i.stack.imgur.com/cWZGR.png)](https://i.stack.imgur.com/cWZGR.png)
Smaller examples in ASCII art:
```
   . . . .         . . * .         * . * .
  . * . * .       * . * * .       . . . . *
 * . . . . *     * * . . . .     . * . . . .
* * . . . * *   * * * * . * .   * . . . . . *
 . . * * . .     . * * . * *     . . . . * .
  . . * . .       . * * . .       * . . . .
   * . . *         * * * .         . * . *
```
* Reflection symmetry, where the axis is a diagonal (there are 3 possible such axes):
[![enter image description here](https://i.stack.imgur.com/5h5sP.png)](https://i.stack.imgur.com/5h5sP.png)
[![enter image description here](https://i.stack.imgur.com/bYBLh.png)](https://i.stack.imgur.com/bYBLh.png)
[![enter image description here](https://i.stack.imgur.com/wJv2t.png)](https://i.stack.imgur.com/wJv2t.png)
Smaller examples in ASCII art:
```
   * . * *         . . * *         * * . *
  * * . * .       . * . * .       . * . . .
 . . . . . .     * . . . . .     * . . . . *
* . . . . . .   * * . . . * .   * * . * . * *
 . . . . . .     . . . . * *     . . . . . .
  * * . * .       . * * . .       . . . * *
   * . * *         . * . .         * . . *
```
* 60° rotational symmetry:
[![enter image description here](https://i.stack.imgur.com/AnCez.png)](https://i.stack.imgur.com/AnCez.png)
A smaller example in ASCII art:
```
   * * . *
  . * . * *
 * . . . . .
* * . * . * *
 . . . . . *
  * * . * .
   * . * *
```
* 120° rotational symmetry:
[![enter image description here](https://i.stack.imgur.com/Vbw1f.png)](https://i.stack.imgur.com/Vbw1f.png)
A smaller example in ASCII art:
```
   * . . .
  . . * . *
 * . . . . .
. . . . . . *
 . * . . * .
  . . . . .
   * . * .
```
* 180° rotational symmetry:
[![enter image description here](https://i.stack.imgur.com/Ei9UE.png)](https://i.stack.imgur.com/Ei9UE.png)
A smaller example in ASCII art:
```
   . . . .
  * . * . .
 . . * * . .
* . . . . . *
 . . * * . .
  . . * . *
   . . . .
```
### Input
A hexagonal grid, in any reasonable format. You may choose the two distinct values for the two states in the input. When taking input as an 2d array, you may use one of the two states or a third value for padding.
Some example inputs (Taken from [Bubbler's HexaGoL challenge](https://codegolf.stackexchange.com/q/240238/9288)):
* ASCII art:
```
  . . . 
 * . . * 
* . * * * 
 * * * . 
  * . . 
```
* List of rows:
```
[[0, 0, 0],
 [1, 0, 0, 1],
 [1, 0, 1, 1, 1],
 [1, 1, 1, 0],
 [1, 0, 0]]
```
* 2d array, skewed to the right (with zero padding):
```
[[0, 0, 0, 0, 0],
 [0, 1, 0, 0, 1],
 [1, 0, 1, 1, 1],
 [1, 1, 1, 0, 0],
 [1, 0, 0, 0, 0]]
```
* 2d array, skewed to the left (with `2`'s as padding):
```
[[0, 0, 0, 2, 2],
 [1, 0, 0, 1, 2],
 [1, 0, 1, 1, 1],
 [2, 1, 1, 1, 0],
 [2, 2, 1, 0, 0]]
```
* Flatten array, with an integer that indicates the size:
```
3, [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
```
### Output
A value representing whether the hexagonal grid is symmetric. You can choose to
* output truthy/falsy using your language's convention (swapping is allowed), or
* use two distinct, fixed values to represent true (affirmative) or false (negative) respectively.
This is [code-golf](/questions/tagged/code-golf "show questions tagged 'code-golf'"), so the shortest code in bytes wins.
### Testcases
Here I use 2d arrays skewed to the left with zero padding.
**Truthy:**
```
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 1, 0], [0, 1, 1]]
[[1, 1, 1, 0, 0], [1, 0, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 1]]
[[1, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 0, 1, 1, 1], [0, 1, 0, 1, 0], [0, 0, 1, 0, 1]]
[[1, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 1, 1, 1, 1], [0, 1, 1, 0, 1], [0, 0, 1, 1, 1]]
[[1, 1, 1, 1, 0, 0, 0], [1, 0, 1, 0, 1, 0, 0], [1, 0, 0, 1, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1], [0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 1, 0, 1], [0, 0, 0, 1, 1, 1, 1]]
```
**Falsy:**
```
[[1, 0, 0], [0, 0, 0], [0, 1, 1]]
[[0, 1, 0], [1, 0, 1], [0, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [1, 0, 1, 1, 1], [0, 1, 0, 1, 0], [0, 0, 1, 0, 1]]
[[0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0], [1, 1, 0, 0, 0], [1, 0, 1, 1, 1], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0]]
[[1, 0, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0], [0, 1, 0, 1, 0, 0, 1], [0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0]]
```
  
[Answer]
# [Python](https://www.python.org) NumPy, 92 bytes (@Neil)
```
def f(l,*o):
 for a in[l>0]*6:l.T[::-1][a[::-1]]=l[a];o+=str(l),str(l.T)
 return 7>len({*o})
```
[Attempt This Online!](https://ato.pxeger.com/run?1=nVTBbqMwEFXVG_-w0jS92ClJ8R7aioretl-QG-VgNSZYdQyyTaOo2i_pJZfuP20_YL9jAZcQA2mlIiSPx-M3894MvP4ptibL5W73Vpp0dvP3YclSSJHwpzkOPUhzBRS4jMVdkEyvQjFfxGE4I0lM7ZpEIqbJbX4RaaOQwH6zzBfYA8VMqSRc3wkm0cs0_41tjveTH3xd5MqALNfFFqgGWXibjAsGSIcRl0VpEMZn0eSXXE6qKoCnoOfaUGX0hpsMTeJJXV31aIiq23OqFN0i9kwF0hg3J-fwqBg1DNbUPGZcripDPzVH1F4yigtk1xLpKNL-DNW1anx5-RNj_3DTQmZUrhikKl-DYKkB_cQ2bAkmB8VXWbtvolmVRVfifNQ5jSCw5l67KoBdkMZZKC4NSuvqrUq799N_C1WabBt6XhwHPtRv4sOYmQwiiGOSJoJYu4v7MLtost_VdzokxxG0MHvUwEHtzvuopI9KHB5t3g51QJUMmPVRyRe1OiKM0T4iT5_OmDJk3N07OXC7HBLPu6dC24aTPvVBO4d9OzISn4j4ndY45B0uB8KRkbyBk-bgymitx7v0Ra2twxnOAVR_FAYT1J-04w0f0zj4TIKOt1f94ez3_h8)
## Pure (no NumPy) [Python](https://www.python.org) version, 111 bytes
```
lambda l:7>len({l:=((x:=~len(l)//2)and(*(k[(x:=x+1):]+k[:x]for k in i*l[::-1]),)or(*zip(*l),))for i in[0,1]*6})
```
[Attempt This Online!](https://ato.pxeger.com/run?1=nVTBjtMwEBXilq8YysVO092YA6BI4QZfwC3kYLZOY8VxItuhLQh-hMtKCP6J_YD9Dpyk2dRJuishRc3MeOaN35tJf_6pjyav5O2vLP70uzHZ5u3fStDy85aCiN68E0yibyKKETpE8Y_WE_j6-hWmcot8VCRt-LAmOErXRRId0qxSUACXwH2RRNGGpDjAlUL-V14jX1gHtyncpiRhQFL_9Xfct717tuFlXSkDsinrI1ANsvb2ORcMkI5iLuvGIIxfxKv3cruKPACegb7Shiqj99zkaJWscBsH0BDb6iuqFD0i9oUKpDHuTl7CjWLUMCipucm53FlDF90R7YuM4gL17wbpONbBBrXEdUccB-fOAJlTuWOQqaoEwTIDumB7tgVTgeK7fPC7bGa76ISmp3v6MYS9mdBesNQmsDXpgrXi0qAMnfTrfiwTq-JJtdu75_cfVWPyY-R5iZUU2icNYMlMZxnEMUmXQXp7zDuZYzZ58NqaEckJhAPMA2rooI7nU1QyRSUOj6HviDqjSmbMpqjkibs6IizRviDPlM6SMmQ5PDk5C7scUs_7QIXuB06m1GfjnM_twko8IuL_jMYh73A5E44s9A2dNmcli3e9PKUn7joEnOWcQU1XYbZB0027PPAljcPHJBh5e_Yfr__e_wE)
#### Old [Python](https://www.python.org), 128 bytes
```
def f(*l):
 for n in[len(*l)//2]*6:l+=(k:=(*(j[i:]+j[:i]for i,j in enumerate(l[-1][::-1],-n)),)),(*zip(*k),)
 return 7>len({*l})
```
[Attempt This Online!](https://ato.pxeger.com/run?1=nVTBjpswEFW1N75iNr0YAru4h-4Kid7aL-jN4mBtTHDiGGSbjdKqUv-jl1zaf-p-QL-jBsISA9mVFiEYj8dv5r0Z-PWnOpiilMfj79rk0f3fnyuWQ44C4Sce5KUCCVwSwWTjur39kAUfE7FM0TZJUYA2hCfZckMSnjWxPNzYaGCy3jFFDUOCRDgjSWKfYSR9P7Q3Cr7xCgVbu_BAMVMrCXefmgzfA_HD7-p4ehfxXVUqAxarOgDVICtvX3DBAOkk5bKqDfL963TxWa4WtlbgOegbbagyes9NgRZk0XCwl4bUnr6hStEDYo9UIO377c57eFDMFgo7ah4KLtfW0Nt2i3aHjOICde8a6TTVYYSaWnUjRsPmbNFDFlSuGeSq3IFguQG9ZXu2AlOC4uuiX7fRzGbRhGanOoMU4s4ktJMtswFsiVtnpbg0KEcnBduHbkU9qXZ8uvr3VdWmOCSeR0gcQnNnIcyZ2SQCOyZuI3BnD3Enc4jGz6vmzIDkOOIe5hk1dlCH_TEqHqNih0efd0CdUMUTZmNU_EqtjghztC_IM6Yzpwyed492ztwuh8zzvlChu4bjMfVJO6d9uzASL4j4ltY45B0uZ8Lhmbyxk-bsyGytl7v0Sq29wxnOCdR4FCYTNJ60yw2f0zh-SYKBt2f_eN33_h8)
#### Old [Python](https://www.python.org) NumPy, 93 bytes
```
def f(l,*o):
 for a in[l>0]*6:l.T[::-1][a[::-1]]=l[a];o+=str(l),str(l.T)
 return 12>len({*o})
```
[Attempt This Online!](https://ato.pxeger.com/run?1=nVTBbqMwEFXVG_9QaZpe7JSkOIeqoqK37RfkhjhYjQlWHINs0yha7ZfsJZfdf9p-wH5HAZcQA2mlIiSPx-M3894M_P5b7E2Wy8PhT2nS2cO_ZMVSSJHwpzkOPUhzBRS4jMVTkEzvQzFfxmE4I0lM7ZpEIqbJY34baaOQwH6zzJfYA8VMqSSQxZNgEv2c5r-wTfJ2ccW3Ra4MyHJb7IFqkIW3y7hggHQYcVmUBmF8HU1-yNWkKgN4CnquDVVG77jJ0CSe1OVVj4aouj2nStE9Yq9UII1xc3IDL4pRw2BLzUvG5boy9KY5ovaSUVwgu5ZIR5H2Z6iuVeO7uwXG_ummhcyoXDNIVb4FwVIDesN2bAUmB8XXWbtvolmVRVfqfNQ5jSCw5lG8KoDdksZZKC4NSuvqrUqHt8v_S1WabB96XhwHPtRv4sOYmQwiiGOSJoJYu4v7MLtoctzVdzokxxG0MEfUwEHtzvuopI9KHB5t3g51QJUMmPVRyRe1OiKM0T4jT5_OmDJk3N07OXG7HBLPe6ZC24aTPvVBO4d9OzMSn4j4ndY45B0uJ8KRkbyBk-bkymit57v0Ra2twxnOAVR_FAYT1J-08w0f0zj4TIKOt1f94ez3_g4)
#### Old [Python](https://www.python.org) NumPy, 97 bytes
```
def f(l):
 o={0}
 for a in[l>0]*6:l[::-1][a[::-1]]=l[a];o|={str(l),str(l:=l.T)}
 return 13>len(o)
```
[Attempt This Online!](https://ato.pxeger.com/run?1=nVRBbtswEETRm_5QYOtcyFR2xAYoChXMrX1BboIORExZRGhKIKkaRtqX9OJL-6fmAX1HKTGyTElOgBgGuFzuzu7Mrv3rT723ZaUOh9-NLZaf_7I1L6BAEqcRVPQh-RlBUWlgIFQmb5L88lMqszRdkjxj_sypzFj-pfpBH4zVLjPujpTK1S126ZrbRisg1zeSK1RhX-jxzTuxrSttQTXbeg_MgKqjXSkkB2RSKlTdWITxe7r4qtYL1w2IAszKWKat2QlbokW2aLt0HwPUZa-Y1myP-HcmkcG4e7mAO82Z5bBl9q4UauMMc989MZ9ktZDInw0ylJp4idpGDb66-ohxfHrpIUumNhwKXW1B8sKCuec7vgZbgRabsr930dxVMU6fpz4vKSTePMrnAvgH0jlrLZRFRdu9V-nw-PbfrW5suU-jKMuSGNpvHsOcmU8iSGCSLoJ4e4h7Modocry1OQNS4Eh6mCNqEqAO72NUMkYlAY--7oA6oUomzMao5IVeAxHmaJ-RZ0xnThky7x69nLhDDnkUfWPS-IGTMfXJOKdzO7MSz4j4mtEE5AMuJ8KRmbpJUOYkZbbX81N6odfeESznBGq8CpMNGm_a-YHPaZw8J8HAO3L_cP73_h8)
#### Old [Python](https://www.python.org) NumPy, 111 bytes
```
def f(l):a=l>0;b=l*0;l=l[a];b[a]=range(len(l));return 12>len({str(l:=l[s])for s in[b.T[a],b[::-1][a[::-1]]]*6})
```
[Attempt This Online!](https://ato.pxeger.com/run?1=nVRBbtswEETRm_5QYOteSEd2xByKQgZza1-Qm6ADHVMWEZoSSCqGUeQlufjS_ql5QN9RSoosU5IToIAgLZe7szuzaz__Lg82L9Tx-Kuy2eLbn2LDM8iQxDGj8jZaramcRytJZcLS1dq9qGZqy5HkygXhlea20grIzW3t-WmsRjJ20SbFWaHBgFDJennnEsN1EscLkias_abp_OsTbsu-fPgkdmWhLahqVx6AGVBlsM-F5IBMTIUqK4sw_kxn39VmFgcAIgOzNJZpa_bC5miWzHDtB1eTuuwl05odEH9kEhmMm5svcK85sxx2zN7nQm2dYR6aK9YmWS0kar8VMpSacNFQNfj6-gbj8PzQQea1IJDpYgeSZxbMA9_zDdgCtNjm3bmJ5q6KcVq89jmnELXmSRQXwK9I4yy1UBZldfetSseXj3_vdGXzQxwESRKFUD9pCFNmOoognkmaCNLafdyr2UeT06nO6ZE8R9TBnFAjD7W_H6KSISrxeHR1e9QRVTJiNkQl7_TqiTBF-4I8QzpTypBp9-DmzO1zSIPgB5OmHTgZUh-Nczy3Cyvxhoj_MxqPvMflTDgyUTfyypylTPZ6eUrv9No5vOUcQQ1XYbRBw027PPApjaO3JOh5B-4frv29_wM)
Takes right-skewed zero-padded input with values 1 and 2.
Generates the 12 possible symmetries from two relatively easy to implement reflections, viz. updown and matrix transpose. As their axes subtend an angle of 30° their composition is a 60° rotation. We can therefore apply them alternately and then count the number of distinct patterns.
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), ~~61~~ 58 bytes
```
ＷＳ⊞υ⪪ι¹≔⟦⟧θＦ⁶Ｆ²«⊞θ⭆υ⪫λωＵＭυ⎇κ⮌λＥ✂υ⁺⊘Ｌυμ±⁻⊘⊕×³Ｌυμ±¹⊟ν»⊙θ⊖№θι
```
[Try it online!](https://tio.run/##RU/NasMwDD43T6GjXLxAN9hlp9Id1rGOsPQ2djCpmpg5cuo4LWXs2TM5hcXGlvz9IVeNCZU3bhwvjXUEuOVuiGUMlmtUCoqhb3DQUHbORrQaVko9Zeu@tzXj55eGkzyPPgA@KpjqvYKfbDH5TuKbknamSyGv3jI6DReVQhaCbnzbGj4kck@BTbjit4YPOlPoCZ3SkKylsxUlTeGGHl@MO9MB34jrKLMpEbVy3qk2kXBnedZsuQrUEkfp97alHh80zMabdfauUl/4DllNE/5mhUwfcc3X9JdnmtM2fhBCQDtJx3EpK1vmsuWeS34D838uyca7s/sD "Charcoal – Try It Online") Link is to verbose version of code. Takes input as newline-terminated ASCII art but without any spaces and outputs a Charcoal boolean, i.e. `-` for symmetric, nothing if not. Explanation:
```
ＷＳ⊞υ⪪ι¹
```
Input the list of rows.
```
≔⟦⟧θ
```
Start building up the list of rows and reflection.
```
Ｆ⁶Ｆ²«
```
Loop through six rotations and two reflections. (Probably overkill, but I can't make it any shorter by performing less work.)
```
⊞θ⭆υ⪫λω
```
Save the current hexagon to the list.
```
ＵＭυ⎇κ
```
Modify the hexagon in-place, alternating between either...
```
⮌λ
```
... reflecting it along the T-B bisector, or...
```
Ｅ✂υ⁺⊘Ｌυμ±⁻⊘⊕×³Ｌυμ±¹⊟ν
```
... reflecting it along the BL-TR diagonal. Since the combination of these two reflections is a 60° rotation, this eventually covers all possible symmetries.
```
»⊙θ⊖№θι
```
Check the list for duplicates.
The BL-TR diagonal reflection is obtained by taking slices of the hexagon, starting from just the top half, extending each row until the whole hexagon is covered, then shrinking until the last row takes the bottom half of the hexagon. The last character of each row is removed and these characters form the new row of the hexagon.
Previous 61-byte canvas based version:
```
ＷＳ⊞υι≔⟦⟧θＦ³«ＦＬυ«Ｍ✳⁻ι⊗⊕‹⊗κＬυＰ✳⊖ι§υκ»Ｆ²«⊞θ⪫ＫＡω‖»⎚»Ｆ✂θ⊞θ⮌ι⊙θ⊖№θι
```
[Try it online!](https://tio.run/##TVBNb8IwDD3TX5Gjg7oetmNPFb2AQKrgOO3QFUOjZgnNR9k08ds7J4WVREpsP/v52U1bm0bXchyvrZDIYK0u3h2cEeoMnLPK2xZ8ygTPk8JacVbw/pGyntyTNgzeOPtNFtHcojo7SuYxtNjpAaEUBhsntIKdUN6CSFmp/afEIzVqDH6hcmRv0Vp4AB1P2cwVTx74vHTiQrrcE2uJM4ngVFi4tTrid5DcxbrbXd3rpCrO06dso4WCCrErpASqu05N9niSRA33ypXE2gTnNk17kKJB6B97IZ49DmgshuZ5UkV1hfoJyLO0lfYE9GGNYZpxXNJJlhldeucvm4LZPxbSxpdB/gE "Charcoal – Try It Online") Link is to verbose version of code. Takes input as newline-terminated ASCII art but without any spaces and outputs a Charcoal boolean, i.e. `-` for symmetric, nothing if not. Explanation:
```
ＷＳ⊞υι
```
Input the ASCII art.
```
≔⟦⟧θ
```
Start building up the list of rotations and reflections.
```
Ｆ³«
```
Loop through the rotations of -60°, 0° and 60°.
```
ＦＬυ«
```
Loop though each line of the ASCII art.
```
Ｍ✳⁻ι⊗⊕‹⊗κＬυ
```
Move along the edge of the hexagon.
```
Ｐ✳⊖ι§υκ
```
Output the line of ASCII art.
```
»Ｆ²«
```
Loop through each reflection.
```
⊞θ⪫ＫＡω
```
Serialise the ASCII art back to text and join all of the lines together.
```
‖
```
Reflect the ASCII art horizontally.
```
»⎚
```
Clear the canvas ready for the next rotation.
```
»Ｆ✂θ⊞θ⮌ι
```
Append the 180° rotations of the above rotations and reflections to the list.
```
⊙θ⊖№θι
```
Check the list for duplicates.
Here's a 73 byte modification that takes (spaced) ASCII art as input and outputs all 12 rotations and reflections as ASCII art:
```
ＷＳ⊞υ⁻ι ≔⟦⟧θＦ³«ＦＬυ«Ｐ✳⊖ι⪫§υκ… ¬⊖ι¿‹⊗⊕κＬυＭ⊕¬ι✳⁺⁴÷×³ι²Ｍ⊕‹¹ι✳⁻⁻ι¬ι²»Ｆ²«Ｄ‖Ｄ‖↓»⎚
```
[Try it online!](https://tio.run/##ZZBNT8JAEIbP7a@YcJo11UTwpCdCLzViiHozHrAMdMKyW7u7oDH89rrbQguSpul8Pu/byYt5leu5rOtdwZIAM1U6@2orVisUAmbOFOgSmLJyBjmBAQyEeIjHxvBK4ftHAl8@XeoKcCTgN46a8InUyvpF0ZSiqZOWS8@0mHJFuWWtMKW8og0pSwtkIRJ41KxwbDO1oO@gufa1yU8uaVLoEr1wAs/a/t8TwU4U8TKoGoOpdp/StzLVj60D/sTTVG/pbCBwGw@9vZn0P3yXQKZsylteEL7xhgyOEmA/ODwKkzR0CWys3IbRM2h7xu6Yneywhe0P5xu2Z0vdpsRG5IWW0iPa5LJ8n@qdOgAmkuZVaO/rGgCu2icO0U37xs3nmPRx1@qS050eVV9v5R8 "Charcoal – Try It Online") Link is to verbose version of code. Output is in the following order:
* Rotate 60° clockwise
* Reflect along TL-BR diagonal
* Rotate 120° anticlockwise
* Reflect along BR-TL bisector
* Rotate 0°
* Reflect along T-B bisector
* Rotate 180°
* Reflect along L-R diagonal
* Rotate 60° anticlockwise
* Reflect along BR-TL diagonal
* Rotate 120° clockwise
* Reflect along TL-BR bisector
[Answer]
# [Python 3.8 (pre-release)](https://docs.python.org/3.8/), 137 bytes
```
g=lambda h:(*[".".join(r.split(".")[::-1])for r in h],)
f=lambda h,*S:len(S)<8>0<f(g(map("".join,zip(*(t:=h[::-1])))),h,g(t),*S)or h in S
```
[Try it online!](https://tio.run/##nVPbjpswFHz3VxylD2tnCYvblxVa@g2V8ohQ5TYGuyLGMk7T7c@ntgkh3JqqKFLsc5kzMxz0uxWN@vSqzeVSZTU7fjswECne5pt4E/9opMImbnUtLXYBkqfpjhakbAwYkApEERFU3vqi7T6tucJ78vb6OXkrcYWPTONNhxT9lhpvsU0zccVxTySiClviOokDFR50f5FH3RgL7XuL/KhaKu4T7h639iBVikCWIezuzNj2LK3AT9kTcRnQRiqLfZa42/dGWalOHAECw85fBWTAf7K6L2jlgbsQ9rxDnsAzUPLy8hEh@ABfDNfM@PH6ZBH47rxA4GlJz8kwVXHsQcJs05xdxVVwEN9aEwXcXBZ56gufpVPuhjhDt6FzJ3fUUxUx05qrA3YoZHFGBAPN@3keSe4COA3QawT6otRRmE/06uxJ1xwL4v3y8p2XnXgQ/BerGtUR84P9AqSd211/dyZo6DS8PdXOt@7fwZcB@toUgkPfJc@TCPyviGDpWKBpBR0daaig3Xmoux6Hanq7@Z4BaRRIepgbajJCHfJTVDpFpSMd/dwBdSaVzpRNUekDriMTlmSv2DOVs@QMXQ5PMnfhsYYCZf/wDObMl@EmdP5OV9blLwb/z2tLFpYhmXpNF@YmozF3LYtc19/gA659YLS4dAF79q2Mtmu6hevLkKxqfRAu/gA "Python 3.8 (pre-release) – Try It Online")
The function `f` takes in a tuple of strings representing a left-skewed hexagon. Returns `True` if the hexagon is symmetric, or `False` otherwise.
# Explanation
At each iteration, adds the current hexagon and its vertical flip to the list `S`. Then rotates the hexagon by 60 degrees clockwise, and repeats. Stops when we finds a duplicate hexagon (symmetric), or if `S` gets too big (not symmetric).
#### Skew helper
`g` is a helper function that converts a right-skewed hexagon to a left-skewed one:
```
..ABC      ABC..
.DEFG      DEFG.
HIJKL  ->  HIJKL
MNOP.      .MNOP
QRS..      ..QRS
```
This is done by taking each row `r`, and swapping the empty (`.`) with non-empty positions: `".".join(r.split(".")[::-1])`
#### Rotate a hexagon
To rotate a hexagon: simply rotates the 2D array 90 degrees, then applies `g` to fix the skewness.
```
ABC..          ..HDA        HDA..
DEFG.   rot90  .MIEB   g    MIEB.
HIJKL  ------> QNJFC -----> QNJFC
.MNOP          ROKG.        .ROKG
..QRS          SPL..        ..SPL
```
Rotating a 2D array can be done with `map("".join,zip(*h[::-1]))`
#### Flip a hexagon vertically
Simply flips the 2D array vertically, then applies `g` to fix the skew: `g(h[::-1])`
[Answer]
# [Pari/GP](http://pari.math.u-bordeaux.fr/), 72 bytes
Based on @loopy walt's Python answer.
```
a->7>#Set([a=if(i%2,matrix(#a,,i,j,a[i,(#a\2+i-j)%#a+1]),a~)|i<-[1..8]])
```
[Try it online!](https://tio.run/##lVPBasMwDP0V01CwqVysXjbomp/Y0ctBh2W4bMWEHDYY@/UsYXFj2XFgYMKT5Ly8JymeOqff/NCKy0C6fqir59deWrq4Vrr9CT6o79ynrAjAwRXIOhiDl9PB6avaV3TARgH9qG/3pC0ej49Nowby/v1LktC18J279SPcTcFOtJKUAmGtATGds0hBM1bjHEYApyL@wXBlBuEi3vH4PC/4HprweiAzEdlS5GTIyTASPGcWssQQJhY4GW4pY05zd6sd4NJz@wjFnphMDpMcOeRTC8V0BmsjLfTmn4022dQMbxJmnzIR93JWlJU6vqFsDtk@YUaZ7C2bP9@R0tRMwdVWcvodfwE "Pari/GP – Try It Online")
Takes a matrix skewed to the left with zero padding.
]