Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby计划在孩子们中间平均分配书籍_Ruby_Loops_For Loop - Fatal编程技术网

Ruby计划在孩子们中间平均分配书籍

Ruby计划在孩子们中间平均分配书籍,ruby,loops,for-loop,Ruby,Loops,For Loop,假设我有5本不同的书,books=['a','b','c','d','e'],我想让它在3个孩子之间共享kids=[k1,k2,k3]。我使用zip和cycle函数来完成这个操作,比如 books.zip(kids.cycle) 因此,输出将是 {"a"=>"k1", "b"=>"k2", "c"=>"k3", "d"=>"k1", "e"=>"k2"} 第二天,我有另外4本书,books=['f'、'g'、'h'、'I'],这次我想在第二天结束时将这些书平均分

假设我有5本不同的书,
books=['a','b','c','d','e']
,我想让它在3个孩子之间共享
kids=[k1,k2,k3]
。我使用zip和cycle函数来完成这个操作,比如

books.zip(kids.cycle)
因此,输出将是

{"a"=>"k1", "b"=>"k2", "c"=>"k3", "d"=>"k1", "e"=>"k2"}
第二天,我有另外4本书,
books=['f'、'g'、'h'、'I']
,这次我想在第二天结束时将这些书平均分发给同3个孩子,也就是说,所有3个孩子在第二天结束时每人都应该有3本书


如何实现这一点?

假设您将输出存储在变量中,您可以执行
kids.rotate直到孩子数组从下一个应该收到书的孩子开始

之后,您可以再次执行相同的压缩操作

books = ['f','g','h','i']
books.zip(kids.cycle)

如果
书籍=['a'、'b'、'c'、'd'、'e']
儿童=[k1、k2、k3]
然后
书籍2=['f'、'g'、'h'、'i']

你可以做以下事情

(books + books2).zip(kids.cycle)
结果如下:

=> [["a", "marc"], ["b", "frank"], ["c", "melisa"], ["d", "marc"], ["e", "frank"], ["f", "melisa"], ["g", "marc"], ["h", "frank"], ["i", "melisa"]]

首先,您需要考虑用于存储输入和输出数据以及一些中间数据(如果需要)的结构

通过哈希和数组,您可以实现任意复杂的结构。 然而,使用OOP范式将数据封装在类中对未来来说通常是有利可图的

对于散列和数组,它可以如下所示:

#init data with your input
kids = ['Alice', 'Bob', 'Kate']
books_over_days = [
  [ 'book1', 'book2', 'book3'],
  [ 'book4', 'book5']
]

#init data for storing your output
kids_to_books = {}
kids.each {|kid| kids_to_books[kid] = []}

books_over_days.each do |books|
  kids.each {|kid| kids_to_books[kid] << books.sample}    
end 

puts kids_to_books.inspect
#使用您的输入初始化数据
孩子们=['Alice','Bob','Kate']
超过天的书籍=[
['book1'、'book2'、'book3'],
[‘第四册’、‘第五册’]
]
#用于存储输出的初始化数据
儿童读物={}
孩子们,每个{孩子们{孩子们{u to{u书籍[孩子们]=[]}
每天都有书。每个人都有书|

kids.each{kid{kid}kids to{u books[kid]事实上是怎样的?我想这是解决这个问题的家庭作业。你能更清楚地说明你的输入、输出和中间(几天之间)数据结构是什么吗?从第二天开始,你有什么信息是非常重要的,否则
(books1+books2).zip(kids.cycle)
看起来它可以完成这项工作。但在两天之间必须保留一些信息,否则这是不可能的。第一天结束时,5本书将分发给3个孩子,因此2个孩子将有2本书,一个孩子只有一本书。这些孩子将开始阅读这些书,因此第二天这些书不能给另一个孩子。我想要所有3个孩子都恢复他们的旧书,没有共享,在这种情况下如何继续?第二天的书应该以这样的方式分发给孩子,k1应该多得到一本书,即“f”,同样k2应该有“g”,k3应该有“h”和“i”。这可能吗?我很感激,我对ruby是新的,我依赖于内置函数,而不是w我自己写完整的逻辑,所以我按照你建议的第一种方法,在这种情况下,一本书将由两个孩子共享。一个孩子应该有一本书,这本书将与另一个孩子共享。->第一天结束时,5本书将分发给3个孩子,所以两个孩子将有2本书,一个孩子只有一本书。这些孩子将开始阅读这些书,所以se图书第二天不能给其他孩子。->第二天的图书应该以这样的方式分发给孩子,k1应该多得到一本书,即“f”,同样k2应该有“g”,k3应该有“h”和“i”。这可能吗?我有没有办法联系你,比如通过邮件?@shashi-试着修改上述代码。如果你不知道请不要自己开始编码。如果一本书不能分配给多个孩子,则不要从数组中获取样本。样本并保持数组不变,您可以从数组中弹出数据,以便其他孩子无法使用。但是,如果您需要平均分配书,则最好在首先,在每次迭代中,给一个孩子分配一本书,事实上,正如amerdidit在回答中所建议的那样,这可以在一行中完成。这取决于你的需求。
class Kid
  attr_reader :books, :name
  def initialize(name)
    @name = name
    @books = []
  end

  def add_book(book)
    @books << book
  end
end

Book = Struct.new(:name)

class BooksGenerator
  attr_reader :books
 def initialize(factor)
    @books = []
    @factor = factor
  end

  def generate
    0.upto(Random.rand(@factor)) {|e| @books << "book#{Random.rand(@factor*@factor)}"}
    @books.uniq!
  end
end

days_n = 3

generator = BooksGenerator.new(5)
kids = [Kid.new("Alice"), Kid.new("Bob"), Kid.new("Kate")]
days_n.times do
  generator.generate
  kids.each { |k| k.add_book(generator.books.sample)}
end

puts kids.inspect