12

30

[Ruby] リクルートプログラミンコンテスト ババ抜き 問題

2013.12.30(21:42)

こんな問題わかんないよ…。「賞金が素数」という斬新なプログラミングコンテストをリクルートが開催 : ギズモード・ジャパン
http://www.gizmodo.jp/2013/12/recruit_programming_contest.html
2013年12月8日(日)にリクルートホールディングスが開催した「Recruit Programming Contest」
の模擬練習会で出された問題
A - ババ抜き

を解いてみました。でも、与えられたテストケースだけ正しく解ければいいのかなあ? たぶん違いますよね?
コンテストでは、みんなが解いたプログラムが正しいかどうか、どうやって判定していたのだろう?

# encoding: Shift_JIS

# こんな問題わかんないよ…。「賞金が素数」という斬新なプログラミングコンテストをリクルートが開催 : 
# ギズモード・ジャパン
# http://www.gizmodo.jp/2013/12/recruit_programming_contest.html
# 2013年12月8日(日)にリクルートホールディングスが開催した
#「Recruit Programming Contest」の模擬練習会で出された問題
# A - ババ抜き

# ヒアドキュメント
 question=<<QUESTION
3
3
16372
2746J18
348
4
1234
1234
1234
1234J
5
13645
643125
147
5137J
3245
QUESTION
 answer=<<ANSWER
15
29
-1
ANSWER

def game(player_array)
 debug = false
 history = Array.new
 turn = 1
 me = 0

 100.times {
  # ババ抜きが終わらない判定用
  a = Array.new
  player_array.each { |p|
   a << p.dup
  }
  history << a

  # 1ターン処理
  printf "#{turn} #{player_array}\n"
  me = 0 if me >= player_array.size
  you = me + 1
  you = 0 if you >= player_array.size
  take = player_array[you].shift
  if player_array[me].include?(take)
   player_array[me].delete(take)
  else
   player_array[me] << take
  end
  player_array.delete([])
  me = me + 1
  return turn if player_array.size < 2
  turn = turn + 1
  
  # ババ抜きが終わらない判定
  # printf "# history #{history}\n"
  history.each_with_index { |one,idx|
   if one == player_array
    printf "# found same pattern #{one}\n"
    return (-1)
   end
  } if true
 }
 exit
end

result_array = Array.new
qa = question.lines.map!{|line|line.chop}
count = qa.shift.to_i
count.times {
 player_array = Array.new
 num = qa.shift.to_i
 num.times {
  cards_array = qa.shift.split(//)
  player_array << cards_array
 }
 result = game(player_array)
 printf "result = #{result} ------------------------------ \n"
 result_array << result
}

aa = answer.lines.map!{|line|line.chop.to_i}
p aa
p result_array
p result_array == aa
 
 
久しぶりにRubyでプログラム書いたら、ババ抜きが終わらない判定に使った、配列の深いコピー問題を忘れていて時間がかかりました。
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示