あるエンジニアのAtCoder奮闘記

東京都港区にあるアミフィアブル株式会社のエンジニアが、AtCoderで解いた問題について振り返ったりしていく会社公認のブログです。

AGC 024-A Fairness で新しい言語に挑戦してみる(Go)

irisruneです。今回はかなり軽めの記事です。

社内で今プログラミング言語始めるなら何がいいかという話題があり、 とりあえず調べてたらGo言語が割とおすすめに挙がっていたので試しに使ってみました。

https://atcoder.jp/contests/agc024/tasks/agc024_a

この問題、勘のいい人ならUnfairになるケースがないのでは?という察しが付くのではないでしょうか。 それどころか32bit整数で済んでしまう非常にあっさりした問題です。 嘘吐きました、Kは明らかに32bit整数では済まないですね。

前回の問題と配点逆なのではと思いましたがでも200点だと流石に難しいですね。

package main

import "fmt"

func main() {
    var a, b, c, k int
    fmt.Scan(&a, &b, &c, &k)
    if k % 2 == 0{
        fmt.Println(a - b)
    }else{
        fmt.Println(b - a)
    }
}

Go言語についての話は後に回すとして、方針について軽く説明を。

解説のように3人のもつ値をA+x,A,Bとおけなくても、A,B,Cとおいて2回操作を行うと解答に辿り着けると思います。具体的にどうなるかというと、

  • 0回目の操作後:答えはA-Bになる。
  • 1回目の操作後:B+C,C+A,A+Bになるので答えはB-Aになる。
  • 2回目の操作後:2A+B+C,A+2B+C,A+B+2Cになるので答えはA-Bになる。

ここから単純にA-BB-Aの繰り返しになると結論付けてもいいです。もう少し厳密に考えると、 2回目の操作後はA+(A+B+C),B+(A+B+C),C+(A+B+C)となるわけですが、 これは結局初期状態と同じであると考えられます。

コードレビューは今回も見送ります。

Go言語を使った所感

  • 公式ページで簡単にコードを試せるのはプログラミング初心者への導入としてはよいと思いました。
    • さすがに競プロに使うなら(今回のコード程度でも)自前の環境を使うべきだと思います。
  • 実行速度や関数の機能はC言語に近いものがある一方で変数の宣言がKotlinっぽかったりすると思いました。
  • 今回のような簡単なコードだとC言語とそれほど見分けがつかないですね…
  • (64bit環境なら)雑にintを使うだけで64bit整数になるのは楽だと思いました。

C言語を扱った経験があればかなり入りやすい言語だとは思いますが、 スクリプト言語しか(スクリプト言語も)触ったことがない人に向いているかはもう少し触ってみないと判断できないですね。

雑記

  • テーマをデフォルトから差し替えてみましたが、コードを黒背景で表示する方法がわからなくて困っています。
  • 次のRatedまでには500点問題には手が出るようにしたいですね。