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

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

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

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

配列

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

Q&A

解決済

4回答

1128閲覧

Ruby 大きさ7の配列の要素を、大きさ5の配列と大きさ2の配列に分ける全てのパターンを表示するプログラムを作成したい。

helvetica2

総合スコア12

Ruby

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

配列

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

0グッド

1クリップ

投稿2018/09/25 02:19

編集2018/09/26 03:54

皆様ご助言頂きありがとうございました!
最終的にStars1024のプログラムを改変することで目的のプログラムが完成致しましたので、ベストアンサーとさせて頂きました

前提・実現したいこと

大きさ7の配列の要素を、大きさ5の配列と大きさ2の配列に分ける全てのパターンを表示するプログラムを作成したいです。
少々複雑で分かりにくい内容の質問になってしまったので、もし不明な点があれば追記・修正の依頼で不明点を聞いて頂ければできるだけ早く修正させて頂きます。

Ⅰ.配列x=["A","A","A","A","A","B","B","B"]から5つの要素を取り出す時、要素の組み合わせを全パターン求める
Ⅱ.5つの要素の組み合わせを全パターン表示する。その際、一つの組み合わせを表示するごとに、その直後にxから、取り出した5つの要素を除いた2つの要素を含む配列yを表示する

【例】
/-----------------------------------------/
配列x=["A", "A", "A", "A", "B", "B", "B"]
ここから5つの要素を取り出す時、要素の組み合わせの全パターンは
["A", "A", "A", "A", "B"]["A", "A", "A", "A", "B"]["A", "A", "A", "A", "B"]
["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]
["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]
["A", "A", "B", "B", "B"]["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]
["A", "A", "A", "B", "B"]["A", "A", "B", "B", "B"]["A", "A", "B", "B", "B"]
["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]["A", "A", "A", "B", "B"]
["A", "A", "B", "B", "B"]["A", "A", "B", "B", "B"]["A", "A", "B", "B", "B"]
の21つとなる。
これを表示する際、
["A", "A", "A", "A", "B"]["B", "B"]
["A", "A", "A", "A", "B"]["B", "B"]
...
["A", "A", "B", "B", "B"]["A", "A"]
と表示されるようにしたい
/---------------------------------------/

上記のⅠの配列から要素を5つ取り出した時の要素の組み合わせを全パターン求める方法は別の質問(https://teratail.com/questions/148327)でご助言を頂き、解決したのですが、Ⅱの**取り出した5つの要素を配列xから除き、配列yを求める方法**が分からず困っております。

度重なる質問になってしまい恐れ入りますが、ご助言頂ければ幸いです。

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

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

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

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

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

guest

回答4

0

要素がユニークなら、元のArray - 生成したArrayで差が求まりますが、値が重複しているのでこれでは出来ません。

取り除く要素を順番に、indexdelete_atで元のArrayから取り除くくらいでしょうか。

別解としては、[0,1,2,3,4,5,6]というArrayに対して処理を行えば、上述のように差が-で求められます。表示の時にx[i]とかで文字に直せばいい。

後者だと簡単か。

Ruby

1x = [ ~~~ ] 2y = (0...x.size).to_a 3y.combination(5) do |a| 4 puts "#{a.map{|i|x[i]}.inspect}#{(y-a).map{|i|x[i]}.inspect}" 5end

投稿2018/09/25 03:54

編集2018/09/25 04:13
otn

総合スコア84555

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

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

asm

2018/09/25 06:06

values_at使うといいかもしれません
otn

2018/09/25 07:03

なるほど。 puts "#{x.values_at(*a).inspect}#{x.values_at(*(y-a)).inspect}" ですね。 元の方が、「aの要素を変換掛けて表示している」感があるので、回答はそのままにしておきます。
guest

0

ベストアンサー

表示するだけなら以下のコードでできました。

ruby

1a = ["A","A","A","A","B","B","B"] 2b = a.combination(5).to_a 3c = a.combination(2).to_a 4 5for i in 0...b.length 6 print(b[i]," ",c[b.length - i - 1],"\n") 7end 8

投稿2018/09/25 04:10

編集2018/09/25 05:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Ⅰ.配列x=["A","A","A","A","A","B","B","B"]から5つの要素を取り出す時
【例】
/-----------------------------------------/
配列x=["A", "A", "A", "A", "B", "B", "B"]

微妙に配列xが違うのですが・・・

とりあえず後者でやってみると

rb

1x=["A", "A", "A", "A", "B", "B", "B"] 2(0...x.size).to_a.combination(5) do |a| 3 p x.partition.with_index{|_, i| a.include? i } 4end

投稿2018/09/25 06:02

asm

総合スコア15147

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

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

0

RubyのArrayにはselectという便利なメソッドがあります。(参考
参考リンクにサンプルがありますが、書式は以下のような感じです。

ruby

1[受け取る変数] = [基準となる配列].select { |[変数]| [条件式] }

元の大きさ7の配列と、組み合わせで求めた各5つの配列で
このメソッドを上手く使えば、質問者様のやりたいことができるかと思います。

投稿2018/09/25 02:54

dice142

総合スコア5158

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

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

dice142

2018/09/25 03:59

値の重複に関して考慮に入れてませんでした。 私の回答は重複なしの場合を前提に参考にしていただければと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問