読者です 読者をやめる 読者になる 読者になる

POH vol.7

ヤバい嫁ドロイドがかわいい。

水着

最初は小難しく考えてたけど、意外とすんなり解いた。でもrubyのおかげっていう点が多い気がする。
https://paiza.jp/poh/ando/share/2a940576

def answer(n)
    return 1 if n < 2
    t = (2..n).to_a
    until t.size == 1
        t = t.each_slice(10).map {|v| 
            f = v.compact.inject(1,&:*)
            f /= 10 while f % 10 == 0
            f % 10 ** 11
        }
    end
    t.first % 10 ** 9
end
puts answer(gets.to_i)

基本的には小分けにして積をとって末尾の0を削るというのを繰り返す。
10個ずつ取ると5の倍数が2つ含まれるけど、2,4,6,8の倍数が必ず含まれるので、5^7までは確実に削れる。

一回目のループでは小分けにした計算結果に5の倍数が含まれる場合もあるだろうけど、
余裕をもって10の11乗位で割って、最後に10の9乗で余りをとればよい。

コーナーケースがありそうだけど、5 ** 8とかでも大丈夫だった。

サンタ

最初each_consとeach_slice間違えたのは内緒。
https://paiza.jp/poh/ando/share/b0b60846

x,y,z,n = gets.split.map(&:to_i)
cx = []
cy = []
n.times do
    d, a = gets.split.map(&:to_i)
    if d == 0
        cx << a
    else
        cy << a
    end
end
cx << 0 << x
cy << 0 << y
cx.sort!
cy.sort!
minx = cx.each_cons(2).map{|i,j| j-i}.min
miny = cy.each_cons(2).map{|i,j| j-i}.min
puts minx * miny * z

メガネ

やっぱりメガネだよね。メガネ Getが一番うれしい。

https://paiza.jp/poh/ando/share/069acb96

m = gets.to_i
mm = m.times.map { gets.split.map(&:to_i) }
n = gets.to_i
nn = n.times.map { gets.split.map(&:to_i) }

(0 .. m - n).each do |ox|
    (0 .. m - n).each do |oy|
        b = (n ** 2).times.all? {|i|
            x,y = i.divmod(n)
            mm[oy + y][ox + x] == nn[y][x]
        }

        if b
            puts "#{oy} #{ox}"
            break
        end
    end
end