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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1694閲覧

Ruby:入力値をもとに集計する

vitabrevisarsl1

総合スコア57

Ruby

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/03/14 14:03

_エキストラを募って品物を指定して買い物をしてもらい、各人が使った金額をまとめたいのですが、
入力1 対象品目数 参加者数
入力2 各品物の値段
入力3 各品物の数(1人目)
入力4 各品物の数(2人目)

のように入力するとします。

入力1 4 3
入力2 1500 1700 1900 2100
入力3 2 1 1 4
入力4 2 3 0 8
入力5 1 4 11 6

_例えば上記のように入力があった時に、
参加者1は (1500 * 2)+(1700 * 1)+(1900 * 1)+(2100 * 4)
参加者2は (1500 * 2)+(1700 * 3)+(1900 * 0)+(2100 * 8)
参加者3は (1500 * 1)+(1700 * 4)+(1900 * 11)+(2100 * 6)
と計算されることになります。

_参加者1、2、3… は配列1、2、3…ですが、何個の配列になるかは任意で指定される点が肝です。参加者1はppp001、参加者2はppp002… の方向で考えましたが、お恥ずかしいですが下記のように行き詰まりました。

n = Array.new(2) n = gets.split(' ') n = n.map { |v| v.to_i} #n[0]アイテム数 n[1]人数 m = Array.new(n[0]) m = gets.split(' ') m = m.map { |v| v.to_f} #各アイテムの点数 r = [] array_name = 'ppp0001' ppp001 = [] n[1].downto(1) do |x| k = Array.new(n[0]) k = gets.split(' ') k = k.map { |v| v.to_i} #各品物の数 m.zip(k) do |e,m| n[1].times do instance_variable_set('@' + array_name, gets.split(' ')) array_name.succ! end ppp001 << e*m end p ppp001 (0).upto(n[0]) do |z| ppp << diag(m[z]*k[z]).round r << ppp end end p r

_任意の数だけ品物数を入力させ、最初に入力する各品物の値段をいわばデータベースとして、集計し、例えば [1, 17542] [2, 24900] [3, 41800] などといったように纏めたい(表示したい)です。
_任意の数だけ配列を作るには連番の名前が必要と思いましたが、そのような名前のつけ方がわかりませんでした。 あるいは参加者分だけ配列を作るという方向が違っているのかもしれない、とも思いました。

_なにがしかご教示いただけますと幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

集計用の2次元配列の定義と人数分読み込みの2重ループと結果出力の部分をあげてみます。
ちょっと引っかかったのが、単価の配列mが実数扱いになっている点でした。

Ruby

1# 各自の売上個数を2次元配列として定義 2ppp = Array.new(n[1]).map{Array.new(n[0])} 3 4# 各品物の売上金額合計を配列として定義 5kei = Array.new(n[0]) 6 7# jを添字として人数分データ読み込み 8n[1].times.with_index {|a,j| 9 kosuu = gets.chomp.split(' ') 10 kosuu = kosuu.map {|v|v.to_i} 11 12 # iを添字として読み込んだ個数を集計 13 n[0].times.with_index {|b,i| 14 # 2次元配列に足し込んでいく 15 ppp[j][i] += plt[j][i] + m[i].to_i * kosuu[i] 16 # 売上金額合計用の配列に足し込んでいく 17 kei[i] += m[i].to_i * kosuu[i] 18 } 19} 20 21# 各自の売上金額出力 22n[1].times.with_index {|a,j| 23 n[0].times.with_index {|b,i| 24 print ppp[j][i].to_s + " " 25 } 26 print"\n" 27} 28 29# 各商品の売上金額合計出力 30n[0].times.with_index {|b,i| 31 print kei[j][i].to_s + " " 32} 33print"\n"

途中抜けているところは、補ってみてください。

投稿2017/03/14 19:00

seastar3

総合スコア2285

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

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

0

Ruby

1input = "4 3 1500 1700 1900 2100 2 1 1 4 2 3 0 8 1 4 11 6\n" 2array = input.chomp.split("\s").map(&:to_i) 3item_num = array.shift(2).first 4array = array.each_slice(item_num).to_a 5price = array.shift(1).flatten 6 7data = [] 8 9array.each_with_index do |element, id| 10 sum = 0 11 element.each_with_index do |e, i| 12 sum += price[i] * e 13 print "(#{price[i]} * #{e})#{i < element.length - 1 ? "+" : "\s=\s#{sum}\n"}" 14 end 15 data << [id + 1, sum] 16end 17 18data.each do |answer| 19 print "#{answer}\s" 20end

実行結果例

(1500 * 2)+(1700 * 1)+(1900 * 1)+(2100 * 4) = 15000 (1500 * 2)+(1700 * 3)+(1900 * 0)+(2100 * 8) = 24900 (1500 * 1)+(1700 * 4)+(1900 * 11)+(2100 * 6) = 41800 [1, 15000] [2, 24900] [3, 41800]

考えてみました。
間違っていたらすみません。

投稿2017/03/14 18:12

編集2017/03/15 06:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問