ABC 039を解いた
総括すると、酒のつまみって感じです(?)(実際酒飲みながら答えた)
A - 高橋直体
直方体の高さ、幅、奥行きが与えられるからその表面積を答える。直方体の展開図書けば分かるように全6面はそれぞれ同じ矩形が2つずつ3種類からなる。表面積はその合計なので与えられた各辺の情報から計算する。
a, b, c = gets.chomp.split.map(&:to_i) puts (a*b*2+a*c*2+b*c*2)
B - エージェント高橋君
整数Xが与えられる。N=X4である。実数Nを答える。題意からNはXの4乗根のうち実数になるやつなので(というか複素数なんて組み込みで対応してる言語じゃない限りめんどくさすぎるわ)、適当にsqrtを二回やってやればいい。だいたいの言語にはsqrtくらい付いてる(と思う多分)はずだが、わかんなかったら1/2乗してやれば平方根が出るよ。1/4乗してやれば一発。さすがに冪乗計算できない言語は....いや知らんけど
sqrtするバージョン
x = gets.chomp.to_i puts Math.sqrt(Math.sqrt(x).to_i).to_i
1/4乗するバージョン
x = gets.chomp.to_i puts (x**(1/4.to_f)).to_i
C - ピアニスト高橋君
W
、B
からなる20文字の文字列Sが与えられ、これはWはピアノの白鍵、Bは黒鍵に対応する(左側からの)並びである。Sの先頭Siを白鍵とする。Siのドレミ音階によって答えを分岐して出力する。
答えはドレミ音階の7種類ある。ドから始まる基本の鍵盤の並びはWBWBWWBWBWBW
なのでそれがSのどこにあるかで分かる。めんどくさいので鍵盤の並びはループ構造をもつことを利用して、先頭からの12文字がどの状態かで分岐することにした。
s = gets.chomp doremi = "WBWBWWBWBWBW".chars case s[0, doremi.size].chars when doremi puts "Do" when doremi.rotate!(2) puts "Re" when doremi.rotate!(2) puts "Mi" when doremi.rotate!(1) puts "Fa" when doremi.rotate!(2) puts "So" when doremi.rotate!(2) puts "La" when doremi.rotate!(2) puts "Si" end
今でこそ世界にはばたくatcoderですが、この頃はまだドレミ唱法などというマイナー音名表記を使っていたため日本人にしか解けない問題ですね、知らんけど
D - 画像処理高橋君
「#
の周囲8マスに.
があれば#
に変える処理」を1回施した、高さH幅Wのテーブルが与えられる。処理を施したもとのテーブルが存在するならばそれを出力する。与えられるのは処理後なのでそれを元に戻してみて、処理を与えたら復元できるかどうかを試す。
処理前に戻すには逆の処理を施す。すなわち処理後の.
の周囲を.
に変える。変えたものについて#
の周囲を#
に変えたものが与えられたテーブルと等しくなれば復元可能。
出力用のテーブルと復元用のテーブルを作って処理していく。周囲8マスの処理については迷路探索的な感じでやった。他の提出をみると外側に壁を用意しているものが多かった
# 潰してから復元する方針 h, w = gets.chomp.split.map(&:to_i) table = [] h.times do table << gets.chomp.chars end def repaint(map, i, j, mark) # map[i][j]とその周囲8マスをmarkに塗り替える place = [-1, 0, 1] place.each do |y| place.each do |x| if 0<=i+y && i+y<map.size && 0<=j+x && j+x<map[0].size map[i+y][j+x] = mark end end end end # tableの「#」を潰す用 pre_table = Array.new(h).map{Array.new(w, "無")} # pre_tableから処理した結果を復元する用 epi_table = Array.new(h).map{Array.new(w, ".")} (0...h).each do |i| (0...w).each do |j| if table[i][j] == "." # 処理前は"."の周囲は"."であったはず repaint(pre_table, i, j, ".") end end end (0...h).each do |i| (0...w).each do |j| if pre_table[i][j] == "無" # pre_tableにとって"."で潰せなかった場所から"#"が広まるはず pre_table[i][j] = "#" # epi_tableはpre_tableの処理後の姿 repaint(epi_table, i, j, "#") end end end if epi_table == table puts "possible" pre_table.each do |pt| puts pt.join("") end else puts "impossible" end
まとめ
簡単なやつを選んだので簡単だった。そのくせDでは実装をミスってWAを食らった...