number_triangles.pl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 25 May 2015
  5. # https://github.com/trizen
  6. #
  7. ## Generate magic triangles with n gaps between numbers
  8. #
  9. use 5.010;
  10. use strict;
  11. use warnings;
  12. use GD::Simple;
  13. use File::Spec::Functions qw(catfile);
  14. my $num_triangles = shift(@ARGV) // 30; # duration: about 2 minutes
  15. sub generate {
  16. my ($n, $j, $data) = @_;
  17. foreach my $i (1 .. $n) {
  18. if ($i % $j == 0) {
  19. $data->{$i} = 1;
  20. }
  21. }
  22. return $n;
  23. }
  24. my $dir = "Blue Number Triangles";
  25. if (not -d $dir) {
  26. mkdir($dir)
  27. or die "Can't create dir `$dir': $!";
  28. }
  29. foreach my $k (1 .. $num_triangles) {
  30. my %data;
  31. my $max = generate(500000, $k, \%data);
  32. my $limit = int(sqrt($max)) - 1;
  33. say "[$k of $num_triangles] Generating...";
  34. # create a new image
  35. my $img = GD::Simple->new($limit * 2, $limit + 1);
  36. my $i = 1;
  37. my $j = 1;
  38. my $black = 0;
  39. for my $m (reverse(0 .. $limit)) {
  40. $img->moveTo($m, $i - 1);
  41. for my $n ($j .. $i**2) {
  42. if (exists $data{$j}) {
  43. $black = 0;
  44. $img->fgcolor('blue');
  45. }
  46. elsif (not $black) {
  47. $black = 1;
  48. $img->fgcolor('black');
  49. }
  50. $img->line(1);
  51. ++$j;
  52. }
  53. ++$i;
  54. }
  55. open my $fh, '>:raw', catfile($dir, sprintf("%04d.png", $k));
  56. print $fh $img->png;
  57. close $fh;
  58. }