不格好エンジニア (引っ越しました)

wordpress.comから引っ越しました。

コーディング面接対策サイトCodilityの練習問題を解いてみた(MinMaxDivision)

問題

配列AをK個に分割し、それぞれ分割したブロックの和を求める。 すべての配列の要素は5以下。

A = [2, 1, 5, 1, 2, 2, 2], K = 3, M = 5 なら

[2, 1, 5, 1, 2, 2, 2], , なら、分割したブロックの和の最大値 15; [2], [1, 5, 1, 2], [2, 2] なら、分割したブロックの和の最大値 9; [2, 1, 5], [], [1, 2, 2, 2] なら、分割したブロックの和の最大値 8; [2, 1], [5, 1], [2, 2, 2] なら、分割したブロックの和の最大値 6.

それぞれのパターンで算出した分割したブロックの和の最大値の中で、最小値を求めることがgoal。

Codility

回答

K == 1 なら各要素の総和(high)に K == 配列の長さなら、各要素の中で最大のもの(low)が答えに それ以外の場合なら、lowとhighの間に答えがあるはずなので、BinarySearchで、ちょっとずつ計算する

#A = [2,1,5,1,2,2,2]

def solution(k, m, a)
  if k == 1
    return a.inject(0) {|sum, x| sum + x }
  elsif k == a.length
    return a.max
  else
    # use binary search
    low = a.max
    high = a.inject(0) {|sum, x| sum + x }

    while (low <= high) do
      mid = (low + high) / 2
      p "mid = #{mid}"
      if check(a, k, mid)
        high = mid - 1
      else
        low = mid + 1
      end
    end
    return low
  end
end

def check(a, k, mid)
  sum = 0
  blocks = 0

  a.each {|e|
    if ( (sum + e) > mid )
      sum = e
      blocks += 1
      return false if blocks >= k
    else
      sum += e
    end
    #puts "sum = #{sum}, blocks = #{blocks}, k = #{k}, mid = #{mid} "
  }
  return true
end

p solution(3,5,A)

コーディング面接対策サイトCodilityの練習問題を解いてみた(TapeEquilibrium)

問題

テーブを前半と後半に切断して差分を比較し、最も少ない差分を返す

Test results - Codility

回答

headにテープの前半部分を、tailにテープの後半部分を格納する。 インデックスを動かすごとにdiffを再計算する。

def solution(a)
  sum = a.reduce(:+)

  head = a[0]
  tail = sum - a[0]
  min_diff = 10000

  for i in 1...a.length
    diff = (head-tail).abs
    min_diff = [min_diff, diff].min
    head += a[i]
    tail -= a[i]
  end
  min_diff
end
# debug

arr = [3,1,2,4,3]
p solution(arr)

arr1 = [-1, 1]
p solution(arr1)

その他

rubyのreduce知らんかった。。。

コーディング面接対策サイトCodilityの練習問題を解いてみた(FrogJmp)

問題

カエルが目標に到達するためには、最低何回、ジャンプする必要があるか

Codility

回答

def solution(x, y, d)
  ((y - x).to_f / d).ceil
end

その他

割る前にto_f しないと、小数が切り捨てられてしまうことに注意。 パフォーマンスを考えると、ループさせない方が良い。

1-TimeComplexity

線形代数 ベクトルと固有値 (大学入門ドリル)の読書メモ

読んだ本

Kobito.YtQg7o.png

Amazon.co.jp: 線形代数 ベクトルと固有値 (大学入門ドリル): 丸井洋子: 本

学んだことと参考リンク

ベクトルとその性質を知ろう

ベクトルどうしの和や定数倍を定義できて、いくつかの計算規則が成り立つことを知る。

行列代数これだけ

ベクトルどうしの関係を判定しよう

ベクトルの線形従属と線形独立について,幾何学的なイメージを捉える。 f:id:tjnet555:20160510011429j:plain

1.2 ベクトル空間と基底

ベクトルに内積を定義しよう

内積を定義すると、色々なものを美しく簡潔に表現できる

ベクトル3

固有値を求めて行列を対角化しよう

固有値の図形的な意味

f:id:tjnet555:20160510005721j:plain

対角化することのメリット

