コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 021 A – 足し算

■はじめに

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

■問題

●出典

AtCoder Beginner Contest 021のA問題
https://atcoder.jp/contests/abc021/tasks/abc021_a

●問題文

正整数 N と、 2 の累乗数 1,2,4,8 があります。
これらのうち、 同じ 2 の累乗数をいくつ使っても良い ので、それらの和が N となるような組み合わせを 1 つ求めてください。 組み合わせが複数考えられる場合は、そのうちのどれを出力しても構いません。
例えば N=5 のとき、5=1+2+2 となることから 1 つの組み合わせとして 1,2,2 が考えられます。

●入力

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

N
  • 1 行目には、正整数 N(1≦N≦10) が与えられる。

●出力

1 行目に、組み合わせを構成する整数の個数 K を出力せよ。
2 行目から K 行には、組み合わせを構成する K 個の整数をそれぞれ出力せよ。 和がちょうど N になり、組み合わせを構成する各整数が 2 の累乗数であるならば正解として扱われる。それ以外の場合は不正解として扱われる。
末尾の改行を忘れないこと。

■回答

●愚直に書く

累乗数が1 2 4 8とあるけど、「1をN個出力する」というのが一番ラクなのでは…!

n = gets.to_i
puts n
n.times { puts 1 }

通った!

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

上記以外の方法が全然思いつかない。
やろうとすると条件分岐が多くなってややこしいことになりそう…。

●他の方の回答例

細かい書き方の違いはあれど、上位層の皆さんは上記の考え方だった。

●出てきたメソッド等

  • 特に無し

■振り返りなど

問題文でややこしい条件が出てきたりするけど実際にコードに活かすのは一部分、ということはよくあるので、その見極めも重要だなと思った。