Ruby计划在孩子们中间平均分配书籍
假设我有5本不同的书,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'],这次我想在第二天结束时将这些书平均分
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