コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 075 A – One out of Three

  • by

INDEX

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

(2022/10/17時点の方針)
しばらくはB問題を小さい番号の方からやっていく。たまにA問題もやるかも。

■問題

●出典

AtCoder Beginner Contest 075のAB問題
https://atcoder.jp/contests/abc075/tasks/abc075_a

●問題文

3 つの整数 A,B,C が与えられます。
A,B,C のうち 2 つは 同じ整数であり、残りの 1 つだけ異なる整数です。
例えば、A=5,B=7,C=5 の場合、A,C の 2 つは同じ整数であり、B は 1 つだけ異なる整数です。
3 つの整数のうち、1 つだけ異なる整数を求めてください。

●制約

  • −100≦A,B,C≦100
  • A,B,C は整数
  • 入力は問題文の条件を満たす

●入力

入力は以下の形式で標準入力から与えられる。

A B C

●出力

A,B,C のうち、1 つだけ異なる整数を出力せよ。

■回答

●愚直に書く

なんかunique みたいなメソッドがあったような気がする…。
uniqだった。そしてこれは重複した要素を取り除くというメソッドなので、今回使えるわけではないか…!?

めちゃくちゃ愚直に考えると、以下の条件分岐で解答にはなるかな?

  • A=BだったらC
  • A≠Bだったら下記
    • A=CだったらB
    • A≠CだったらA
a, b, c = gets.split.map(&:to_i)
if a == b
  puts c
else
  if a == c
    puts b
  else
    puts a
  end
end

通った!
これはもうちょっと上手く書きたい気がするが…。

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。

今回の問題は割愛しようかな…。

●リファクタリング/別アプローチ

先に並べ替えをしておくと条件分岐がシンプルになるのではないかと思ったのでやってみる。
並べ替えをするには、3つの数字を1つの配列に入れないといけないか。

array = gets.split.map(&:to_i).sort

if array[0] == array[1]
  puts array[2]
else
  puts array[0]
end

通った!
なんかもうちょっとうまい方法ありそうだけど、今日はここまでにしておくか…。

●他の方の回答例

コード長一番短い方の回答↓

p eval`tr ' ' ^`

なんだこれは笑。

最上位の方々に限らず^を使っている方が多いなぁ、なんだこれは。ビット演算子か。

●出てきたメソッド等

公式リファレンスを見る訓練。

今日は無し。

■振り返りなど

今日はちょっと不完全燃焼になってしまった。
ビット演算子、ちゃんと確認しておきたい。