名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

AOJ1129 Hanafuda Shuffle

回答

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1587269

問題文のとおりに実装するだけで良いのだが,思わぬところでハマったので,備忘録的にブログを書いておく.

まず,rubyを用いて,[1,2,3,4,5]のような配列を作る場合ですが,

ngarray = [1..5]
okarray = (1..5).to_a

となります….この例のngarrayだとRangeクラスが1つだけ格納される形になるので,思ったような動作をしません.ああぁんなんで…(日をまたいで1時間以上悩んでいました)

参考:
rubyで連番の配列作ろうとして気づいたアホな思いこみ - みんなのちからになりたい
Class: Array (Ruby 2.2.3)

で,それを解決したうえで,部分的な配列を作る場合を確認.

array = [0..5]
subarray = array[2..3] # => [2, 3]

このように書く.配列同士は"+"でくっつけられる.ドットの数が2つか,3つかで範囲が変わるのは少しわかりづらい感じがしますね.どっちか片方だけでいいんじゃないかな….


っていう事前の知識があれば一瞬で解けたんじゃないですかね….


それと,以下のoutputに関する文で,以下の点を読み落としていて,勘違いをしていた.

最初に一番下を1番として順にn番まで の札が積み上げられた山を仮定して,

こことても重要です.私は一番下をnにして積んでいたので,sampleと答えが合わず四苦八苦しました.
教訓:問題文をよく読もう.

while true do
    n, r = gets.split(" ").map(&:to_i)
    if n == 0 && r == 0
        break
    end
    arr = (1..n).to_a.reverse
    r.times do
        p, c = gets.split(" ").map(&:to_i)
        p -= 1
        ta = arr[p...p+c] + arr[0...p] + arr[p+c..n]
        arr = ta
    end
    puts arr[0]
end