Your task is to draw a requested number of cells in a flat-topped/pointy-sided hex pattern. Each cell is 5 characters high and 8 characters wide (4 characters wide at the top and bottom).
This is a valid layout for 6 cells:
____
/ \
____/ \____
/ \ / \
/ \____/ \
\ / \ /
\____/ \____/
/ \ /
/ \____/
\ / \
\____/ \
\ /
\____/
You can choose the exact layout, as long as you follow these rules:
- All cells must be touching, and laid out within a regular hex grid pattern.
- If there are >= 3 cells, every cell must have at least one vertex that is part of 3 cells.
- The difference in length between the longest rows in each dimension (northeast and southeast) must be <= 2. (The above diagram has longest rows of 3 and 2).
That is, you can't simply make a long line of cells, they must expand out in 2 dimensions at roughly even pace. (If it turns out the formulated rules are insufficient to enforce this goal, they will be extended, no loopholes allowed).
Input
The number of cells to draw, an integer N >= 1. (You can take that integer as 0-based if you like.)
Output
The text output in the format above, made only of /\_ and space characters. Extra whitespace is fine.
(Formats such as a string of newline-separated text, arrays of arrays of characters etc, are fine).
Scoring
Code golf.
Sample data
N=1
____
/ \
/ \
\ /
\____/
N=2
____
/ \
/ \
\ /
\____/
/ \
/ \
\ /
\____/
N=3
____
/ \
/ \____
\ / \
\____/ \
/ \ /
/ \____/
\ /
\____/
N=4 INVALID
____ ____
/ \ / \
/ \____/ \
\ / \ /
\____/ \____/
/ \ /
/ \____/
\ /
\____/
(Longest dimensions are 3 and 2, but there is a cell with no vertex touching 3 cells)
N=4 OK
____
/ \
/ \____
\ / \
\____/ \
/ \ /
/ \____/
\ / \
\____/ \
\ /
\____/
(Longest dimensions are 2 and 2)
N=5 INVALID
____
/ \
____ ____/ \
/ \ / \ /
/ \____/ \____/
\ / \ /
\____/ \____/
/ \ /
/ \____/
\ /
\____/
(Longest dimensions are 4 and 2, but there are two cells with no vertex touching 3 cells)
N=5 OK
____ ____
/ \ / \
/ \____/ \
\ / \ /
\____/ \____/
/ \ / \
/ \____/ \
\ / \ /
\____/ \____/
(Longest dimensions are 3 and 3)
N=8
____
/ \
____/ \____
/ \ / \
/ \____/ \____
\ / \ / \
\____/ \____/ \
/ \ / \ /
/ \____/ \____/
\ / \ /
\____/ \____/
\ /
\____/
-
\$\begingroup\$ Related: codegolf.stackexchange.com/questions/70166/… (The big differences here: no need to label, also you need to handle any number of cells, not just regular grids). \$\endgroup\$Steve Bennett– Steve Bennett2025年05月25日 10:27:24 +00:00Commented May 25 at 10:27
-
\$\begingroup\$ The "7 cell" layout at the start is actually 6 cells. \$\endgroup\$squareroot12621– squareroot126212025年05月25日 19:42:54 +00:00Commented May 25 at 19:42
-
\$\begingroup\$ Thanks, I changed it from a 7 cell layout, forgot to update the text. \$\endgroup\$Steve Bennett– Steve Bennett2025年05月25日 22:01:36 +00:00Commented May 25 at 22:01
-
\$\begingroup\$ What does longest dimension mean? \$\endgroup\$l4m2– l4m22025年05月26日 04:24:54 +00:00Commented May 26 at 4:24
-
\$\begingroup\$ That should read, "longest row in each dimension", as spelt out in the rules. \$\endgroup\$Steve Bennett– Steve Bennett2025年05月26日 04:26:55 +00:00Commented May 26 at 4:26
3 Answers 3
Ruby, 157 bytes
->n{s="%#{w=9*v=(n**0.5).round}s"%$/*w
n.times{|i|5.times{|j|s[i%v*6+(j+i%v%2*2+i/v*4)*w+2*k=0**j,m=8>>k]='____ \____/ \ // \ / \ '[-j*8,m]}}
s}
Anonymous function taking an integer n as an argument and returning a newline-separated string with v=round(sqrt(n)) columns of hexagons.
Fairly straightforward: make a canvas s of w newline separated strings of w-1 spaces, and iterate through hexagons, positioning hexagon number i horizontally at (i%v*6 , i%v%2*2 + i/v*4) and run through 5 rows with inner j loop replacing the existing spaces with hexagon parts.
The only wrinkle is that we replace 8 characters for j=1 through j=4 but only 4 for j=0 because we don't want to plot any spurious characters next to the top of the hexagon (they could be either spaces or slashes depending if there are other hexagons above it to the left or right.) Therefore we set up a variable k=0**j which is 1 when j=0 (0 otherwise) and use it to reduce the length of the string replaced from 8 to 4 by rightshifting. The string of hexagon parts is indexed with -j*8 which picks hexagon parts from the right for j=1 through j=4 and picks up the short part ____ from the left for j=0, avoiding any issues with indexing of different length strings.
Jelly, (削除) 72 (削除ここまで) 53 bytes
Made a bunch of improvements, including moving away from a spiral to a partially filled almost-square (like Level River St's Ruby answer).
Perhaps 52 bytes, but maybe cases like \$n=14\$ aren't compact enough?
Ḷd×ばつ2,3ḂU+ƊḤ+8ŒṬ€Ịa6»"9Ḍ36ạɠḟ6=6’ṃ" \/_"¤s8¤UṚ€»/
A monadic Link that accepts a positive integer, \$n\$, and yields a list of lists of characters (lines) representing an area of \$n\$ hegagons.
Try it online! (The footer removes all the extra whitespace that would otherwise be present.)
How?
First create the locations of the hexagons:
Ḷd×ばつ2,3ḂU+ƊḤ - Link: positive integer, N
Ḷ - lowered range -> [0..N-1]
Ɗ - last three links as a monad - f(N):
1⁄2 - square-root
+. - add a half
Ḟ - floor
d - {[0..N-1]} divmod {rounded root}
×ばつ2,3 - multiply these pairs by [2,3]
Ɗ - last three links as a monad - f(those):
Ḃ - mod two
U - reverse each
+ - add
Ḥ - double
Then convert these locations to canvases of space characters
+8ŒṬ€Ịa6 - ...continued chain
+8 - add eight to every value
ŒṬ€ - for each: matrix of zeros of that size with a 1 at the bottom right
Ị - insignificant? (convert all zeros to ones)
a6 - logical AND space character
Now make a single hexagon (with rows in reverse):
"...’ṃ" \/_"¤s8¤
¤ - nilad followed by link(s) as a nilad:
¤ - nilad followed by link(s) as a nilad:
"...’ - 529086439416644320972805
ṃ" \/_" - convert to base 4 with digits 0-4 as "_ \/"
s8 - split into chunks of length eight -> ReversedHexagon
Now format the hexagon into each canvas and merge them together:
» ^^^ UṚ€»/
» ^^^ - {canvases} maximum {ReversedHexagon} (vectorises)
(making the top-left of each canvas a ReversedHexagon)
U - reverse each row of each
(placing the ReversedHexagon on the right)
Ṛ€ - reverse each
(placing it at the bottom-right, with rows correctly ordered)
»/ - reduce by maximum
Charcoal, 64 bytes
NθW‹Lυθ«→F6F−i=1κ⊞υ⊕+κ÷κ3»F...υθ«\¶ ×ばつ4_×ばつ4_↓↙2→M4✳−8ιM⊗%ι2✳ι
Try it online! Link is to verbose version of code. Explanation:
Nθ
Input N.
W‹Lυθ«
Until it is large enough...
→F6F−i=1κ⊞υ⊕+κ÷κ3
... calculate the path to trace out an ever increasingly large hexagon.
»F...υθ«
Taking only the first N steps:
\¶ ×ばつ4_×ばつ4_↓↙2→
Draw a hexagon without disturbing any existing hexagons, leaving the cursor in its original position.
M4✳−8ιM⊗%ι2✳ι
Take the next step on the path.
Explore related questions
See similar questions with these tags.