2015年4月8日水曜日

Power of Thor

概要

Thorさんをゴールまで導く。 移動する方向を8方向で指定する。
N: 北
W: 西
S: 南
E: 東
NE: 北東
NW: 北西
SE: 南東
SW: 南西

コツ

スタート時点の座標を計算し、移動の都度、その情報を更新する。

回答例

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

class Player
{
    static void Main(String[] args)
    {
        string[] inputs;
        inputs = Console.ReadLine().Split(' ');
        int LX = int.Parse(inputs[0]); // the X position of the light of power
        int LY = int.Parse(inputs[1]); // the Y position of the light of power
        int TX = int.Parse(inputs[2]); // Thor's starting X position
        int TY = int.Parse(inputs[3]); // Thor's starting Y position
        int X = LX-TX;
        int Y = LY-TY;
        // game loop
        while (true)
        {
            int E = int.Parse(Console.ReadLine()); // The level of Thor's remaining energy, representing the number of moves he can still make.
            Console.Error.WriteLine("TX:"+TX+" TY:"+ TY+" LX:"+LX +" LY:"+LY +" X:"+X+" Y:"+Y);

            if(X == Y){
                Console.WriteLine("SE");
                X--;
                Y--;
            }else if(X>0 && Y>=0){
                Console.WriteLine("E");
                X--;
            }else if(X==0 && Y<0){
                Console.WriteLine("N"); 
                Y++;
            }else if(X==0 && Y>0){
                Console.WriteLine("S"); 
                Y++;
            }else if(X<0 && Math.Abs(X) != Y){
                Console.WriteLine("W"); 
                X++;
            }else if(Math.Abs(X) == Y){
                Console.WriteLine("SW");
                X++;
                Y--;
            }
        }
    }
}

2014年10月8日水曜日

The Descent

宇宙船で平地に降下していきます。
ただし、山が邪魔なので、砲撃して山を切り崩す必要があります。
1段階の高さで、それぞれ1回ずつしか砲撃できません。

そのためには何をすれば良いでしょうか?
ONBOADINGが参考になるでしょう。
考慮すべき点
  • どの山に砲撃させるか
入力(テンプレで用意されている)
  • 1行目
    • int SX : 位置x 左端がゼロ(最初の山の上空)、右端が7
    • int SY : 位置y 最初が10、平地が1
  • 2行目から9行目
    • int MH : 山の高さ 9~0。大きければ高い。左から右の順
出力
  • "FIRE" 真下の山を砲撃
  • "HOLD" 何もしない

回答例

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

class Player
{
    static void Main(String[] args)
    {
        string[] inputs;
        // game loop
        while (true)
        {
            inputs = Console.ReadLine().Split(' ');
            int SX = int.Parse(inputs[0]); //位置x
            int SY = int.Parse(inputs[1]); //位置y
            int target = -1; // 砲撃対象の山のID。初期値 -1
            int maxHeight = 0;; // 最大の山の高さ。初期値 0
            for (int i = 0; i < 8; i++)
            {
                int MH = int.Parse(Console.ReadLine()); // 山の高さ 9 から 0。左から右へ。
                 Console.Error.WriteLine("SX:"+SX+" SY:"+SY + " MH(i):" +MH+"("+i+")"); //確認のため標準エラー出力へ
                 if(maxHeight == 0 || maxHeight < MH){ // maxHeight が初期値だったら、または、maxHeight がそれまでのものより大きかったら
                    maxHeight = MH; // maxHeightを更新
                    target = i; // 砲撃対象を更新
                 }
            }

            if(SX==target){ // 
                Console.WriteLine("FIRE"); // 砲撃
            }else{
                Console.WriteLine("HOLD"); // スルーする
            }
        }
    }
}

所感

まだ変数と IF しか出てきませんね...

2014年10月7日火曜日

Skynet: the Chasm

エキサイトバイク的なやつ。
バイクを操作してギャップをジャンプさせます。
失敗すると落ちて死にます。

