人材募集企画 2011年版に応募した

人生を書き換える者すらいた。: 人材募集企画 2011年版
これに応募した,今日の24時以降にブログに答えとか書くの解禁なので一応書く.かなり適当なんで間違ってたらすみません.

第一問
f(unsigned int x)はx<=2^nとなる最小の2^nを返す.ただしunsigned intのサイズがが32bitなら,x>2^31のとき0が返る.

アロケータとかでメモリ再確保のサイズ決めるのに使ったりするのかな?適当に値入れて確かめてもだいたい推定できるし,32bitの範囲程度ならテストパターン全部書いて総当たりしても確かめれる.
3行目から7行目の処理で,3行目で一番左側で1になってるビットがどう広がるかに注目すれば理解できると思う.

第二問
以下rubyソースコード.落下をcompact!で,探索の外枠を配列の-1番目の要素が最後の要素を指す事を使ってる.単純な再帰.

$H = 14   #最上段数
$W = 6

#外枠代わりのnilを追加
def add_nil(puyo)
  puyo.each{|a| a[$H] = nil}
  puyo[$W] = []
  return puyo
end

#空のゲームを生成
def form
  puyo = []
  $W.times{|i| puyo << []}
  return add_nil(puyo)
end

#ゲーム表示
def print_puyo(puyo)
  $H.times do |h|
    h = $H - h - 1
    $W.times{|w| print puyo[w][h]? puyo[w][h] : '*'}
    puts ''
  end
end

#4つ以上の同色を消して自由落下させる
#一組でも消えるぷよがあるならtrue,全然消えないときはfalseを返す
def step(puyo)
  def search(puyo, sc, w, h, c = puyo[w][h])
    return 0 if puyo[w][h].nil?
    return 0 if sc.key?([w, h])
    return 0 if c != puyo[w][h]
    sc[[w, h]] = true
    res = 1
    res += search(puyo, sc, w-1, h, c)
    res += search(puyo, sc, w+1, h, c)
    res += search(puyo, sc, w, h-1, c)
    res += search(puyo, sc, w, h+1, c)
    return res
  end
  
  def clear(puyo, sc)
    sc.each_key{|k| puyo[k[0]][k[1]] = nil}
  end
  
  def fall(puyo)
    puyo.each{|r| r.compact!}
    return add_nil(puyo)
  end
  
  res = false
  $H.times do |h| $W.times do |w|
    if puyo[w][h]
      sc = {}
      count = search(puyo, sc, w, h)
      if count >= 4
        clear(puyo, sc)
        res = true
      end
    end
  end end
  fall(puyo) if res
  return res
end

def read_puyo(str)
  puyo = form
  inv = str.split("\n").reverse.map{|e| e.split(//)}
  h = 0
  inv.each do |e|
    $W.times{|w| puyo[w][h] = inv[h][w] == ' ' ? nil : inv[h][w]}
    h += 1
  end
  return puyo
end


str = <<EOS
GGR
YGG
EOS

puyo = read_puyo(str)
chain = 0

begin
  puts "#{chain}chain"
  print_puyo(puyo)
  puts ''
  chain += 1
end while step(puyo)

第三問
これ書く意味ないと思うけどいちおう.
自分が選択したのは(a).投機は投資と同じ市場に影響を与える点で賭博と明確な違いがある.
賭博が現在違法なのはトラブル防止のためで,自分は理にかなってると思う.