CodeJam 2016 Qualification A

2016年のCodeJamもQualificationは通ったので、どういう風に解いたかとかを記録してみる。

概要

  • 英語であることが日本人プログラマにとって一番つらいことなんだと思う
  • 5年半プログラマではなかったのですが、ここ1年でだいぶ勘が戻ってきたんだろうなぁって感じ
  • AとBを解いたけど、どちらも時間配分はこんな感じ
    • 英語を読むのに1時間(飽きて別のサイト見たりアニメ見たりもしながら)
    • 問題を解くのに20分程度
  • 去年とかはprint文の書き方とかも調べながらだったので、問題を解くのに2時間くらいかかった気がする

A問題

問題内容

問題文はこちら https://code.google.com/codejam/contest/6254486/dashboard

  • とりあえずCounting Sheepってタイトルで「羊が一匹、二匹、、」って寝るやつな感じのものを想像したが、あんまり関係なかった気がする
  • 初期値の数字から、それを2倍3倍していって、0〜9の数字を全部使えばOK
  • 0〜9までの数字が出てきたときに、初期値がどの数字まで増えたかが答え
  • 何倍にしても0〜9まで現れない場合は、答えに「INSOMNIA」って書く

(正確には英語を読みましょう)

回答のコード

  • こういうので初めてRubyを使ってみた
#!env ruby

def check(target)
  list = target.split("").uniq
  if list.count == 10
    return true
  else
    return false
  end
end

case_num = STDIN.gets

(1..case_num.to_i).each do |i|
  input_num = STDIN.gets.to_i

  if input_num == 0
    print "Case ##{i}: INSOMNIA\n"
    next
  end

  number = input_num
  target_string = input_num.to_s

  until check(target_string) do
    number += input_num
    target_string += number.to_s
  end

  print "Case ##{i}: #{number}\n"
end

コーディングしたときに考えてたこと

  • とりあえずINSOMNIAになるのは0だけか
    • 0は必ずINSOMNIAは自明
    • 奇数は10倍までで、少なくとも一の位だけでそろう
    • 5は20回あれば全部そろう
    • 偶数も何回か足せば、十の位以上に奇数が出てくるし、そんなに多くない数で全部そろいそうだ
  • Nは最大100万なので100回たしてもたかだか1億だから桁あふれとかは心配なさそう
  • ループの間、今まで使った数値をためてくところを作るのも面倒だし、数字を文字列としてどんどん連結しちゃえ
  • 文字列をチェックして、各文字の重複排除をすれば、10個の要素になったタイミングが答えか
  • 配列にuniqで重複排除できるのね、ruby便利だなぁ

以上