K2PC(Easy)A/B,天下一予選B A問題 解いてみた

ただのプログラミング日記ですね.日常生活に関しては Twitter を御覧くださいということで一つ.普通の日記書きたいんですけどね.

K2PC(Easy)

A 問題

ing = gets.chomp.split.map(&:to_i)
hamb = gets.to_i

puts ing.each_with_index.collect{|e, i|
  hamb*(i+1) - e > 0 ? hamb*(i+1) - e : 0
}.join(" ")
  • 1 行目:ご飯の材料って ingredient って言うんですね.勉強になった
  • 4-5 行目:ハンバーガー 1 個あたりそれぞれの材料が 1,2,3 個ずつ必要,しかも数字が順番に来てくれるので,それぞれの個数を配列に格納して each_with_index で取り出した添字に1を足して必要数を掛けて,そこから今ある個数を引きました.それが 0 より大きければ足りない数に変更,そうでなければ 0 に変更.3 項演算子楽しい
  • 6 行目:↑を空白スペース区切りで出力

B 問題

lines = gets.to_i
tateren_taisei = gets.chomp.split.map(&:to_i).sort.reverse
music = []
possible = []

lines.times{music << gets.chomp.split("")}
xlong = music.transpose.map{|e| e.join.split(/[-]+/).delete_if{|ee| ee == ""}}.delete_if{|e| e.empty?}.collect{|e| e.max.length}.sort.reverse
if xlong.size < 7
  xlong.fill(0, xlong.size .. 6)
end
7.times do |i|
  if tateren_taisei[i] >= xlong[i]
    possible << true
  else
    possible << false
  end
end

puts possible.all? ? "YES" : "NO"
  • 問題名を見て「まさか……?」と思ったら本当にそういう問題でした
  • 2 行目:はじめてのどんよくほう.どうせ後で多い順に照らし合わせるなら今ここでソートしちゃえ,ということで.よく思うんだけど rsort 的なメソッドって無いんすかね.まあ自分で実装すればいいだけなんだけども
  • 6 行目:譜面を 1 行毎読み込んで鍵盤ごとにぶつ切りにして配列にする.譜面を左から見てる感じ
  • 7 行目:譜面を→列と行を入れ替えて(あればいいな〜〜と思って検索したら transpose が見つかってビビった)(これで今は譜面を上から見てる感じ)→鍵盤ごとに分かれている配列それぞれに対して,ノートが当たっていない行を削除(実際には "-" でスプリット)→一番上の行が "-" だとスプリットされた時に空文字列になるようなのでそれを削除→ある鍵盤にノーツが全く入ってない状態で左の処理をすると空配列になるようなのでそれを削除→ノートが一番続いている部分のノートの個数を collect(最初は max_by が必要かと思ったけど,全部 "X" からなる文字列なので,辞書順最大は一番長い文字列だからただの max でいい.それの length が縦連ノートの個数)→小さい順に並べ替え→逆にする
  • 8-10 行目:前行の処理で鍵盤の数が 7 個未満になる時があるので,その時に配列の足りない部分(ノーツが当たってない鍵盤の縦連の数)を 0 にする.今見たらこれ else 無いからただの if 修飾子でよかったな.あと添字の範囲に xlong[xlong.size-1] みたいなことしちゃうのもうやめたい.混乱しすぎである
  • 11-17 行目:一番耐性のある指に対して一番縦連の多い鍵盤を当てる.耐えられれば true.耐えられなければ false.ここもうちょっとスマートに書きたかったけど何も思いつかなかった.あと耐えられるかどうかの判定で配列を用意する必要はなくて,ブール変数 1 個用意して鍵盤ごとに判定して,false になった瞬間ループを抜けるようにすればよかった.こういうのを最初に思いつけるようになりたい
  • 言うて 19 行掛かってはいるけどそれなりに素直にコンパクトにまとめられたんじゃないかなあと.7 行目のメソッドつなげまくる部分は自分で書いてて混乱して時間かかったけど map の入れ子の仕方とか split の仕様とかに詳しく慣れたのでよし

C 問題

まだ出来てません.ただの群数列なのは分かるけどどうしよっかなーと思いつつ放置中.そのうちやります.

天下一(略)B 予選

A 問題

a, b, c = gets.chomp.split.map(&:to_i)

for i in 1..127
  puts i if i%3 == a && i%5 == b && i%7 == c
end
  • 愚直に.どうせ 128 個しか無いし.こういうやり方しか思いつかなかったんですごめんなさい許してください石投げないでください

B 問題

まだ出来てません.正規表現のやり方は昨晩何となく思いついたのであとは実装するだけだなーと思いつつ放置.疲れました.また新しく問題が解けたらアップします.

コメント

このブログの人気の投稿

慶大プレ小論文

改名