2015-05-08 44 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