北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

即席プログラミング

ある意味、露出狂です。


ふと思い立ち、三方陣を解くプログラムを書きました。所要時間はデバグ含めて15分ほど。デバグが10分くらいかかりました。

use strict;
use utf8;

my @q = (
[-1,-1,-1],
[-1, 5,-1],
[-1, 3, 8],
);


# 正解か判定
sub check($){
    my $ref_data = shift;
    my $num = $ref_data->[0][0] + $ref_data->[0][1] + $ref_data->[0][2];

    foreach(0 .. 2){
	return 0 
	    if($num != $ref_data->[$_][0] + $ref_data->[$_][1] + $ref_data->[$_][2]);
    }

    foreach(0 .. 2){
	return 0 
	    if($num != $ref_data->[0][$_] + $ref_data->[1][$_] + $ref_data->[2][$_]);
    }

    return 0
	    if($num != $ref_data->[0][0] + $ref_data->[1][1] + $ref_data->[2][2]);

    return 0
	    if($num != $ref_data->[0][2] + $ref_data->[1][1] + $ref_data->[2][0]);

    return 1;
}

# 乱数で答えを作る
sub randarr(){
    my @nums = (1 .. 9);
    foreach my $m(0 .. $#nums){
	my $n = int(rand() * @nums);
	my $tmp = $nums[$n];
	$nums[$n] = $nums[$m];
	$nums[$m] = $tmp;
    }
    return @nums;
}


#表示
sub disp($){
    my $ref = shift;
    print join(",", @{$ref->[0]}), "\n";
    print join(",", @{$ref->[1]}), "\n";
    print join(",", @{$ref->[2]}), "\n";
    print "\n";
}


disp(\@q);

# どこを答えればいいの?
my @emp = ();
foreach my $x(0 .. 2){

    foreach my $y (0 .. 2){
	push(@emp, [$x, $y]) if($q[$x][$y] < 0);
    }

}


# 100万回チャレンジ
foreach(0 .. 1000000){
    my @r = randarr();
    foreach(@emp){
	$q[$_->[0]][$_->[1]] = shift @r;
    }

    if(check(\@q)){
	disp(\@q);
	exit;
    }

}

die "ギブアップです";

速さ重視して書くと、素の実力が出ますねー。普段なら絶対書かないコードのできあがりです( ´△`)。とりあえず反省。

  • 配列を3x3固定のものとしてコーディングするなんて屑のやること
  • 乱数アタックじゃなくてせめて総当たりにしようよ
  • そもそも、三方陣って答え一個ですから・・・