teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

訂正

2020/02/17 15:31

投稿

otn
otn

スコア86365

answer CHANGED
@@ -7,19 +7,9 @@
7
7
  単に連結して`take(3)`だと、`array5`で足りない個数を`array4`の先頭から使ってしまうので、`array4`以降は`shuffle`が必要です。
8
8
 
9
9
  #追記
10
- データの配列ごとの順序を守るとすると、ちょっとRubyらしくないコードですが、とりあえずこで出来ます
10
+ データの配列ごとの順序を守るとすると、最後の`sample`をやめばいいのか
11
11
  ```Ruby
12
12
  N=3
13
-
14
- result = []
15
- n=N
16
- [array5,array4,array3,array2,array1].each do |ary|
13
+ [array5,array4,array3,array2,array1].map(&:shuffle).inject(&:+).take(N)
17
- if ary.size >= n
18
- result.append(*(ary.sample(n)))
19
- break
20
- else
21
- result.append(*(ary.shuffle))
22
- n -= ary.size
23
- end
24
- end
25
- ```
14
+ ```
15
+ この場合は、`array5`の`shuffle`も無駄ではなくなります。

2

追記

2020/02/17 15:31

投稿

otn
otn

スコア86365

answer CHANGED
@@ -4,4 +4,22 @@
4
4
  [array5,array4,array3,array2,array1].map(&:shuffle).inject(&:+).take(N).sample(N)
5
5
  ```
6
6
  `array5`の`shuffle`はそもそも無駄。`array4`以降は使われないかもしれないけど`shuffle`するという無駄。
7
- 単に連結して`take(3)`だと、`array5`で足りない個数を`array4`の先頭から使ってしまうので、`array4`以降は`shuffle`が必要です。
7
+ 単に連結して`take(3)`だと、`array5`で足りない個数を`array4`の先頭から使ってしまうので、`array4`以降は`shuffle`が必要です。
8
+
9
+ #追記
10
+ データの配列ごとの順序を守るとすると、ちょっとRubyらしくないコードですが、とりあえずこれで出来ます。
11
+ ```Ruby
12
+ N=3
13
+
14
+ result = []
15
+ n=N
16
+ [array5,array4,array3,array2,array1].each do |ary|
17
+ if ary.size >= n
18
+ result.append(*(ary.sample(n)))
19
+ break
20
+ else
21
+ result.append(*(ary.shuffle))
22
+ n -= ary.size
23
+ end
24
+ end
25
+ ```

1

補足

2020/02/17 15:22

投稿

otn
otn

スコア86365

answer CHANGED
@@ -3,4 +3,5 @@
3
3
  N=3
4
4
  [array5,array4,array3,array2,array1].map(&:shuffle).inject(&:+).take(N).sample(N)
5
5
  ```
6
- `array5`の`shuffle`はそもそも無駄。`array4`以降は使われないかもしれないけど`shuffle`するという無駄。
6
+ `array5`の`shuffle`はそもそも無駄。`array4`以降は使われないかもしれないけど`shuffle`するという無駄。
7
+ 単に連結して`take(3)`だと、`array5`で足りない個数を`array4`の先頭から使ってしまうので、`array4`以降は`shuffle`が必要です。