行列のn乗が綺麗に求められる!

linear_lecture.pdf

感想

コーディング面接対策サイトCodilityの練習問題を解いてみた(CyclicRotation)

問題

与えられた配列aの各要素をk回,右に動かす(このとき、最後尾の要素は先頭に持ってくる)。

Codility

回答

def solution(a, k)
  b = []
  for current_index in 0..(a.length-1)
    new_index = (current_index + k) % a.length
    b[new_index] = a[current_index]
  end
  b
end

p solution([3,8,9,7,6], 3) == [9, 7, 6, 3, 8]
p solution([3,8,9,7,6], 0) == [3, 8, 9, 7, 6]
p solution([3,8,9,7,6], 5) == [3, 8, 9, 7, 6]

感想

パフォーマンスは気にしなくて良いらしい。 kが配列の要素数よりも大きい場合を考慮する必要がある。

コーディング面接対策サイトCodilityの練習問題を解いてみた(BinaryGap)

問題

Codility

nを二進数にして、1に囲まれた0の数を数える

回答

def solution(n)
  s = n.to_s(2)
  zeroes = s.split('1')
  zeroes.pop if n % 2 == 0
  return 0 if zeroes.empty?
  zeroes.map{ |z| z.length }.max
end


# debug

puts solution(20) == 1
puts solution(6) == 0
puts solution(1041) == 5
puts solution(255) == 0
puts solution(529) == 4
puts solution(66666) == 5
puts solution(1024) == 0
puts solution(9) == 2
puts solution(11) == 1

感想

この書き方、知らなかった。

9.to_s(2) #=> "1001"

はてなさんの「エンジニア実績システム」をベースにして、2016年の目標をたててみた

もはや4月も終わろうとしていますが、まとまった時間がとれるゴールデンウィークを前に意識が高くなっています。 そんな今だからこそ、業務外での目標をリストアップしてみます。

2016年の目標

10年後も食べていけるエンジニアになる。(こちらの記事を読んで、色々と危機感を感じたので、、、)

注力領域

以下の4つ。

効率的なモバイルプログラミングの手法を学ぶ

  • Swift熱も高まってるし
  • 自動化できない領域を模索する
  • テストの自動化やストーリーボードの分割、ライブラリのアップデートの効率化など、保守運用コストを下げる手法を模索する

フロントエンドへのキャッチアップ

  • デプロイとかトラブルシュートを考えると、フロントエンドエンジニアにお任せではすまない
  • そもそも分業できるほどエンジニアいないw

機械学習の基礎を学ぶ

  • インフラやライブラリも充実してきた
  • ちょっとずつ活用イメージが湧き始めている
  • 久しぶりに数学も勉強したい

アウトプットを増やす(OSSへの貢献や登壇など)

  • トップエンジニアのソースを読む機会を増やしたい
  • GitHubを派手にしたい
  • 業務だけだと選択肢が狭まりそうだし
  • まだ数が少ないので、スピーカーに選ばれる難易度やPull Requestの内容はここでは問わない

TODO

アウトプットをゴールにしないとモチベーションが続かなそうなので、具体的なアウトプットを残しながら勉強することを考えています。はてなさんの実績解除システムを参考にさせて頂きました。

実績を解除してエンジニアスコアを上げろ!はてなのエンジニア実績システムのご紹介 - Hatena Developer Blog

効率的なモバイルプログラミングの手法を学ぶ

フロントエンドへのキャッチアップ

毎月Web+DB PRESSのフロントエンド先遣隊を読んで、読後メモを書く

  • [ ] vol.92
  • [ ] vol.93

機械学習の基礎を学ぶ

入門書を読んで読後メモを書く

ディープラーニング使って何か作る

  • [ ] hogehoge

アウトプットを増やす(OSSへの貢献や登壇、Qiita/Stack Overflowでの投稿など)

登壇する

OSSへPull Requestを送る

自分で何かOSSを作る

  • [ ] hogehoge

 

その他

やせる

  • 夕食の炭水化物を制限する(おでんや牛丼ライトで代替する)

お金の管理をしっかりする

  • ライフイベントに備えて、貯める

全部できるかな、、、頑張ろう。