CodinGameのSkynet: the Chasm(PUZZLES:3問目)をRubyで解いてみた

LINEで送る
Pocket

CodinGameはこちら ゲームでプログラミング学習する英語のサイト

続いて3問目。問題自体はEASYなんで簡単なんだろうけど、やってみるとなかなかコードが書けない。文章が英語ってことを引いたとしても、初心者だからこその書き始めの難しさが身にしみわたるw。

そういえばTwitterで記事をつぶやいたときに1人だけ「いいね」ってしてくれる海外の方がいるのが嬉しい。Twitterみると、CodinGameやってる人のようですね。これを糧に、さあがんばろう!

3問目のミッション

モータバイクで道を滑走するゲーム。途中で道が滑落しているので、滑落している部分(Gap)をジャンプで飛び越える。始めの位置からGapまでの道のりがRoad(固定)。ギャップを超えた先が着陸するための道(Platform)。着陸後にPlatformを越えると落ちてしまいゲームオーバーとなる。取得できるパラメータは今のスピード(speed)、今の位置(coord_x)。

注意点はジャンプする際にGap+1のスピードが必要なこと。ジャンプで飛べるのは、そのときのスピード分だけだから、Gap+着地点のスピードが必要になる。

出力する内容は、モータバイクの操作。スピードアップ(SPEED)、ジャンプ(JUMP)、スピードダウン(SLOW)、そのまま維持(WAIT)の文字を状況に応じて出力すればOK。

途中途中で状況がわかるように、STDERR.putsで今の状況を表示しながらコード書いていきます。

以下のコードは全然よくないコードですのでご注意を!言わずもがなですがw

code
STDOUT.sync = true # DO NOT REMOVE
# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.

@road = gets.to_i # the length of the road before the gap.
@gap = gets.to_i # the length of the gap.
@platform = gets.to_i # the length of the landing platform.

# game loop
loop do
    speed = gets.to_i # the motorbike's speed.
    coord_x = gets.to_i # the position on the road of the motorbike.
    
    # Write an action using puts
    remaining_distance = @road - coord_x - 1
    
    # To debug: STDERR.puts "Debug messages..."
    next_activity = ""
    if speed == 0 and coord_x == 0
        next_activity =  "SPEED"
    elsif
        if speed > @gap
            if remaining_distance <= 0
                next_activity = "JUMP"
            else
                if speed > @gap + 1
                    next_activity = "SLOW"
                else
                    next_activity = "WAIT"
                end
            end
        else
            next_activity = "SPEED"
        end
        if coord_x >= @road + @gap
            next_activity = "SLOW"
        end
    end
    
    puts next_activity    
    
    STDERR.puts "speed   :" + speed.to_s
    STDERR.puts "coord_x :" + coord_x.to_s
    STDERR.puts "@road   :" + @road.to_s
    STDERR.puts "@gap    :" + @gap.to_s
    STDERR.puts "platform:" + @platform.to_s
    STDERR.puts "remaining_distance :" + remaining_distance.to_s

end

問題を解いてみた感想など

正直汚くて、よくわかんないコードの出来上がりですw。条件文がごちゃごちゃしすぎていて、自分でもわかりにくいのがよく分かる。ジャンプする前にジャンプできる位置を計算しないといけないのかとか色々思いましたが、そんなこと考える余裕すらないのが今のレベルだと実感しました。

他の人の例では、それぞれのアクションに対して端的に記載されている例がありますね。まずは単純でいいんだなって思いました。他の人の例でも動かないケースがあるようです。評価入っているものでも動かないのもあるので実際に動かしてみたほうがいいかもしれません。

では、次の問題へ挑戦です。

LINEで送る
Pocket

カテゴリー: ruby

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です