【AtCoder:3回目】AtCoder Beginner Contest 128の振り返り(Ruby)

f:id:ryoutaku_jo:20190527203143p:plain

【目次】

【本題】

振り返り

今回は、5/26(日)に開催されたAtCoder Beginner Contest 128の振り返りを行います。

AtCoder Beginner Contest 128 - AtCoder

結果は、2問目で力尽きて、3問目に到達できず・・・

f:id:ryoutaku_jo:20190527205325p:plain

ratingは微増です

f:id:ryoutaku_jo:20190527205529p:plain

色が付くのは、まだ先ですね・・・

A - Ferris Wheel

問題文 林檎が A 個、林檎の欠片が P 個あります。

林檎 1 個は、砕くことで林檎の欠片 3 個になります。また、林檎の欠片 2 個を鍋で煮込むことで、アップルパイが 1 個作れます。

今ある材料で作れるアップルパイの最大数を求めてください。

りんごは全部欠片にして、欠片を足して、2で割るだけと考えました。

a,piyo=gets.split.map &:to_i
 
p ( ( a * 3 ) + piyo ) / 2

他の回答を見ても、概ね同じ方法でした。

B - Guidebook

問題文 あなたは美味しいレストランを紹介する本を書くことにしました。 あなたは N 個のレストラン、レストラン 1 、レストラン 2 、 … 、レストラン N を紹介しようとしています。レストラン i は S i 市にあり、あなたは 100 点満点中 P i 点と評価しています。 異なる 2 個のレストランに同じ点数がついていることはありません。

この本では、次のような順でレストランを紹介しようとしています。

市名が辞書順で早いものから紹介していく。 同じ市に複数レストランがある場合は、点数が高いものから紹介していく。 この本で紹介される順にレストランの番号を出力してください。

今回は、下記の様な手順で処理する方法を考えました。

1:標準入力を配列に格納 2:1の配列から、Nを抜き出す 3:Nを抜き取った配列の各要素に並び順で連番を割り振る 4:3を市名で昇順にソートする 5:4から市名だけ抜き出し、重複を排除した配列を作成する 6:5をeachで回して、その中で同じ市名のグループを抽出し、点数でソートする 7:6をeachで回して、3で割り振った連番を、配列の並び順に出力する

inputs = []
while input = $stdin.gets do
  inputs << input.chomp.split(" ")
end
 
n = inputs.shift
citys = []
 
inputs.each.with_index(1) do |city, i|
  city << i
  citys << city
end
 
citys_name_sort = citys.sort
 
super_citys = []
names = []
 
citys_name_sort.each do |name|
  names << name[0]
end
 
names.uniq.each do |name|
  check_names = []
  citys_name_sort.each do |city_n|
    if name == city_n[0]
      check_names << city_n
    end
  end
  super_citys << check_names.sort{ |a, b| b[1].to_i <=> a[1].to_i }
end
 
super_citys.each do |a0|
  a0.each do |a1|
    p a1[2]
  end
end

4の時点で、点数も含めてソートされると思ったのですが、上手くいかなかったので、5〜6の処理を追加しました。

思いつきの力技なので、かなりグチャグチャです・・・

そして他の人の回答を見ていると、下記でもいける様でした。

N = gets.to_i
 
list = []
N.times do |i|
  s, p = gets.split(" ")
  p = p.to_i
  list << [s, -p, i+1]
end
 
list.sort!
list.each do |(a, b, i)|
  puts i
end

「なんでソート一回で上手く行ってるの?」

府に落ちなかったので、出力結果を見比べました。

#自身のコード
[["khabarovsk", "20", 1], ["moscow", "10", 2], ["kazan", "50", 3], ["kazan", "35", 4], ["moscow", "60", 5], ["khabarovsk", "40", 6]]

#模範コード
[["khabarovsk", -20, 1], ["moscow", -10, 2], ["kazan", -50, 3], ["kazan", -35, 4], ["moscow", -60, 5], ["khabarovsk", -40, 6]]

「あっ(察し)」

模範はint型にして、かつ負号を付ける事で、昇順でソートさせる事ができる様でした。

めっちゃ簡単な問題だったんですね・・・

《今日の学習進捗(3年以内に10000時間に向けて)》

フロンドの組み込みにて、作業途中で考慮すべき箇所に気づく事が多々あった。例えば、文字数をオーバーしてレイアウトが崩れた場合の文字数の省略やエラー発生時の警告文に対するCSSをどう反映させるか?などである。改めて設計の見通しが甘いと自覚した。細かい部分については、経験を積まないと考慮しづらい部分もあると感じるが、事前に作業内容のアウトラインを作り込んで、出来る限り手戻りや見積もりのズレが生じにくい様に努めたい。

学習開始からの期間 :171日
今日までの合計時間:1656h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1562h
目標との解離:94h
「10,000時間」まで、

残り・・・「8344時間!」