考慮すべき点
  • ギャップをジャンプさせるまでのスピード調整。速すぎるとオーバーランして死にます。遅ければギャップを飛び越えることができません。
  • どのタイミングでジャンプさせるか
入力(テンプレで用意されている)
  • int R : ギャップの前までの路面の長さ
  • int G : ギャップの長さ
  • int L : 着地後の路面の長さ
  • int S : バイクのスピード
  • int X : バイクの位置
出力
  • "SPEED" 加速
  • "JUMP" ジャンプ
  • "SLOW" 減速
  • "WAIT" そのまま待つ
私は最初、if(X==13) などのコードを大量に書いてテストをクリアしましたが、スコアはゼロ点でした。テストをクリアするだけのためのコードはダメです。

回答例

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

class Player
{
    static void Main(String[] args)
    {
        int R = int.Parse(Console.ReadLine()); // the length of the road before the gap.
        int G = int.Parse(Console.ReadLine()); // the length of the gap.
        int L = int.Parse(Console.ReadLine()); // the length of the landing platform.
        // game loop
        while (true)
        {
            int S = int.Parse(Console.ReadLine()); // the motorbike's speed.
            int X = int.Parse(Console.ReadLine()); // the position on the road of the motorbike.
            Console.Error.WriteLine("G:"+G+" R:"+R + " L:"+L + " X:"+X + " S:"+S); //デバッグ用
   
            //(ギャップ+1)のスピードであればちょうど乗り越えられることが試行錯誤から分かったので、(G+1)を目標速度とする
            if((G+1) > S && X < (R-1)){ // 遅すぎる、かつ、ギャップの手前にいるので加速
                Console.WriteLine("SPEED");
            }else if(X == (R-1)){ // ジャンプ地点(これも試行錯誤で求めた)
                Console.WriteLine("JUMP");
            }else if(X > (R-1) || (G+1) < S){ //速すぎる、または、ギャップを通過したので減速
                Console.WriteLine("SLOW");
            }else{   // その他(ちょうど良いスピード、かつギャップの手前)
                Console.WriteLine("WAIT");
            }
        }
    }
}

所感

まだ変数と IF しか出てきませんね...

ONBOARDING

迫りくる敵を撃ち落とすゲーム。

Console.WriteLine("ターゲット名");

で攻撃。

標準入力からのデータを
Console.ReadLine().Split(' ')
で取ってくる部分などは、最初から組み込まれている。
そこで得られた次の変数をどう使うかがキーポイントになります。

String enemy //敵の名前
int dist    // 距離

毎回、最も近い敵に対して攻撃をしないと負けです。よって複数いる敵のうち、最も近いものを検索するコードを書かないといけません。


回答例

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

class Player
{
    static void Main(String[] args)
    {
        string[] inputs;

        // game loop
        while (true)
        {
            int count = int.Parse(Console.ReadLine()); // The number of current enemy ships within range
            int minDist = 0; //最短距離。とりあえず仮でゼロ
            string target = ""; // 攻撃対象の敵の名前
            for (int i = 0; i < count; i++)
            {
                inputs = Console.ReadLine().Split(' ');
                String enemy = inputs[0]; // 敵の名前
                int dist = int.Parse(inputs[1]); // 敵までの距離
                if(minDist == 0 || minDist > dist){ // 最短距離を求める。配列の一番目の場合と、いままでの距離より短い場合は更新する
                    minDist = dist; //最短距離を更新
                    target = enemy; //攻撃対象の敵の名前
                }
                Console.Error.WriteLine("enemy:" + enemy + " dist:" + dist + " minDist:" + minDist); //デバッグ用
            }
            Console.WriteLine(target); //攻撃実行
        }
    }
}

所感

変数、型(int, String)、if、条件式を理解していれば解ける問題です。

CodinGame について

ゲームを解きながらコーディング力を向上させよう。

 http://www.codingame.com/

言語は C#, PHP, JavaScript, Java など、主要なものはすべて網羅されています。

参考:「プログラミングの勉強を本気でWebゲーム化した「CodinGame」が時間泥棒確定!」