2015-05-08 15 views
-1

想象我有5点不同的书,books = ['a','b','c','d','e'],我想这3个孩子kids = [k1,k2,k3]之间共享。我用ZIP和周期函数来完成这个操作,说Ruby程序给孩子们之间分发书籍同样

books.zip(kids.cycle) 

,使输出将是

{"a"=>"k1", "b"=>"k2", "c"=>"k3", "d"=>"k1", "e"=>"k2"} 

第二天,我还有一个4本书,books = ['f','g','h','i'],此时Iwant这些书之间分配同样的3个孩子同样在第二天结束,即。所有3个孩子在第二天结束时应该有3本书。

如何实现这一目标?

+0

确实如此?我怀疑这是作业 - 弄清楚。 –

+0

你能否更清楚地知道你的输入,输出和临时(在几天之间)的数据结构是什么?从第二天开始有什么信息是非常重要的,因为否则'(books1 + books2).zip(kids.cycle)'看起来可以完成这项工作。虽然必须在几天之内保留一些信息,否则这是不可能的。 –

回答

0

首先您需要考虑一下您将用于存储输入和输出数据的结构以及需要的某些中间数据。

随着哈希和数组就可以实现任意复杂结构。 然而,将来使用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 

你可以使用一些封装类不同的看法写+一些书发生器所以数据是动态生成的,而不是静态地宣布它。它可能看起来像这样

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 

没有更多的细节,很难说更多的东西。

+0

我很欣赏它,对ruby来说是新的,这是我依靠内置的函数,而不是自己编写完整的逻辑,所以我按照第一种方法建议,在这种情况下,一本书将由2个孩子共享。一个孩子应该有一本书,与另一个孩子分享。 – shashi

+0

- >第一天结束时5本书分发给3个孩子,所以2个孩子将有2本书和一个孩子只有一本书。这些孩子会开始阅读这些书,所以这些书在第二天就不能送给其他孩子。 \t \t - >第二天的书应该以这样的方式分配给孩子,使得k1应该得到1本书,即'f',同样的k2应该有'g',k3应该有'h'和'i'。这可能吗? – shashi

+0

有没有办法可以通过邮件与你联系? – shashi

0

如果books = ['a','b','c','d','e']kids = [k1,k2,k3],然后books2 = ['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"]] 
+0

第一天结束5本书分发给3个孩子,所以2个孩子将有2本书和一个孩子只有一本书。这些孩子会开始阅读这些书,所以这些书在第二天就不能送给其他孩子。我希望所有3个孩子都能恢复旧书,不分享,在这种情况下如何继续? – shashi

+0

第二天的书籍应该以这样的方式分发给孩子,让k1应该再多读一本书。e'f',同样k2应该有'g',k3应该有'h'和'i'。这可能吗? – shashi