paiza オンラインハッカソン vol.5 をやってみた

使用言語は Ruby です。画像クリックで詳細が出ます。
 

手紙の暗号を解読

20171026164239
簡単。

コード。

st = gets

result = ""
0.step(st.length - 1, 2) {|i| result += st[i]}
puts result

 

会社の入社試験

20171026164741
超簡単。こんな入社試験、ある筈がないですね。

コード。

num = gets.to_i
data = []
num.times {data << gets.to_i}

7.times do |day|
  sum = 0
  (num / 7).times {|i| sum += data[i * 7 + day]}
  puts sum
end

 
ここでレナちゃんか、ミナミちゃんのいずれかを選ばないといけない!

 

ミナミを選んでみる

問題はこれ
20171026165151
これもやさしい。

コード。

x, y = gets.split.map(&:to_i)
field = []
y.times {field << gets.split.map(&:to_i)}

result = []
field.transpose.each do |line|
  ar = Array.new(y, 0)
  result << ar.fill(1, 0, line.count(1))
end
result.transpose.reverse_each {|x| puts x.join(' ')}

transpose, fill, count, reverse_each など、僕が普段あまり使わない Array の便利な組み込みメソッドを使って解きました。Ruby の表現力の高さが出ているのではないか知らん。
 

レナを選んでみる

問題はこれ
20171026165937
うーん、大して工夫していないのに…。判定は条件分岐(if文など)を使わず、ビット演算でやったのが工夫したくらい。

コード。

x, y, num = gets.split.map(&:to_i)
table, area = [], []
y  .times {table << gets.split.map(&:to_i)}
num.times {area  << gets.split.map(&:to_i)}

MaskValue = 2 ** 10 - 1
@mask = Array.new(y) {Array.new(x, 0)}

def make_mask(x1, y1, x2, y2)
  y1.upto(y2) do |y|
    x1.upto(x2) {|x| @mask[y][x] |= MaskValue}
  end
end

area.each do |ar|
  make_mask(ar[0] - 1, ar[1] - 1, ar[2] - 1, ar[3] - 1)
end

y.times do |y1|
  x.times {|x1| table[y1][x1] &= @mask[y1][x1]}
end

puts table.flatten.inject(&:+)

 
今回も特にむずかしいことはなし。