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

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

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

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

Q&A

解決済

1回答

447閲覧

[Ruby]2*2の行列を数値として処理したい

DrqYuto

総合スコア432

Ruby

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

0グッド

0クリップ

投稿2018/12/03 09:31

1 1
2 2
を受け取ると

p readlines.map(&:to_i) #=>[1, 2, 0]

となります。
[1,1
2,2]
としたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Ruby

1x = readlines.map{|line| line.chomp.split(/\s/).map(&:to_i)}

で、
x が [[1,1], [2,2]]になります。

投稿2018/12/03 10:21

otn

総合スコア84551

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

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

DrqYuto

2018/12/03 10:33

ありがとうございます。
DrqYuto

2018/12/03 10:34

[1,1 2,2] と、一段ずつ改行を入れる場合はどうしたらいいでしょうか?
otn

2018/12/03 10:51

2x2のみ考えればいいのであれば、 puts "[#{x[0][0]},#{x[0][1]}\n#{x[1][0]},#{x[1][1]}]" ですね。
otn

2018/12/03 10:55

↑これは流石にひどいか。 puts "[" + x.map{|row| row.join(", ")}.join("\n") + "]" ですかね。
DrqYuto

2018/12/04 06:54 編集

有難う御座います。そして各要素-1したい場合はどう書けばいいのでしょうか? map{|i|i-1}したいです。 エラーになりました。 ```:ruby x = readlines.map{|line| line.chomp.split(/\s/).map(&:to_i)} puts x.map{|i|i-1} .map{|row| row.join(" ")}.join("\n") ``` Main.rb:3:in `-': no implicit conversion of Integer into Array (TypeError) from Main.rb:3:in `block in <main>' from Main.rb:3:in `map' from Main.rb:3:in `<main>'
otn

2018/12/04 07:02

xは、数値の配列じゃなくて、数値の配列の配列ですよ。
DrqYuto

2018/12/04 07:04

そこの違いがよく分かりません。二重の配列になっているということでしょうか?
otn

2018/12/04 07:06

そうです。二重です。
DrqYuto

2018/12/04 07:08

となると、mapの使い方がよくわかりません。。。教えてください。
otn

2018/12/04 07:09

mapも二重にします。
asm

2018/12/04 07:19

Matrixのinspectがもう少し読みやすければいいのに、と感じますね gem NMatrixをppするとかなり読みやすいのが出てきたが windowsで安定動作しなかった……
DrqYuto

2018/12/04 07:43

p 3.times.map { %w[1 2] }.flatten.map(&:to_i).map{|i|i-1} #=>[0, 1, 0, 1, 0, 1] flatten使えばmapできましたがこれを改行するのもよくわかりません。 matrixもよくわかりません。
otn

2018/12/04 07:48

flattenすると、行列の構造が無くなってしまうので、何個ごとに改行するのかは、プログラムで決め打ちになりますね。 添え字を使って、 [0,1,0,1,0,1].each_with_index{|w,i| print w; if i==2 then print "\n" else print ", " end} とか。
DrqYuto

2018/12/04 07:57

flattenではだめなんですね。 #=> 0,1,0 1,0,1, を 0,1 0,1 0,1 とするにはif以下の値を変えればよいのでしょうか?
otn

2018/12/04 12:35

そうですね。if i==2 は3番目の後で改行なので、if i%2==1 とかにすればいいかと。2個ごとに改行。
DrqYuto

2018/12/04 12:40

[0,1,0,1,0,1].each_with_index{|w,i| print w; if i%2==1 then print "\n" else print " " end} ですね。ありがとうございます。
DrqYuto

2018/12/04 12:41

二重配列にmap{|i|i-1}するのも教えていただきたいです。
otn

2018/12/04 12:48

map{|row| row.map{|i| i-1} }
DrqYuto

2018/12/04 12:54

mapの中にmap入れてもいいんですね。 x = readlines.map{|line| line.chomp.split(/\s/).map(&:to_i)} puts x.map{|row| row.map{|i| i-127} }.map{|row| row.join(" ")}.join("\n") ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問