Binary Images of Triangle Counts
Mathematica, 126 122 121 89 bytes
Image[1-Thread@IntegerDigits[l=Round[(#+3#~Mod~2)^2/48]&/@Range@##,2,⌈2~Log~Max@l⌉]]&
This defines an unnamed function taking the two integers as parameters and displaying the image on screen. It plots each square as a single pixel, but if you like you can actually zoom in.
I'm now using an explicit formula given in the OEIS article (first one in the Mathematica section, thanks to David Carraher for pointing that out). It's also blazingly fast now.
Here is the indented code with a few comments:
Image[1-Thread@IntegerDigits[ (* 3. Convert each number to padded binary, transpose
invert colours, and render as Image. *)
l = Round[
(#+3#~Mod~2)^2/48
] & /@ Range@##, (* 1. Turn input into a range and get the Alcuin
number for each element. *)
2,
⌈2~Log~Max@l⌉ (* 2. Determine the maximum number of binary digits. *)
]] &
Here is the output for 0, 600
:
CJam (56 55 53 chars) / GolfScript (64 chars)
CJam:
"P1"q~,>{_1&3*+_*24+48/}%_:e>2b,\2_$#f+2fbz(,@@:~~]N*
GolfScript:
"P1"\~,>{.1&3*+.*24+48/}%.$-1=2base,\{2.$?+2base}%zip(,@@{~}/]n*
Both produce output in NetPBM format, and they're essentially ports of each other.
Dissection
CJam GolfScript Explanation
"P1" "P1"\ NetPBM header
q~,> ~,> Create array [m .. n-1]
{_1&3*+_*24+48/}% {.1&3*+.*24+48/}% Map the sequence calculation
_:e>2b,\ .$-1=2base,\ Compute image height H as highest bit
in largest number in sequence
2_$#f+2fb {2.$?+2base}% Map sequence to bits, ensuring that
each gives H bits by adding 2^H
z(,@@ zip(,@@ Transpose and pull off dummy row to use
its length as the "width" in the header
:~~ {~}/ Flatten double array and dump on stack
]N* ]n* Separate everything with whitespace
Thanks to Optimizer for CJam 56 -> 53.
Pyth - 101 60 59
Outputs a .pbm
. Can likely be golfed more.
Km.B/++24*dd**6%d2d48rvzQJCm+*\0-eSmlkKlddK"P1"lhJlJjbmjbdJ
Highly ungolfed because I will be translating to Pyth.
Explanation coming next. Right now look at the equivalent Python code.
It uses the OEIS algorithm to calculate the sequence and then it converts to binary, pads the numbers, does a matrix rotation, and formats it into a pbm
image. Since I'm not using brute force, it is incredibly fast.
K=
m rvzQ Map from eval input to eval input
.B Binary rep
/ 48 Divided by 48
++ Triple sum
24 Of 24,
*dd Square of d
** Triple product
6 6
%d2 Modulo d%2
d Var d
J Set J=
C Matrix rotation from columns of row to rows of columns
m K Map K (This does padding)
+ String concat
* String repeat
\0 "0"
- ld Subtract the length of the column from
eS The max
mlkK Of all the column lengths
d The column
"P1" Print header "P1"
l Length of
hJ First row
lJ Number of columns
jb Join by linebreaks
m J Map on to J
jb Joined columns by linb
d
Here is the 600,900
example:
Try it here online.