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

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

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

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

Q&A

解決済

4回答

2924閲覧

Ruby 条件式(if文)を(二次元)配列に一気に適用する方法

moshimoshi

総合スコア10

Ruby

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

0グッド

1クリップ

投稿2017/06/13 11:56

###前提・実現したいこと
[[12,4],[5,11],[15,8]]
という二次元配列があったとします。
これらの配列内の数字を10より下なら0でより上なら1と表示したいです。
出力例
1 0
0 1
1 0
という感じに出力したいのですが、if文を分けてしまうと
1
0

0
1

1
0
といった感じに表示されてしまいます。
解決策をご存知の方、どうかご教示お願いします。
配列ごとに条件式を適応できなくとも、理想の出力例になれば、良いと考えています。

###書いてみた

ruby

1#二次元配列に格納 2all = STDIN.readlines.map{|line| line.split(" ").map(&:to_i)} 3 4#最初の列を除いた二次元配列を指定したもの 5from1 = all[1..-1] 6 7for l,r in from1 8#puts "#{l} #{r}" 確認用 9puts "" #見やすくする為に 削除忘れずに 10 if l > 127 11 p 1 12 elsif l < 128 13 p 0 14 end 15 16 if r > 127 17 p 1 18 elsif r < 128 19 puts 0 20 end 21end

出力はやはり
1
0

0
1

1
0

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

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

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

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

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

guest

回答4

0

ベストアンサー

Ruby

1arr = [[12, 4], [5, 11], [15, 8]] 2 3puts arr.map { |m| m.map { |n| n > 10 ? '1' : '0' }.join(' ') }
1 0 0 1 1 0

考えてみました
10よりうえかどうかを判定して1, 0という文字に置き換えてjoinで合体させています。

投稿2017/06/13 13:04

編集2017/06/13 13:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moshimoshi

2017/06/13 13:50

なるほど、mapメソッドで置き換える方法ですか・・・。 これなら、行数が少なくて済んで良いですね! 回答ありがとうございました。
guest

0

配列の表示と、配列の変換を明確に分けてみました。

a.ruby

ruby

1def print_array(ary) 2 ary.each { |vec| puts vec.join(' ') } 3end 4 5 6data = [[12, 4], [5, 11], [15, 8]] 7 8data.tap(&method(:print_array)) 9puts 10 11data.map { |vec| vec.map { |v| v > 10 ? 1 : 0 } } 12 .tap(&method(:print_array))

実行結果

$ ruby a.rb 12 4 5 11 15 8 1 0 0 1 1 0

投稿2017/06/18 22:50

katoy

総合スコア22324

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

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

moshimoshi

2017/06/22 01:32

回答ありがとうございます。勉強になります。
guest

0

コード

arr = [[12, 4], [5, 11], [15, 8]] arr.each{|i| i.map{|s| s >= 10 ? 1 : 0}.join(" ").tap{|s| puts s }} end

出力結果

1 0 0 1 1 0 => [[12, 4], [5, 11], [15, 8]]

自分も考えて見ましたがほとんどh_aさんと同じになってしまいました
h_aさんとの違いは

  1. 返り値に配列が返って来る(h_aさんのコードはnilが返って来る)
  2. tapで出力している
  3. eachで繰り返しをして出力している

くらいでしょうか

投稿2017/06/14 08:24

haneru

総合スコア440

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

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

moshimoshi

2017/06/14 09:49

場合によって使い分けるときに参考にさせて頂きます。回答ありがとうございました!
guest

0

pメソッドを使っているから、全て改行します。シンプルにprintメソッドを使って、forループを

Ruby

1for l,r in from1 2 print() 3 if l > 127 4 print "1 " 5 elsif l < 128 6 print "0 " 7 end 8 9 if r > 127 10 puts 1 11 elsif r < 128 12 puts 0 13 end 14end

のようにすれば、右の項でのみ改行します。

投稿2017/06/13 12:31

seastar3

総合スコア2285

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

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

moshimoshi

2017/06/13 13:43

なるほど、printの存在を失念していました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問