Here's a little ditty to put your birthday in the corners
of a 4 x 4 magic square. In a magic square, the sum of
all columns, all rows, and the two major diagonals is the
same.
The squares made with this algorithm also have same
values in the corner 2 x 2 squares, and the center 2 x 2
square.
The square has the maximum number of unique values
allowed by the algorithm. I didn't devise a clever way
to disallow negative numbers so folks with low birthmonth
or birthday might see negative values. There is a random
factor, so running the program again might generate an
all positive square.
SquareFoo
#!/usr/bin/perl
use strict;
if (@ARGV < 1) {
print STDERR "\nUsage: $0 mmddyyyy\n\n"; exit;
}
my ($mm, $dd, $cc, $yy) = ($ARGV[0] =~ m{(..)}g);
my $ms = [];
$ms->[0] = [$mm, $cc, $yy, $dd];
$ms->[1] = [$yy, $dd, $mm, $cc];
$ms->[2] = [$dd, $yy, $cc, $mm];
$ms->[3] = [$cc, $mm, $dd, $yy];
my $most = 12 + uniq($ms);
if ($mm == $dd) { $most--; }
if ($mm == $cc) { $most--; }
if ($yy == $dd) { $most--; }
if ($yy == $cc) { $most--; }
while (uniq($ms) < $most) {
if (int(rand(2))) {
if (int(rand(2))) {
rot ($ms, 1, 0, 1);
rot ($ms, 1, 2, -1);
}
else {
rot ($ms, 1, 0, -1);
rot ($ms, 1, 2, 1);
}
}
else {
if (int(rand(2))) {
rot ($ms, 0, 1, 1);
rot ($ms, 2, 1, -1);
}
else {
rot ($ms, 0, 1, -1);
rot ($ms, 2, 1, 1);
}
}
}
show ($ms);
#-----------------------------------------------------------
sub uniq {
my ($ms) = @_;
my (%used);
for my $row (0..3) {
for my $col (0..3) {
$used{$ms->[$row][$col]}++;
}
}
return scalar(keys(%used));
}
#-----------------------------------------------------------
sub rot {
my ($ms, $row, $col, $val) = @_;
$ms->[$row] [$col] += $val;
$ms->[$row+1][$col+1] += $val;
$ms->[$row] [$col+1] -= $val;
$ms->[$row+1][$col] -= $val;
}
#-----------------------------------------------------------
sub show {
my ($ms) = @_;
for my $row (0..3) {
for my $col (0..3) {
printf(STDOUT "%2d ", $ms->[$row][$col]);
}
print STDOUT "\n";
}
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.