Jelly, 53 43 bytes
ŒṗQƑƇḂ⁹ƤḄ_’ʋⱮ3Ȧ$ƇṀÞḢµạṀIḂ’+Ʋ⁶ẋ;"b1KḣƊ€z⁶ZŒB A monadic link taking an integer and returning a list of lists. >50% of the code is focused on the ASCII art aspect. If a list of integers indicating row sizes were permissible, this would be 20 bytes.
In brief, this is the algorithm:
- Generate all integer partitions of n
- Keep only those made of distinct integers
- Keep only those where there is no length 2 subsequence of odd numbers and no length 3 subsequence that is odd, even, even.
- Keep one of the lists with the smallest maximum integer
- Left pad the list of integers with spaces; in general, this is max integer minus current integer, but where there are two even numbers in a row, there is one less space.
- Half the integer, rounding up, convert to unary and separate with spaces, with an extra space if the integer is even
- Right pad with spaces to make each line the same length.
- Palindromise each line
Full explanation to follow.
As an alternative, here’s a translation of @LevelRiverSts clever Ruby solution:
Jelly, 49 bytes
ŻÄ_=2o<ʋ0Tðb1K€a3¦€3¦S_Ḃo¬Ɗɗ^Ø.¦"S_HĊʋb1ɗŻṛ¡"U{o⁶