Snippets
Created by
sironekotoro
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #!/usr/bin/perl
use strict;
use warnings;
# 今回のように、スクリプト内に直接マルチバイト文字(日本語の全角文字など)を
# 使う場合には use utf8; する
use utf8;
# スクリプト内に書かれたマルチバイト文字(日本語の全角文字など)を標準出力する
# 場合には Encode モジュールを使う。
use Encode qw/encode_utf8/;
# 0〜99までの数字を漢数字を受け取ってアラビア数字にする
# 与えられる文字列
my @array
= ('一', '二', '十', '十一', '三四', '二十一', '三十四', '三十', '三〇');
# ハッシュテーブル
# 漢数字とアラビア数字の変換表
my %hash = (
〇 => 0,
一 => 1,
二 => 2,
三 => 3,
四 => 4,
五 => 5,
六 => 6,
七 => 7,
八 => 8,
九 => 9,
十 => 10,
);
# 与えられた漢数字を1つずつ処理
for my $kan_suuji (@array){
# 回答のアラビア数字用のスカラー変数を用意します
my $answer = 0;
# 漢数字を1文字ずつsplitで分割する
my @array = split // , $kan_suuji;
# 分割すると今回の条件では3パターンに分かれる
# 1文字(配列の要素が1つ):'一', '二', '十'
# 2文字(配列の要素が2つ):'十一', '三四', '三十', '三〇'
# 3文字(配列の要素が3つ):'二十一', '三十四'
# 配列の要素ごとにif文で処理を分岐する
# 1文字(配列の要素が1つ):'一', '二', '十' のとき
if (scalar @array == 1){
my $kan_suuji = shift @array;
$answer = $hash{$kan_suuji};
}
# 2文字(配列の要素が2つ):'十一', '三四', '十一', '三〇' のとき
elsif(scalar @array == 2){
# 漢数字が2桁の場合には、
# $array[0]に十の位
# $array[1]に一の位
# が格納されています
# 十の位, 一の位のアラビア数字を格納する変数を用意します
my $jyuu_no_kurai = 0;
my $itchi_no_kurai = 0;
# ここで注意が必要なのが、十一 と 三十 と三四 です
# 漢数字の 十 が 「十の位にある」「一の位にある」「含まれない」パターンがあります
# ここでさらにif文で分岐させます
# 十の位に漢数字の 十 が入るパターン
if ($array[0] eq '十'){
# 十の位に 漢数字の 十 が入っている場合には 10 〜 19 のアラビア数字になるはずです
$jyuu_no_kurai = 10;
# 一の位は 1文字の漢数字と同じようにハッシュテーブルで処理します
$itchi_no_kurai = $hash{$array[1]};
$answer = $jyuu_no_kurai + $itchi_no_kurai;
}
# 一の位に漢数字の 十 が入るパターン
elsif($array[1] eq '十'){
# 一の位に 漢数字の 十 が入っている場合には 10 20 30 40 .. 90 のアラビア数字になるはずです
# このため、十の位の数字をハッシュテーブルか取得し、
# それを10倍した値を答えとします
$answer = $hash{$array[0]} * 10;
}
# 漢数字の 十 が含まれないパターン
elsif($array[0] ne '十' && $array[1] ne '十'){
# ハッシュテーブルから数字をもってきて、それを計算します
$answer = $hash{$array[0]} * 10 + $hash{$array[1]};
}
}
# 3文字(配列の要素が3つ):'二十一', '三十四' のとき
elsif(scalar @array == 3){
# 漢数字が3桁の場合には、
# $array[0]に十の位
# $array[1]に 漢数字の 十
# $array[2]に一の位
# が格納されています
# ハッシュテーブルから数字をもってきて、それを計算します
$answer = $hash{$array[0]} * 10 + $hash{$array[2]};
}
# 漢数字をエンコードして表示する
print encode_utf8($kan_suuji) . " => " . $answer . "\n";
}
|
Comments (1)
You can clone a snippet to your computer for local editing. Learn more.
Whether you're a seasoned puzzle enthusiast or a casual gamer looking for a fun way to pass the time, Connections NYT has something for everyone to enjoy.