challenge 年間カレンダー

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>
----

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);

Index

Feed

Other

Link

Pathtraq

loading...