PerlとRubyがくしゅう帳

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_です。 最近は主にPerl関連の勉強会やコミュニティに参加しています。

カテゴリ: ruby

今回のプログラミングのお題は、最大公約数と最小公倍数。

以前に、確か、基本情報処理技術者試験のアルゴリズムの問題で、求める問題を解いたと思うんだけど、そのアルゴリズムは見事に忘れてしまいました\(^o^)/
その時は、Rubyじゃなくて擬似言語を手書きでゴリゴリ書いていたかなぁ。

とりあえず、お題はコチラ。

GCD and LCM

・20億以下の正の整数2つが与えられ、その最大公約数と最小公倍数をもとめよ。

ロジックを思案。


思いついたのは、

・まず、両方の数字の共通な素因数で分解。
・最大公約数は素因数の掛け合わせ。
・最小公倍数は、素因数の掛け合わせ×2数の分解残。

たぶん、これでいけそうな気がする。早速、Rubyでコードを書いてみました。
そうそう、分解する素数を求めるコードは、メソッドを定義する技を使ってみました。

def nextsosuu(i)
i = i + 1
j = 2
while i != j do
if i%j==0 then
i=i+1
j = 1 
end
j = j+1
end
return i
end

file = open("gcdlcm.txt")
while array = file.gets.split(/\s/)
for i in 0..1 do
array[i] = array[i].to_i
end
x = array[0]
y = array[1]
i = 2

mem = Array.new
while i<=x && i<=y
while (x%i != 0 || y%i != 0) && (i<=x && i<=y) do 
i = nextsosuu(i)
end
if i>x && i>y then
break
end
mem[mem.size] = i 
x = x/i
y = y/i
end
yakusuu = 1
mem.each do |now|
yakusuu = yakusuu * now
end
print(yakusuu," ",yakusuu * x * y,"\n")
end


なんとか、コード化できました!

今回は、ちょっと上位な感じの問題にチャレンジしてみました。

ズバリ、連立方程式を解く!

コードのロジックを考えないといけないのはもちろん、連立方程式なんて中学の算数の授業以来やって無い!
記憶を呼び戻しながら、頑張ってみました。

問題は、コチラ。

Simultaneous Equation

昔、関数fだの、連立方程式だの、なかなか実用性がピンと来なかったおに、プログラミングを初めてから重要性というか、使い道がなんとなくわかってきた気がします。

ax + by = c
dx + ey = f
この方程式のa~fの値に対応するx,yを求めるコードです。
とりあえず書いてみた・・・。


file = open("simultan.txt")
while text = file.gets do
array = text.split(/\s/)
for i in 0..5 do
array[i] = array[i].to_i
end
x = (array[2] * array[4] - array[5] * array[1]).to_f/(array[0] * array[4] - array[3] * array[1]).to_f
y = (array[2] * array[3] - array[5] * array[0]).to_f/(array[1] * array[3] - array[4] * array[0]).to_f
puts(x)
puts(y)
end
file.close

xとy、それぞれをたすき掛けして、式の差を求める方法でコードを書いてみました。
問題文では、答えを小数点以下第4位を四捨五入せよとのこと。
う~ん、まだのそ辺りは学習してないので、とりあえず答えは未完成で保留ということにしておこう。

もうちょっと数字くらすを勉強してから再チャレンジ!

今日のRubyプログラミングのお題は、コチラ。

Is it a Right Triangle?

与えられる三角形の3辺の長さ。その三角形が直角三角形かどうか調べるプログラム。
むむむ、やっと頭を使う感じの問題になってきた。

お題形式は、テキストでスペースで区切られた3つの数字データが与えられ、直角三角形ならYES、違えばNOを出力するプログラム。

ふむ、直角三角形である条件は・・・・

そうそう、ピタゴラス!ピタゴラスの定理だ!

1:1:√2

√3:√4:√5

昔、算数で習った記憶がよみがえる!さて、これをRubyのコード化してみよう。




file = open("dataset.txt")
i = file.gets.to_i
i.times do
array = file.gets.split(/\s/)
array[0] = array[0].to_i
array[1] = array[1].to_i 
array[2] = array[2].to_i
if (array[0]^2 + array[1]^2 == array[2]) || (array[0]^2 + array[2]^2 == array[1]^2) || (array[0]^2 == array[1]^2 + array[2]^2)
puts("YES")
else
puts("NO")
end
end
file.close


3パターンを総当りで検証するコードを書いてみた。

もうちょっと深く考えてみると、3つの数字の1番大きい数字、長辺とその他2辺を先に判別するのもアリかな?3つの数字が等しい場合でも問題ない様なコードなら、そっちの方がスマートかな?

ファイル読み込み、文字列の数字変換、if条件分岐、この辺りは大体マスターしたかな。
Ruby、楽しい!プログラミング、楽しい!

サクサク行きます!

お題にクイズ形式で答えてコードを書いていくのは楽しいですね。

今日のお題はこちら。

Digit Number

ファイルの読み込みと、読んだデータの処理が味噌な問題。

1つずつ、覚えていきます。

読み込んだ文字の操作を調べつつコードを書いてみた。


file = open("number.txt")
while text = file.gets
array = text.split(/\s/)
print(((array[0].to_i + array[1].to_i).to_s).length,"\n")
end
file.close


number.txtにデータを書きこんで、

1行読んで、空白でデータを分ける。分けた文字データを配列の箱に入れて、それを数字に変換して演算。

色んなメソッドのコンビネーション技で今日も問題クリア!

今日もRubyのコードを考えてみた。

今日のお題は、こちら。

List of Top 3 Hills

ファイルを読み込んで、読み込んだデータのTop3を順番に出力するプログラム。
ファイル読み込みの作法と、あとは並べ替えの部分をどうコードで表すかがポイントかな。

そんなに難しい命令も使わずに書けそうなので、サラサラっと書いてみたのがコチラ↓










array = [0,0,0]
file = open("mountlist.txt")
while text = file.gets
if array[0] < text.to_i
array[2] = array[1]
array[1] = array[0]
array[0] = text.to_i
elsif array[1] < text.to_i
array[2] = array[1]
array[1] = text.to_i
elsif array[2] < text.to_i
array[2] = text.to_i
end
end
puts(array[0],array[1],array[2])
file.close


答えを格納する配列を先に作って、比較しながらトップを入れ替えてみました。

まだまだ、このくらいの問題なら大丈夫。
どんどんチャレンジしていこう!

このページのトップヘ