年間カレンダー
Posted feedbacks - Perl
カレンダーをどう見せるかで一番迷いましたが、こんな見せ方もあってもいいかなあ、と。
ANSIカラーに対応した端末(まあ今時はたいていのがそうだけど)で実行してご確認ください。
Dan the Perl Monger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #!/usr/local/bin/perl
use strict;
use warnings;
use POSIX qw/mktime/;
sub leap {
$_[0] % 4 ? 0 : $_[0] % 100 ? 1 : $_[0] % 400 ? 0 : 1;
}
my @dayname = qw/sun mon tue wed thu fri sat/;
sub make_cal_array {
my $year = shift;
my @months =
( 31, 28 + leap($year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
my $result;
for my $m ( 0 .. 11 ) {
my $dofw1 = ( localtime( mktime( 0, 0, 0, 1, $m, $year - 1900 ) ) )[6];
for my $d ( 1 .. $months[$m] ) {
$result->[$m][ $d + $dofw1 - 1 ] = $d;
}
}
return $result;
}
sub color {
[
sub { "\e[7m\e[31m$_[0]\e[0m" }, # reverse red
sub { "\e[30m$_[0]\e[0m" }, # black
sub { "\e[35m$_[0]\e[0m" }, # purple
sub { "\e[32m$_[0]\e[0m" }, # green
sub { "\e[33m$_[0]\e[0m" }, # yellow
sub { "\e[36m$_[0]\e[0m" }, # skyblue
sub { "\e[7m\e[34m$_[0]\e[0m" }, # reverse blue
]->[ $_[1] % 7 ]->( $_[0] );
}
sub print_cal {
my $year = shift;
my $cal = make_cal_array($year);
print "$year\n";
for my $m ( 0 .. 11 ) {
printf "%2d: ", $m + 1;
my $c = 0;
for my $d ( @{ $cal->[$m] } ) {
print color( $d ? $d < 10 ? ' ' . $d : $d : ' ', $c++ );
}
print "\n";
}
}
print_cal(shift || (localtime)[5]+1900);
|


186
#4884()
Rating4/4=1.00
nを入力としてn年の年間カレンダーを返すプログラムを作ってください 少なくとも日曜日と土曜日が判別出来るようにしてください 出力は標準出力でもファイルでも構いません デザインは各自のお好みで 出力例1: (y-calendar 2008)=> #=Saturday, @=Sunday 2008/1 1 2 3 4 #5 @6 7 ... 2008/2 1 #2 @3 4 5 6 7 ... ... 2008/12 1 2 3 4 5 #6 @7 ... 出力例2: (y-calendar 2008)=> M T W T F S S M 2008/ 1 1 2 3 4 5 6 7 ... 2008/ 2 1 2 3 4 ... ... 2008/12 1 2 3 4 5 6 7 8 ... 出力例3: (y-calendar 2008)は2008.htmlを出力する 2008.htmlの中身 ---- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>2008 calendar</title> <style type="text/css"> * {font-family: monospace;} span {margin: 0px 3px;} span.sunday {color:red;font-weight:bold;} span.saturday {color:blue;font-weight:bold;} dd ul li{display:inline;} </style> </head> <body> <h1>2008 calendar</h1> <dl> <dt>2008/1</dt> <dd><ul> <li><span class="weekday">1</span></li> <li><span class="weekday">2</span></li> <li><span class="weekday">3</span></li> <li><span class="weekday">4</span></li> <li><span class="saturday">5</span></li> <li><span class="sunday">6</span></li> ... </ul></dd> ... </dl> </body> </html> ----[ reply ]