数を比較して判定する(判定サブルーチン)

判定サブルーチン

2つの数を比較して、

  1. 数字と桁が等しいものの(ヒット)数
  2. 数字は等しいが桁が違うもの(ブロー)の数

を返す判定サブルーチンを作成します。

ヒット数を返す判定サブルーチン

まずはヒットの数を返すサブルーチンを作成します。以下の手順となります。

  1. 与えられた2つの数を桁ごとの数字を求める。
  2. 数字と桁が等しい場合には、変数$hitの値を1増やす。

【サブルーチン】

# 判定サブルーチン
sub hantei {
	my $a, $b;
	my $a0, $a1, $a2, $b0, $b1, $b2;
	my $hit=0;
	($a, $b)=@_; # 2引数を変数$a, $bに

	$a0=int($a/100); # 百の桁
	$a1=int(($a%100)/10); # 十の桁
	$a2=$a%10; # 一の桁

	$b0=int($b/100); # 百の桁
	$b1=int(($b%100)/10); # 十の桁
	$b2=$b%10; # 一の桁

	if ($a0==$b0) { $hit++; }
	if ($a1==$b1) { $hit++; }
	if ($a2==$b2) { $hit++; }

	return $hit;
}

【呼び出し側】

$answer=123;
$number=&input; # 入力サブルーチン
$hit=&hantei($answer, $number);
print $number." : ".$hit."H\n";

ヒット数とブロー数を返す判定サブルーチン

ブローの数も返すサブルーチンに変更します。

  1. 数字が等しくて桁が異なる場合には、変数$blowの値を1増やす。
  2. 変数$hitと変数$blowの値を配列にして返す。

【サブルーチン】

# 判定サブルーチン
sub hantei {
	my $a, $b;
	my $a0, $a1, $a2, $b0, $b1, $b2;
	my $hit=0;
	my $blow=0;
	($a, $b)=@_; # 2引数を変数$a, $bに

	$a0=int($a/100); # 百の桁
	$a1=int(($a%100)/10); # 十の桁
	$a2=$a%10; # 一の桁
	$b0=int($b/100); # 百の桁
	$b1=int(($b%100)/10); # 十の桁
	$b2=$b%10; # 一の桁

	if ($a0==$b0) { $hit++; }
	if ($a1==$b1) { $hit++; }
	if ($a2==$b2) { $hit++; }

	if ($a0==$b1) { $blow++; }
	if ($a0==$b2) { $blow++; }
	if ($a1==$b0) { $blow++; }
	if ($a1==$b2) { $blow++; }
	if ($a2==$b0) { $blow++; }
	if ($a2==$b1) { $blow++; }

	return ($hit, $blow);
}

【呼び出し側】

$answer=123;
$number=&input; # 入力サブルーチン
($hit, $blow)=&hantei($answer, $number);
print $number." : ".$hit."H".$blow."B\n";