Geek that I am, I made my computer do it.
I wrote a script in Perl that does the following:
- Takes the list of color names (the array @colors)
- Makes the specified number of each size (i.e. number of rows) square (the has %size_odds)
- Always makes 2-row squares two different colors
- In larger squares, increases the odds by 10% that the following row will use the same color as the row before it... I didn't want a bunch of 8-row squares in 8 different colors
- Makes sure no two squares will be exactly the same
1:orange 2:berry 1:candy pink 2:lime 3:lime 4:lime 5:sky blue 6:lilac 1:berry 2:lime sherbet 3:lime sherbet 4:lime sherbet 5:royal blue 6:lime 7:lime 8:canary 9:lilac 10:sky blue 11:navy 12:coral 1:candy pink 2:berry 3:sky blue 4:tangerine 5:green 6:dk pink 1:orange 2:navy 1:taupe 2:navy 3:navy 4:lime
What it doesn't do: you can't specify the amounts of yarn you have by color and it doesn't compute the size of the blanket or conversely how many squares to make for a particular size.
I did actually run out of the lt. yellow, mainly because of that 12-row square in the picture where rows 7-12 were lt. yellow. It's probably not the last so far, so I wrote another script to replace it with other colors. I already have some partially made blocks that called for it.
Here's the script:
#!/usr/bin/perl # blocks - make random colors for blocks for a blanket # Karen B. # Distributed under a Creative Commons Attribution-Share Alike 3.0 Unported License # http://creativecommons.org/licenses/by-sa/3.0/ use strict; my $namefile = "newblocks"; # Outfile - human-readable my $savefile = "saveblocks"; # Outfile - numbers only # Name your colors my @colors = ( 'lime', 'sky blue', 'navy', 'candy pink', 'royal blue', 'dk pink', 'tomato', 'green', 'lilac', 'orange', 'coral', 'turquoise', 'jade', 'canary', 'lt. yellow', 'lime sherbet', 'taupe', 'tangerine', 'berry' ); # Number of rows => number of blocks in that size my %size_odds = ( '2' => 50, '4' => 49, '6' => 16, '8' => 7, '10' => 2, '12' => 2 ); my $cnum = $#colors + 1; # Actual number of colors my %done; # Hash of finished squares foreach my $size (keys %size_odds) { my $lim = $size_odds{$size}; while ($lim-- > 0) { my $done; my $out; do { my %used; $out = ''; my $round = 1; my $cur = int(rand($cnum)); my $last = $cur; $done = "$cur"; $out = "$round:$colors[$cur]"; $used{$cur}++; $round++; if ($size == 2) { until ($last != $cur) { $cur = int(rand($cnum)); } $out .= " $round:$colors[$cur]"; $done .= ",$cur"; } else { while ($round <= $size) { if (int(rand(3)) == 0) { $out .= " $round:$colors[$last]"; } else { do { $cur = int(rand($cnum)); } while ( $used{$cur} ); $out .= " $round:$colors[$cur]"; $used{$cur}++; $last = $cur; } $round++; $done .= ",$cur"; } } } while ( exists($done{$done}) ); $done{$done} = $out; } } open(OUT, ">$namefile"); print OUT join("\n\n", values %done); # This naturally "shuffles" the list close(OUT); open(COL, ">$savefile"); print COL join("\n", keys %done); close(COL);
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License.
1 comment:
love your geekiness!! awsome
Post a Comment