OEIS sequence A096004 gives the

Number of convex triangular polyominoes [polyiamonds] containing n cells.

It begins:

1, 1, 1, 2, 1, 2, 2, 3, 2, 2, 2, 3, 2, 3, 3, 5

For example, a(8)=3 with the following three convex polyiamonds:

Input: 8
 / \ / \ / \ / \ /

   / \ / \ /
 / \ / \ /

   / \ / \
 / \ / \ / \


The goal of this challenge is to write a program that takes in an integer n (in any reasonable format) and outputs ASCII art of all convex polyiamonds with n cells (in any orientation), with each polyiamond separated by two newlines.

Your program must be able to handle up to a(30) in under 60 seconds.


This is a challenge, so fewest bytes wins.

  • \$\begingroup\$ A Wumpus answer to this one would be great! \$\endgroup\$
    – Sundar R
    Commented Jul 16, 2018 at 20:19
  • \$\begingroup\$ 60 seconds on which machine.... \$\endgroup\$
    Commented Jul 17, 2018 at 4:08
  • 1
    \$\begingroup\$ On whichever machine—I trust people to be reasonable. \$\endgroup\$ Commented Jul 17, 2018 at 5:29
  • \$\begingroup\$ And this will happen... \$\endgroup\$
    Commented Jul 17, 2018 at 6:06
  • 2
    \$\begingroup\$ I'd seriously consider removing the time restriction. I don't see what it adds to the challenge other than ambiguity. \$\endgroup\$
    – Wheat Wizard
    Commented Jul 17, 2018 at 18:38

2 Answers 2


Ruby, 202 bytes

->n{(r=[*0..n]).product(r,r,r).map{|i|p,b,c,d=i;b>c||c>d||b+c+d>p||p*p-b*b-c*c-d*d!=n||0.upto(p-d<<1){|j|s=" "*j+"*---\\ / "[j%2*4,4]*p*2;(k=b*4-j)>0&&s[0,k]=" "*k;puts s[0,[p*4+1-j,p*4+1-c*4+j].min]}}}

Try it online!

Uses formula per the OEIS sequence: search for solutions where n = p**2 - b**2 -c**2 - d**2.

n =the number of triangular tiles

p =the side length of a large equilateral triangle (pointing downwards)

b,c,d =the side length of three smaller equilateral triangles, which are removed from the corners of the large equilateral triangle to get the required shape.

Some additional conditions (per OEIS) are needed to avoid duplicates: b<=c<=d and b+c+d<=p

  • \$\begingroup\$ Aha, I'd been staring at that OEIS formula wondering what it all meant... \$\endgroup\$
    – Neil
    Commented Jul 19, 2018 at 23:47

Charcoal, 89 bytes

NθF⊕θF⊕ιF⊕κF⊕λ¿∧¬‹ι⁺⁺κλμ⁼⁻×ιιθΣE⟦κλμ⟧×νν«⸿G↙⊕⊗μ↘⊕⊗⁻ι⁺κμ→⊕×⁴κ↗⊕⊗⁻ι⁺κλ↖⊕⊗λ“⌈∨¿ZH↖↖⸿T u≡9”D⎚

Try it online! Link is to verbose version of code. Thanks to @LevelRiverSt for explaining the OEIS formula. Explanation:


Input n. (Using the OEIS formula names rather than the Charcol names here.)


Loop p from 0 to n, d from 0 to p, c from 0 to d and b from 0 to c inclusive. This satisfies the condition b<=c<=d<=p.


Check the other two conditions: b+c+d<=p and n=p*p-b*b-c*c-d*d. Sadly the power function doesn't vectorise yet otherwise that would save 2 bytes.


Leave a blank line between polyiamonds.

G↙⊕⊗μ↘⊕⊗⁻ι⁺κμ→⊕×⁴κ↗⊕⊗⁻ι⁺κλ↖⊕⊗λ“⌈∨¿ZH↖↖⸿T u≡9”

Draw the polyiamond. Five of the sides are calculated, and the sixth is inferred and the polygon filled using the compressed string / \ *--- \ / --*-, which results in the desired pattern. (The pattern doesn't start with *--- because the blank line causes the pattern to be offset.)


Output and clear the canvas ready for the next polyiamond. This is quicker than positioning the cursor.

  • \$\begingroup\$ Vectorised power was added five months later: Try it online! Link is to verbose version of code. \$\endgroup\$
    – Neil
    Commented Sep 25, 2022 at 7:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.