challenge 西暦 to 和暦

西暦を和暦に変換するプログラムを書いてください。元号の切り替わる日など、複数の表記が可能な場合には両方表示し、西暦が無効な日付の場合には「範囲外」と表示するようにしてください。対応すべき日付は明治元年以降とします。

>a.py 1868/12/2
明治1年12月2日

>a.py 1926/12/24
大正15年12月24日

>a.py 2007/12/01
平成19年12月1日

>a.py 1926/12/25
大正15年12月25日 昭和1年12月25日

>a.py 1868/1/2
範囲外

>a.py 1868/100/2
範囲外

Posted feedbacks - Perl

なんという汚いソースコード…!

 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
53
54
55
56
57
58
#!/usr/bin/env perl

use strict;
use warnings;
use Carp;

my @anDaysInMonth = (31,28,31,30,31,30,31,31,30,31,30,31);
unshift @anDaysInMonth,undef;
my %hsNengoName = ('m'=>'Meiji','t'=>'Taisho','s'=>'Showa','h'=>'Heisei');
my %hnBeginYear = ('m'=>1868,'t'=>1912,'s'=>1926,'h'=>1989);
my ($nNowDay,$nNowMonth,$nNowYear);

(undef,undef,undef,$nNowDay,$nNowMonth,$nNowYear) = localtime(time);
$nNowMonth++;
$nNowYear += 1900;

exit if !defined $ARGV[0] or $ARGV[0] !~ m|(\d{4})/(\d{1,2})/(\d{1,2})|;
my ($nYear,$nMonth,$nDay) = ($1,$2,$3);
$anDaysInMonth[2]++ if $nYear % 400 == 0 || ($nYear % 100 != 0 && $nYear % 4 == 0);
&error if $nYear < 1868 or $nMonth < 1 or $nMonth > 12 or $nDay < 1 or $nDay > $anDaysInMonth[$nMonth];
my $sCapital = '';
if(
   ($nYear > 1868 || ($nYear == 1868 && ($nMonth > 9 || ($nMonth == 9 && $nDay >= 8))))
   &&
   ($nYear < 1912 || ($nYear == 1912 && ($nMonth < 7 || ($nMonth == 7 && $nDay <= 30))))){
  $sCapital .= 'm';
}
if(
   ($nYear > 1912 || ($nYear == 1912 && ($nMonth > 7 || ($nMonth == 7 && $nDay >= 30))))
   &&
   ($nYear < 1926 || ($nYear == 1926 && ($nMonth < 12 || ($nMonth == 12 && $nDay <= 25))))){
  $sCapital .= 't';
}
if(
   ($nYear > 1926 || ($nYear == 1926 && ($nMonth == 12 && $nDay >= 25)))
   &&
   ($nYear < 1989 || ($nYear == 1989 && ($nMonth == 1 && $nDay <= 7)))){
  $sCapital .= 's';
}
if(
   ($nYear > 1989 || ($nYear == 1989 && ($nMonth > 1 || ($nMonth == 1 && $nDay >= 8))))
   &&
   ($nYear < $nNowYear || ($nYear == $nNowYear && ($nMonth < $nNowMonth || ($nMonth == $nNowMonth && ($nDay <= $nNowDay)))))){
  $sCapital .= 'h';
}
&error if $sCapital eq '';
my @asCapitals = split(m||,$sCapital);
foreach(@asCapitals){
  my $nDiff = $nYear-$hnBeginYear{$_}+1;
  $_ = $hsNengoName{$_}."$nDiff $nMonth/$nDay";
}
print join(', ',@asCapitals)."\n";
exit;

sub error{
  print "OUT OF RANGE\n";
  exit -1;
}

Index

Feed

Other

Link

Pathtraq

loading...