#!/usr/bin/perl -w use strict; use constant BUFFER_SIZE => 128; my $mode = undef; my $pi = atan2(0, -1); my $head = 0; my $tail = 0; my $line_cursor = 81; my $last_x = 40; my $last_y = 100; my @buffer = (); sub GetNextTemplateChar() { # Initialize buffer on first call if( $head == $tail ) { for(my $i = 0; $i < BUFFER_SIZE; $i++) { push @buffer, (("X" x 79) . "\n"); } $tail = 37; my $header_line = "#include"; $buffer[1] = (' ' x (79 - length($header_line))) . ('X' x length($header_line)) . "\n"; } # Generate new row if( $line_cursor > length($buffer[$head]) ) { $buffer[$tail] = ("X" x 79) . "\n"; $tail = ($tail + 1) % BUFFER_SIZE; # Generate star my $cx = rand(70) + 5; my $distance = sqrt(($cx - $last_x) * ($cx - $last_x) + $last_y * $last_y); if( $last_y > 30 && $distance > 40 ) { my $size0 = 1 + rand(2); my $size1 = 12 - $size0 + rand(8); my $phase = rand(2 * $pi); my $v0 = 0.5; my $v1 = 0.5; if( $mode == 2 || $mode == 3 ) { $size0 = 17 + rand(5); $size1 = 0; if( $mode == 2 ) { $v0 = 0.2; $v1 = 0.4; } } for(my $ta = 0; $ta < 10 * $pi; $ta += 0.05) { my $r = $size0 + $size1 + $size1 * 0.5 * sin($ta + $phase); for(my $tr = 0; $tr < $r; $tr += 0.1) { my $x = $cx + $tr * cos($ta / 5); my $dy = $tr * sin($ta / 5); my $y = ($tail + BUFFER_SIZE - 20) + ($dy > 0 ? $v0 * $dy : $v1 * $dy); $y = int($y + 0.5) % BUFFER_SIZE; $x = int($x + 0.5); if( $x >= 0 && $x < length($buffer[$y]) ) { substr($buffer[int($y + 0.5)], int($x + 0.5), 1) = ' '; } } } $last_x = $cx; $last_y = 0; if( $mode == 1 || $mode == 2 ) { my $y1 = int($tail + BUFFER_SIZE - 21) % BUFFER_SIZE; my $y2 = int($tail + BUFFER_SIZE - 22) % BUFFER_SIZE; if( $mode == 1 ) { $y1 = $y2 = int($tail + BUFFER_SIZE - 20) % BUFFER_SIZE; } else { $cx += rand($size0) - $size0 / 2; } if( $cx - 3 > 2 ) { substr($buffer[$y1], int($cx) - 3, 1) = '#'; substr($buffer[$y2], int($cx) - 3, 1) = '#'; } if( $cx + 2 < 77 ) { substr($buffer[$y1], int($cx) + 2, 1) = '#'; substr($buffer[$y2], int($cx) + 2, 1) = '#'; } } } else { $last_y += 2; } $head = ($head + 1) % BUFFER_SIZE; $line_cursor = 0; } return substr($buffer[$head], $line_cursor++, 1); } if( $#ARGV != 0 ) { die "$0 \n"; } my $char_count = $ARGV[0]; $mode = $char_count % 4; for(; $char_count > 0; $char_count--) { print GetNextTemplateChar(); } print "\n";