Snippets

sironekotoro 元号->西暦変換クイズ

Created by sironekotoro
use strict;
use warnings;
use feature qw/say/;

my @JAPANESE_ERA = (
    { name => '明治', start => 1867, end => 1912 },
    { name => '大正', start => 1911, end => 1926 },
    { name => '昭和', start => 1925, end => 1989 },
    { name => '平成', start => 1988, end => 2019 },

    # { name => '令和', start => 2018, end => '',},
);

my $keys      = scalar @JAPANESE_ERA;
my $era_index = int( rand($keys) );

my $hash_ref = $JAPANESE_ERA[$era_index];
my $era_span = $hash_ref->{end} - $hash_ref->{start};
my $num      = int( rand($era_span) );

print $hash_ref->{name} . $num
    . '年は西暦何年でしょう? (数字だけ入力)> ';

my $input = <STDIN>;
chomp $input;

if ( $input == ( $hash_ref->{start} + $num ) ) {
    print "正解!\n";
}
else {
    print "不正解!\n";

}
#!/use/bin/env perl
use strict;
use warnings;
use utf8; # ソースコードでマルチバイト文字を使う際に利用

binmode( STDIN, 'encoding(utf8)' ); # 標準入力をutf8として認識する
binmode( STDOUT, 'encoding(utf8)' );   # 標準出力をutf8にする
binmode( STDERR, 'encoding(utf8)' );   # 標準エラー出力をutf8にする

# モジュールを使って楽をする
# Date::Japanese::Era - 和暦と西暦の相互変換
# http://perldoc.jp/docs/modules/Date-Japanese-Era-0.03/lib/Date/Japanese/Era.pod
use Date::Japanese::Era;

# 明治6年(1973)よりグレゴリオ暦を採用
# https://ja.wikipedia.org/wiki/%E6%98%8E%E6%B2%BB5%E5%B9%B4
# > この布告によって、明治5年12月2日・西暦1872年12月31日をもって太陰太陽暦(天保暦)を廃止し、その翌日からグレゴリオ暦に移行[1]、明治6年(1873年)1月1日となることとしたため、明治5年は12月3日から12月30日までの28日間が存在しない。

my $START_MEIJI_GREGORIO = 1873;
my $NOW                  = 2019;

# グレゴリオ暦採用以後のランダムな年を出すために計算
my $rand_year = int( rand( $NOW - $START_MEIJI_GREGORIO ) );

# ランダムな年数をグレゴリオ暦採用年に加えて、西暦を求める
my $answer_year = $rand_year + $START_MEIJI_GREGORIO;

# Date::Japanese::Era モジュールで楽をする
my $era = Date::Japanese::Era->new( $answer_year, 1, 1 );


# 問題文を作る
print $era->name . $era->year
    . "年1月1日は西暦何年でしょう?\n4桁の数字で回答してください > ";

my $input = <STDIN>;
chomp $input;

if ( $input == $answer_year ) {
    print "正解!\n";
}
else {
    print "不正解!\n";
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.