質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1438閲覧

複数個所の部分文字or部分配列の書き換え

argius

総合スコア9390

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/06/14 05:45

2,4,6番目を同じ文字で書き換えるのに、

lang

1s = '123456' 2s[1] = s[3] = s[5] = 'X' 3# => "1X3X5X"

のように書きました。

ですが、これだと書き換えたい桁数が増えたときに困ります。

正規表現でも良いのですが、
配列の場合でもできるようにしたいので、

lang

11.step(s.length() - 1, 2) do |i| 2 s[i] = 'X' 3end

のようにすれば行けますが、
できれば関数型っぽいやり方で書き換えたいです。

その場合はsplitしてjoinしないとダメでしたっけ?

lang

1s.split("").each_with_index do |o, i| 2 if i.odd? then s[i] = 'X' end 3end 4# => ["1", "X", "3", "X", "5", "X"] 5# 後でjoinする

他に何か良い方法はありますでしょうか。

Rubyのバージョンは特に問いませんが、
比較的新しいバージョンでの機能をお使いの場合は、
それも併記していただけるとうれしいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

シンプルさはないですが、こんな方法もあります。

$ irb irb(main):001:0> s = '12345' => "12345" irb(main):002:0> s.chars.zip(['x']*s.length).each_with_index.inject('') {|a, e| a += e[0][e[1] % 2] } => "1x3x5"

次を見ると、どんな動作になっているのか分かると思います。

irb(main):003:0> s.chars => ["1", "2", "3", "4", "5"] irb(main):004:0> s.chars.zip(['x']*s.length) => [["1", "x"], ["2", "x"], ["3", "x"], ["4", "x"], ["5", "x"]] irb(main):005:0> s.chars.zip(['x']*s.length).each_with_index.inject('') {|a, e| p e } [["1", "x"], 0] [["2", "x"], 1] [["3", "x"], 2] [["4", "x"], 3] [["5", "x"], 4] => [["5", "x"], 4]

↑の変形で、指定した2つの文字列を互いちがいに組み合わせることもできたりします。
'''
s = '12345'
t = 'ABCDE'
s.chars.zip(t.chars).each_with_index.inject('') {|a, e| a += e[0][e[1] % 2] }
=> "1B3D5"
'''

投稿2016/06/15 14:47

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/06/15 15:00

回答ありがとうございます! なるほど。 互い違いに入れ替えるための文字列を 文字*s.length で用意して、 偶奇判定の余剰を2配列の選択に利用しているわけですか。 面白いですね。 こういうアクロバティックな回答も期待していたので、 うれしいです。 ありがとうございます。
guest

0

ベストアンサー

文字ごとに切るパターンなら、each_charというそれ用のメソッドがあります。

ruby

1s.each_char.with_index.map{ |c, i| i.odd? ? 'X' : c}.join('')

投稿2016/06/14 05:53

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/06/14 06:42

回答ありがとうございます! each_with_indexまたはeach_char.with_indexとmapを つなげられるんですね。知りませんでした。 こんなこともできてしまうんですね...意味ないですけど [1, 2, 3, 4, 5, 6].each.map.map.map.map.map.map{ |x| x.odd? ? 0 : x } 配列だと [1, 2, 3, 4, 5, 6].each_with_index.map{ |c, i| i.odd? ? 0 : c } # => [1, 0, 3, 0, 5, 0] ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問