2014年3月21日金曜日

140321(2)

Ruby


Hashのキーや値の設定の練習

h0 = Hash.new
x = 1
while 2**x < 1000 do
  h0[x] = 2**x
  x +=1
end
p h0

出力結果
{1=>2, 2=>4, 3=>8, 4=>16, 5=>32, 6=>64, 7=>128, 8=>256, 9=>512}

for i in (2..10) do
  h1 = Hash.new
  x = 1
  while i**x < 1000 do
    h1[x] = i**x
    x +=1
  end
  p h1
end

出力結果
{1=>2, 2=>4, 3=>8, 4=>16, 5=>32, 6=>64, 7=>128, 8=>256, 9=>512}
{1=>3, 2=>9, 3=>27, 4=>81, 5=>243, 6=>729}
{1=>4, 2=>16, 3=>64, 4=>256}
{1=>5, 2=>25, 3=>125, 4=>625}
{1=>6, 2=>36, 3=>216}
{1=>7, 2=>49, 3=>343}
{1=>8, 2=>64, 3=>512}
{1=>9, 2=>81, 3=>729}
{1=>10, 2=>100}

140321

Ruby


Stringクラスで用意されているincludeメソッドを使用する問題

「3の倍数と3の付く数字の時だけアホになります」という男がいたとして、
1から1000まで数字を数えた場合、アホになった回数を求めよ。

N=1000
s=0
for i in (1..N) do
if i%3 == 0 || i.to_s.include?('3') then
s += 1
end
end
p s

出力結果
513

2014年3月16日日曜日

140316

Ruby


「数の事典」に
548,834
   548,834=5^6+4^6+8^6+8^6+3^6+4^6
と載っていた。

「6桁の数字で各桁の6乗の和が元の数字になるものは、
548,834だけである」
ということを確かめてみる。

for a in 1..9
  for b in 0..9
    for c in 0..9
      for d in 0..9
        for e in 0..9
          for f in 0..9
          x=a**6+b**6+c**6+d**6+e**6+f**6
          y=a*10**5+b*10**4+c*10**3+d*10**2+e*10+f
            if x == y then
            puts "#{x}"
            end
          end
        end
      end
    end
  end
end

出力結果
548834

2014年3月15日土曜日

140315(2)

Ruby


原始ピタゴラス数の思い出

小学生の頃
算数や図工の時間になんとなく使用していたが、証明には至らず。

中学生の頃
ぶっ飛んだ授業(数学)で一般的に
{x,y}={2ab,a^2-b^2},z=a^2+b^2
と表されることを習う。

思い出はこれくらいにして、
1≦x<y<z≦100なる原始ピタゴラス数を求めてみる。

for x in 1..98
  for y in x..99
    z = Math.sqrt(x**2+y**2)
    if z == z.to_i && z < 101 then
      z = z.to_i
      if x.gcd(y) == 1 && y.gcd(z) == 1 && z.gcd(x) == 1 then
        puts "#{x},#{y},#{z}"
      end
    end
  end
end

互いに素の部分がカッコ悪いので、injectメソッドを使うと、

class Array
  def gcd
    self.inject{|a, b| a.gcd(b)}
  end
end

for x in 1..98
  for y in x..99
    z = Math.sqrt(x**2+y**2)
    if z == z.to_i && z < 101 then
      z = z.to_i
      if [x, y, z].gcd == 1 then
        puts "#{x},#{y},#{z}"
      end
    end
  end
end

となりスッキリする。

出力結果
3,4,5
5,12,13
7,24,25
8,15,17
9,40,41
11,60,61
12,35,37
13,84,85
16,63,65
20,21,29
28,45,53
33,56,65
36,77,85
39,80,89
48,55,73
65,72,97

140315

Ruby


他の勉強が全く出来なかったが、「たのしいRuby第4版」を読み終える。
分からないところはネットで調べながらだったが、少なくとも書いてある
内容については、この書籍一冊で理解できた。   

【注意点】

書籍とサポートページのプログラムリストに多少の誤植あり。

【スケジュール】

仕事の日は、
「昼食休みにプログラムリスト以外の部分を読み、
帰って、実際に実行して確認」
というやり方で勉強。

2/23 1〜5章   ←挿絵があったのは、最初のページだけだったな…
2/24 6章
2/25 7章
2/26 8章の途中
2/27
2/28
3/ 1 8章の途中〜9章
3/ 2 10〜12章
3/ 3 13章       ←この章の図がとても親切だと感じた。
3/ 4 14章
3/ 5 15章
3/ 6 
3/ 7
3/ 8
3/ 9 16〜17章   ←16章(正規表現)は大事。
3/10 18章
3/11 19章
3/12 20章
3/13 21章
3/14 
3/15 22〜23章

2014年3月10日月曜日

140310

Ruby


Dir.globメソッドを勉強中、ワイルドカードで混乱。

*
空文字列を含む任意の文字列と一致。

**/
 */ の0回以上の繰り返しを意味し、 ディレクトリを
再帰的にたどってマッチを行う。
例えば、foo/**/ はfoo/bar/、foo/bar/hogeなど、
配下の全サブディレクトリとマッチ。

2014年3月9日日曜日

140309

Ruby  


配列から要素の取り出し

140302でも同じことをしたが、もう一度やってみる。

ary=[0,1,1,2,3,5,8,13,21,34,55,89,144]
puts "#{ary}"

puts "#{ary.select{|i| i%2==1 }}"

ary.each_with_index do |i, j|
 if i%2==1 then
 puts "#{j+1},#{i}"
 end
end

出力結果
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
[1, 1, 3, 5, 13, 21, 55, 89]
2,1                ←元の配列における順番も出力。
3,1
5,3
6,5
8,13
9,21
11,55
12,89

2014年3月6日木曜日

140306

Ruby


Array#permutationを用いて、下の覆面算を解いてみる。

  SEND
+MORE
-----
 MONEY

(0..9).to_a.permutation(8) do |s, e, n, d, m, o, r, y|
  next if s == 0 or m == 0
  send = s*1000 + e*100 + n*10 + d
  more = m*1000 + o*100 + r*10 + e
  money = m*10000 + o*1000 + n*100 + e*10 + y
  if send+more == money then
  print "#{send} + #{more} = #{money}" 
  end
end

2014年3月2日日曜日

140302

Ruby


イテレータ

irb(main):001:0> [1,2,3,4,5].map{|i|i*2}
=> [2, 4, 6, 8, 10]
irb(main):002:0> [1,2,3,4,5].map{|i|i%2==1}
=> [true, false, true, false, true]
irb(main):003:0> [1,2,3,4,5].select{|i|i%2==1}
=> [1, 3, 5]

2014年3月1日土曜日

140301

Ruby


コマンドプロンプトの画面のコピー

1.右クリック 範囲指定
2.範囲指定してEnter
3.保存先(メモ帳、TeraPad)に貼り付け