Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21097

AtCoder Beginners SelectionでRuby学習【Shift only】繰り返し処理と配列の上書き

$
0
0

はじめに

Ruby学習の一環として「競技プログラミング(競プロ)」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「AtCoder Beginners Selection」の四問目(Shift only)より。
https://atcoder.jp/contests/abs

自分が使った解法と、他の方の解法を比べながらまとめていきます。

問題

N個の正の整数A1,...,ANが与えられます。
この整数が全て偶数である時、次の操作を行います。
・整数全てを2で割ったものに置き換える。
最大何回操作を行えるか求めなさい。

制約
1 ≤ N ≤ 200
1 ≤ Ai ≤ 10**9

入力は以下の形で与えられる。

NA1A2...AN# 例381240

上記の例だと最大2回割ることができるので

出力例# 上記例の場合=>2

解答①

まずは僕が最初に書いたコードです。

count=0N=gets.to_ilists=gets.split(" ").map(&:to_i)whilelists.all?(&:even?)dolists.map!{|x|x/2}count+=1endprintcount

第一回の問題で学んだメソッド(gets split map)を使って入力を受け取り、
AtCoder Beginners SelectionでRuby学習【PracticeA】標準入力
第二回で学んだメソッド(all? even?)で判定を行いつつ、
AtCoder Beginners SelectionでRuby学習【Product】様々な解法から学ぶ
while文やmap!メソッドを使って解答しました。

まずは、ここで初めて使ったwhile文、map!メソッドについてまとめていきます。

while文

条件式が真である間は、指定した処理を繰り返します。

while条件式do実行する処理1実行する処理2end

今回の解答では、偶数判定を行う「even?メソッド」を「all?メソッド」を使って配列の要素全てにあて、
全て偶数である場合には、指定した処理を行うようにしました。

map!メソッド

配列の要素を、処理結果で上書きします。

配列の入った変数.map!{|変数名|処理内容}#例lists=[10,20]lists.map!{|x|x/2}printlists=>[5,10]

ちなみに、
入力の時に使用しているmapメソッドでは、
配列の上書きは行われません。戻り値として配列を生成しています。

#例lists=[10,20]printlists.map{|x|x/2}=>[5,10]printlists=>[10,20]

以下は他の方の解答になります。

解答② mapメソッドで操作の回数(解答)を戻り値として戻す

配列の要素を「2で割れる回数」にして配列として戻し、
その要素の中で最も小さい数を「minメソッド」を使って出力しています。

getsputsgets.split(" ").map{|f|f=f.to_ic=0whilef%2==0f/=2c+=1endc}.min

minメソッド(Arrayクラス)

配列の最小の要素を戻します。

#例lists=[35,10,20]printlists.min=>10

最後に

以上、AtCoder Beginners SelectionでRuby学習【Shift only】から学んだメソッドをご紹介しました。
他の方の解答も見れるのが便利ですね。かなり勉強になります。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。


Viewing all articles
Browse latest Browse all 21097

Trending Articles