とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

CodeIQの「西暦年を平成年に変換する数学パズル!」に挑戦しました

結果は最短ステップの7に至らず9ステップ。

[2]014->40[14]->40[19]6->40[3]616->(4096)16->6[41]6->6(16)(81)6->6(49)6->(676)->26


解答はプログラムで最短の候補を出してそれを手計算で更に縮める方法をとったが、どうやら出した最短の候補に最短ステップに至る解答がなかったらしく正解に至らず。


複数箇所を計算するプログラムを書くのがめんどくさくて1箇所だけを計算させてやる手段に逃げたのが間違いだったかな−と思うけど、それを実装する余裕がなかったのでまた機会があれば実装して再検討してみたい。


ちなみ最短候補を出すのに書いたのはこんなコードでした。

require "mathn"

MAX_DEPTH = 8
MAX_LENGTH = 9
ANS = "26"

def rec(ans,  records)
  return if records[ans].size > MAX_DEPTH
  return if ans.size > MAX_LENGTH

  ans.size.times do |i|
    (i...ans.size).each do |j|
      head = ans[0...i]
      part = ans[i..j].to_i
      last = ans[j+1..-1]

      next if ans[i] == '0' or part == 1

      if (sqrt = Math.sqrt(part)).is_a? Integer
        change = [head,  sqrt,  last].join
        if records.include?(change)
          next if records[change].size <= records[ans].size + 1
        end
        path = records[ans] + [head + "(#{part})" + last]
        records[change] = path
        if change == ANS
          puts (records[change] + [ANS]).join('->')
          return
        end
        rec(change,  records)
      end

      pow = part ** 2
      change = [head,  pow,  last].join
      if records.include?(change)
        next if records[change].size <= records[ans].size + 1
      end

      path = records[ans] + [head + "[#{part}]" + last]
      records[change] = path
      if change == ANS
        puts (records[change] + [ANS]).join('->')
        return
      end
      rec(change,  records)
    end
  end
end

ans = "2014"
rec(ans, {ans => []})

深さ(ステップ)上限と、幅(数字の長さ)上限を設けて計算量を減らしましたが、
深さか幅を上げようもんなら、計算量が増えて答え出すまでに時間がかかりすぎて断念した。


もっとアルゴリズムとか勉強せなあかん・・・

SQLアンチパターン

前回の読書会の本は「SQLアンチパターン」だったが結構盛り上がった。

SQLアンチパターン
SQLアンチパターン
posted with amazlet at 13.09.10
Bill Karwin
オライリージャパン
売り上げランキング: 14,790


私は現場でDBとかを見たことがないのだが、実際に現場でDBを触っていた人間からするとわりとあるあるだったりするらしい。


200を超える正規化されていないテーブルや無駄なインデックスの乱発、歯抜けの穴埋めなど実際にあるらしく、現場を知ってる人間と読むと大盛り上がりだったので楽しかった。


が、本書の中の幾つか(画像ファイルなどのBLOBもDBに入れたほうがいいとか)は「ほんとうにこれでいいの?」と懐疑的になるものもあるので、ご利用は各自の判断でという結論。


日本語版で追記された部分にも誤りがあるということで、補足とかも入って有意義な読書会だった。


一人で読むよりも大勢と意見を交わしながらのほうが面白い本かもしれないので、機会があれば大勢で読んで意見を交わすといいと思います。

久しぶりの近況報告

なんというかお久しぶりです。


もはや誰が見てるのかすらわからないけど見てる人がいるかもしれないので挨拶だけはしてみた。


で、近況報告。


まさかの結婚をいたしましてハワイに行ったりしてました。


人生において結婚できると思ってなかったので一生一人で生きて、毎晩@burujiとか@sin280とかとSkypeしながらゲームしてるんだろうなと思ってましたが人生奇妙なことがあるもんですねー。(まだどこかで夢かドッキリじゃないかと思ってる。)


ちなみにSkypeは継続したかったのですが、Skypeしてると嫁の相手をしなくなるので怒られてまったくできない状態です。
その辺はOMUとおんなじ。


1点違うことがあるとすれば、嫁がSkypeから聞こえてくるブルジの声がうるさくて嫌いらしいw


一応補足をしておくと、前の社宅にいた時に我が家で鍋をしていた会社の同期からはSkypeを通して聞こえるブルジキャラに魅了された人間が多く、まじブルジの人気に嫉妬状態。結婚式でもブルジは参加した友人達からチヤホヤ?されてたらしい。


なんかブルジの近況報告みたいになってきたので話を戻すと。


どうやらリア充に分類される人間になったらしいのだが、リア充辛い。


いや、マジで本読む時間も減ったし、パソコン触る時間も凄い減った。


休日はどこかに連れ回されるし、勉強会に行きにくくなったし。


で、そういう話をOITの飲み会とかですると@firewitch とかに


「なんで結婚したんですかwww」


とか言われるわけですよ。


決まってんじゃん


寝るときくっついて寝るとすんげー幸せだから。


