いつかAランクをゆめみて・・

Aランクレベルアップをめざしてといたれんしゅ~もんだい「陣取りゲーム」

陣取りゲーム結果 3じかんくらいふんと~しながらやっととけました~!

どうすれば効率よくとけるか・・ターンごとに全マスチェックしていたのでは時間がかかりすぎるよね・・・なるべく手間を減らすには・・・??とかんがえてたらいいほうほうをひらめいちゃいました^-^*

んがっ、それをコードにするのにずいぶんくろ~しちゃった・・w

というわけできき☆彡の解答~^-^*

my %pid = ('A' => 0, 'B' => 1);
my @pname = ('A', 'B');
my @cord = ([-1, 0], [0, 1], [0, -1], [1, 0]);

my $input_line = <STDIN>;
chomp $input_line;
my ($H, $W) = split(/ /,$input_line);
my $N = <STDIN>;
chomp $N;

# フィールドの初期状態
my @field = ();
my @new_territory = ([], []);
my @score = (0, 0);
for(my $a = 0; $a < $H; ++$a){
    $input_line = <STDIN>;
    chomp $input_line;
    push(@field,[split(//, $input_line)]);
    for(my $b = 0; $b < $W; ++$b) {
        if (defined($pid{$field[$a][$b]})) {
            push(@{$new_territory[ $pid{$field[$a][$b]} ]}, [$a, $b]);
            ++$score[$pid{$field[$a][$b]}];
        }
    }
}

my $flg = 1;
my $turn = $pid{$N};
my $pass = 0;
#ゲーム開始!
while($flg) {
    $flg = 0;
    my $painted = [];
    foreach $pick (@{$new_territory[$turn]}) {
        for(my $a = 0; $a < 4; ++$a) {
            my $ny = $$pick[0] + $cord[$a][0];
            my $nx = $$pick[1] + $cord[$a][1];
            if (
                $ny >= 0 && $ny < $H &&
                $nx >= 0 && $nx < $W &&
                $field[$ny][$nx] eq '.'
            ) {
                # 侵略!<s>イカ娘</s>
                $field[$ny][$nx] = $pname[$turn];
                ++$score[$turn];
                push(@$painted, [$ny, $nx]);
                $flg = 1;
            }
        }
    }
    $new_territory[$turn] = $painted;
    if ($flg) {
        $pass = 0;
    }
    # 連続パス
    if (!$flg && !$pass) {
        $pass = 1;
        $flg = 1;
    }
    $turn = 1 - $turn;
}

#けっかはっぴょ~♪
print join(' ',@score)."\n";
print $score[0] > $score[1] ? "A\n" : "B\n";

座標系での規則的な移動

paizaのAランクレベルアップ問題「座標系での規則的な移動」
けっこ~コードをかんがえるのがむずかしかったぁ~・・

1つもifやループをつかわずにけ~さんだけでできたぞぉo(*^▽^*)o~♪

checkIOってサイトでやったSquare Spiralってもんだいににてますd(^-^)ネ!

my @cordb = (
    [-1, 1], [1, 1], [1, -1], [-1, 1]
);
my @direc = (
    [ 1, 0], [0, -1], [-1, 0], [0, 1]
);

my $input_line = ;
chomp $input_line;
my ($x, $y, $N) = split(/ /, $input_line);
$circuit = int((sqrt($N) + 1) / 2);

$pos_of_c = $N - ($circuit * 2 - 1) ** 2;
$pos_of_d = int($pos_of_c / ($circuit * 2));
$pos_of_e = $pos_of_c % ($circuit * 2);

$oy = $y + $cordb[$pos_of_d][0] * $circuit + $direc[$pos_of_d][0] * ($pos_of_e + 1);
$ox = $x + $cordb[$pos_of_d][1] * $circuit + $direc[$pos_of_d][1] * ($pos_of_e + 1);

print $ox.' '.$oy."\n";

paizaリバーシの操作

最近はpaizaというサイトのもんだいをときどきといてます^▽^;

そんななかでAランクレベルアップ問題にあるSTEP 5 リバーシの操作というもんだいをといたのできき☆彡の解答をぺたり☆

けっこうくふうしたつもりです(>▽<;; アセアセ

my $input_line = <STDIN>;
chomp $input_line;
my ($H, $W, $Y, $X) = split(/ /,$input_line);
###  外枠を '_' で囲む
my @board = ('_' x ($W + 2));
for (my $a = 0; $a < $H; ++$a) {
    $input_line = <STDIN>;
    chomp $input_line;
    push(@board, '_'.$input_line.'_');
}
push(@board, '_' x ($W + 2));
substr($board[$Y + 1], $X + 1, 1, '*');
for (my $dy = -1; $dy <= 1; ++$dy) {
    for (my $dx = -1; $dx <= 1; ++$dx) {
        next if $dy == 0 && $dx == 0;
        my $ny = $Y + $dy + 1;
        my $nx = $X + $dx + 1;
        my $flg = 0;
        my $t = substr($board[$ny], $nx, 1);
        last if $t eq '*';
        ### はさんでいる?
        while($t ne '_') {
            if ($t eq '*') {
                $flg = 1;
                last;
            }
            $ny += $dy;
            $nx += $dx;
            $t = substr($board[$ny], $nx, 1);
        }
        ### はさんでるよ!
        if ($flg) {
            $ny = $Y + $dy + 1;
            $nx = $X + $dx + 1;
            $t = substr($board[$ny], $nx, 1);
            for(; $t ne '*'; $ny += $dy, $nx += $dx, $t = substr($board[$ny], $nx, 1)) {
                substr($board[$ny], $nx, 1, '*');
            }
        }
    }
}
for (my $a = 1; $a <= $H; ++$a) {
    print substr($board[$a], 1, $W)."\n";
}

トップページへ