dankogai #5132(2008/01/02 22:55 GMT) [ Perl ] Rating1/1=1.00
カレンダーをどう見せるかで一番迷いましたが、こんな見せ方もあってもいいかなあ、と。
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);
Rating1/1=1.00-0+
[ reply ]
dankogai
#5132()
[
Perl
]
Rating1/1=1.00
カレンダーをどう見せるかで一番迷いましたが、こんな見せ方もあってもいいかなあ、と。
ANSIカラーに対応した端末(まあ今時はたいていのがそうだけど)で実行してご確認ください。
Dan the Perl Monger
Rating1/1=1.00-0+
[ reply ]