A full-program printing the result (as a monadic link it would return a list containing characters and integers from [0,9]
)
Try it online! Or see the test-suite
J’⁶D;”-Ɗ%5^ỊƲ?€Uz⁶ZU - Link 1, get y-axis: list of columns (including x-axis & top-spaces)
J - range of length [1,2,3,4,5,6,...,height+1] (+1 for x-axis)
’ - decrement [0,1,2,3,4,5,...] (line it up with the content)
?€ - if for €ach...
Ʋ - ...condition: last four links as a monad:
%5 - modulo by five
Ị - insignificant? (1 for 0 and 1, else 0)
^ - XOR (0 for 1 or multiples of 5 greater than 0, else 0)
⁶ - ...then: literal space character
Ɗ - ...else: last three links as a monad:
D - decimal list of the number, e.g. 10 -> [1,0]
”- - literal '-' character
; - concatenate, e.g. [1,0,'-']
U - upend (reverse each)
z⁶ - transpose with a filler of space characters
Z - transpose
U - upend (i.e. Uz⁶ZU pads the left with spaces as needed)
ḟ⁶ṢµĠ¬;⁶$L%5Ɗ¿€;"@Qz⁶Ç;"$ṚY - Main link: list of characters
ḟ⁶ - filter out space characters
Ṣ - sort
µ - start a new monadic chain, call that S
Ġ - group indices of S by their values
¬ - logical NOT (vectorises) (getting 0 for the X "characters")
¿€ - while for €ach...
Ɗ - ...condition: last three links as a monad:
L - length
%5 - modulo by five
$ - ...do: last two links as a monad:
;⁶ - concatenate a space character
Q - deduplicate S (get the x-axis)
;"@ - zip with (") concatenation (;) with swapped arguments (@)
z⁶ - transpose a with filler of space characters
$ - last two links as a monad:
Ç - call last link (1) as a monad (get y-axis)
;" - zip with concatenation (complete the layout)
Ṛ - reverse (otherwise it'll be upside-down)
Y - join with newlines
- implicit print