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

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

ただいまの
回答率

90.52%

  • Ruby

    7633questions

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

  • データベース

    698questions

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

  • 配列

    522questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 533

_エキストラを募って品物を指定して買い物をしてもらい、各人が使った金額をまとめたいのですが、
入力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] などといったように纏めたい(表示したい)です。
_任意の数だけ配列を作るには連番の名前が必要と思いましたが、そのような名前のつけ方がわかりませんでした。 あるいは参加者分だけ配列を作るという方向が違っているのかもしれない、とも思いました。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

# 各自の売上個数を2次元配列として定義
ppp = Array.new(n[1]).map{Array.new(n[0])}

# 各品物の売上金額合計を配列として定義
kei = Array.new(n[0])

# jを添字として人数分データ読み込み
n[1].times.with_index {|a,j|
  kosuu = gets.chomp.split(' ')
  kosuu = kosuu.map {|v|v.to_i}

  # iを添字として読み込んだ個数を集計
  n[0].times.with_index {|b,i|
    # 2次元配列に足し込んでいく
    ppp[j][i] += plt[j][i] + m[i].to_i * kosuu[i]
    # 売上金額合計用の配列に足し込んでいく
    kei[i] += m[i].to_i * kosuu[i]
  }
}

# 各自の売上金額出力
n[1].times.with_index {|a,j|
    n[0].times.with_index {|b,i|
      print ppp[j][i].to_s + " "
    }
    print"\n"
}

# 各商品の売上金額合計出力
n[0].times.with_index {|b,i|
  print kei[j][i].to_s + " "
}
print"\n"


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

input = "4 3 1500 1700 1900 2100 2 1 1 4 2 3 0 8 1 4 11 6\n"
array = input.chomp.split("\s").map(&:to_i)
item_num = array.shift(2).first
array = array.each_slice(item_num).to_a
price = array.shift(1).flatten

data = []

array.each_with_index do |element, id|
  sum = 0
  element.each_with_index do |e, i|
    sum += price[i] * e
    print "(#{price[i]} * #{e})#{i < element.length - 1 ? "+" : "\s=\s#{sum}\n"}"
  end
  data << [id + 1, sum]
end

data.each do |answer|
  print "#{answer}\s"
end


実行結果例

(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]


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7633questions

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

  • データベース

    698questions

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

  • 配列

    522questions

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