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 - Reinstate Monica Jul 16 '18 at 20:19
  • \$\begingroup\$ 60 seconds on which machine.... \$\endgroup\$ – user202729 Jul 17 '18 at 4:08
  • 1
    \$\begingroup\$ On whichever machine—I trust people to be reasonable. \$\endgroup\$ – Peter Kagey Jul 17 '18 at 5:29
  • \$\begingroup\$ And this will happen... \$\endgroup\$ – user202729 Jul 17 '18 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\$ – Ad Hoc Garf Hunter Jul 17 '18 at 18:38

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.

|improve this answer|||||

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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