まぁ、大型台風に巻き込まれてみたら色々大変だけど面白かったのでそのんまんまでいいかと思ったともいう。


多分あと30年は笑いのネタに困らずに生きていける気がする。

shared_examples_forが便利

RSpecのテストをグルーピングして実行できる#shared_examples_forが便利。

Shared example group - Example groups - RSpec Core - RSpec - Relish

これを使えばテストコードが簡潔になるのでテストコードの量を減らすことができる。

require "set"

shared_examples_for "a collection" do
  let(:collection) { described_class.new([7, 2, 4]) }

  context "initialized with 3 items" do
    it "says it has three items" do
      collection.size.should eq(3)
    end
  end

  describe "#include?" do
    context "with an an item that is in the collection" do
      it "returns true" do
        collection.include?(7).should be_true
      end
    end

    context "with an an item that is not in the collection" do
      it "returns false" do
        collection.include?(9).should be_false
      end
    end
  end
end

describe Array do
  it_behaves_like "a collection"
end

describe Set do
  it_behaves_like "a collection"
end

ブロックを渡してやることもできるしパラメータを渡してやることもできる。

require "set"

shared_examples_for "a collection" do
  let(:collection) { described_class.new([7, 2, 4]) }

  context "initialized with 3 items" do
    it "says it has three items" do
      collection.size.should eq(3)
    end
  end

  describe "#include?" do
    context "with an an item that is in the collection" do
      it "returns true" do
        collection.include?(7).should be_true
      end
    end

    context "with an an item that is not in the collection" do
      it "returns false" do
        collection.include?(9).should be_false
      end
    end
  end
end

describe Array do
  it_behaves_like "a collection"
end

describe Set do
  it_behaves_like "a collection"
end
require "set"

shared_examples_for "a collection object" do
  describe "<<" do
    it "adds objects to the end of the collection" do
      collection << 1
      collection << 2
      collection.to_a.should eq([1,2])
    end
  end
end

describe Array do
  it_should_behave_like "a collection object" do
    let(:collection) { Array.new }
  end
end

describe Set do
  it_should_behave_like "a collection object" do
    let(:collection) { Set.new }
  end
end

で、ここまでは公式に書いてあるので自分の持ってるRSpecを書きなおしてみたら動かなかった。
ちなみにこんな感じのコードを実行すると以下のようにundefined methodって言われる。

require "set"

shared_examples_for "a collection object" do
  describe "<<" do
    it "adds objects to the end of the collection" do
      collection << 1
      collection << 2
      collection.to_a.should eq([1,2])
    end
  end
end

describe Array do
  it 'sample_examples_for_test' do
    it_should_behave_like "a collection object" do
      let(:collection) { Array.new }
    end
  end
end

describe Set do
  it_should_behave_like "a collection object" do
    let(:collection) { Set.new }
  end
end
Failures:

  1) Array sample_examples_for_test
     Failure/Error: it_should_behave_like "a collection object" do
     NoMethodError:
       undefined method `it_should_behave_like' for #
     # ./sample_spec.rb:15:in `block (2 levels) in '

色々考えて試行錯誤を重ねた結果ようやく自分のミスに気づく。
it句の中にit_should_behave_likeって書いても動かないらしい。


といわけで、RSpecを書いてる中で上記のようにundefined methodって言われたら書く場所が違うことを疑ってみましょう!


それはともかくshared_examples_for便利!

レンズ購入

デジイチを持って7年も経っているのにそんなに使っていないので未だに初心者ということで、レンズがほしいなとおもって2ちゃんの初心者スレを覗いて勉強。


スレの初心者へのおすすめだった撒き餌(50m)かパンケーキ(40mm)があったけど、パンケーキがCanonのレンズがキャッシュバックの対象だということでいい機会だから買ってみた。


キヤノン:ゴールドラッシュ[プレミアム]キャンペーン

Canon EF40mm F2.8 STM [EF4028STM]
キヤノン (2012-06-22)
売り上げランキング: 240


ついでにプロテクタも購入。


レンズフードは売り切れでなかったので取り寄せるぐらいなら通販だなと思ったので購入は見送り。
家に帰ってレンズフード見たけどこれならいらないかな?


Canon レンズフード ES-52 [L-HOODES52]
キヤノン (2012-06-22)
売り上げランキング: 2,889


ちなみにキャッシュバックは今日までなので買うなら急げ!
そして郵便局に急いで速達だ!

釣りに行って

昨日は久しぶりに釣りに行ってきた。

友達に車を出してもらって長浦沖堤に行ってきた。


渡船から帰ってきた人がシーバスを5〜6匹挙げてたのでかなり期待できる気がした。
まぁ、気のせいなんだが。


最初の1投目でシロギス釣れて、投げれば釣れたので3匹目でシロギスは友達に任せてルアーに浮気。


3回ぐらいバイトはあったけど合わせられなかったのでそのまま1匹も釣れずに終了。


釣れたシロギスは友達が全部くれたのでそのままさばいて唐揚げに。


美味かった。