こんにちは、いなむーです。

タイトルだけ見るととても激ハックした感じがしますが、そんなことはありません笑
今日もAtCoder(abc033a)シリーズでございます。
タイトルはAtCoderの問題文を抜粋しているためこうなっております。

今回の問題はこちら。

問題文
あなたはゲーム開発メンバーの一員です。 現在、あなたはプレイヤーがゲームをプレイするために必要な暗証番号を決めさせる部分を実装しています。

この暗証番号は 4 桁 であり、それぞれの桁は 0 以上 9 以下の数字のいずれかです。暗証番号が 0 で始まる可能性もあります。

安全上の関係で、 4 桁とも同じ数字である暗証番号は認めないことにしました。プレイヤーが入力した 4 桁の数 N が与えられるので、 これが 4 桁とも全て同じ数字であるかどうかを判定してください。

入力
入力は以下の形式で標準入力から与えられる。

N
1 行目には、N が与えられる。N は 4 文字の 0 から 9 の数字からなる。
N が 0 で始まることもある。
出力
N が 4 桁とも全て同じ数字であるなら SAME を、そうでないなら DIFFERENT を 1 行に出力せよ。

出力の末尾にも改行を入れること。

入力例 1
2222
出力例 1
SAME

そして私が書いたコードはこちら。
[code]
A, B, C, D = gets.split(//).map { | v | v.to_i }
puts A – B == 0 && A – C == 0 && A – D == 0 ? "SAME" : "DIFFERENT"
[/code]

splitメソッドが指定した区切りで分割できるということが新しい発見でした。
今回の問題では、今までとは異なり数字が分割されていません。
いままでは「2 2 2 2」となっていて、splitが自動的にスペース区切りと判断してくれました。
しかし、今回は「2222」となっているので分割する個所がわかりません。
そこで調べた所、括弧で//を追加すると、1文字ごとに抽出してくれることがわかりました。
ちなみに、(/,/)とするとカンマ区切りになりますし、(/¥r/)で改行区切りになります。
なお、2文字以上の文字列で分割するにはscanメソッドを使う方法があるようです。
[code]
A, B, C, D = gets.scan(/.{2}/).map { | v | v.to_i }
[/code]
結果はこんな感じ
[code]
22
22
nil
nil
[/code]

また一つ勉強になりました。

以上。

カテゴリー: Ruby