Михаил обнови решението на 31.10.2011 16:53 (преди около 13 години)
+#Здравейте
+#за съжаление нямах възможност да посещавам първите няколко
+#лекции и едва днес разбрах, че ще имаме домашни всяка седмица.
+#Това е, което успях да напиша за няколкото часа, в който
+#се запознах с Ruby. Не успях да подкарам Ламбда функцията на #find
+#Прочетох, че има и критерии, на които трябва да отговоря домаш-
+#ното ми, но не успях да ги спазя този път. Изпращам го просто
+#така, дори не съм сигурен дали това се чете от някой или
+#се изпълнява автоматично от компютър.
+
+class Song
+ def initialize(songname, artist, genre, subgenre, tags)
+ @name = songname.squeeze(" ")
+ @artist = artist.squeeze(" ")
+ @genre = genre.squeeze(" ")
+ @subgenre = subgenre.squeeze(" ")
+ @tags = tags
+ end
+ def name?(name)
+ if(name==nil)
+ then true
+ else @name==name
+ end
+ end
+ def artist?(artist)
+ if(artist==nil)
+ then true
+ else @artist==artist
+ end
+ end
+ def tags?(tags)
+ if(tags==nil)
+ then true
+ else (@tags&tags).length == tags.length
+ end
+ end
+ def to_s
+ "Song: #{@name}\nArtist: #{@artist}\nGenre:
+#{@genre}\nSubgenre: #{@subgenre}\nTags: #{@tags}\n\n\n"
+ end
+ def genresToTags
+ @tags<<@genre.downcase
+ if @subgenre.empty?
+ then #nothing
+ else @tags<<@subgenre.downcase
+ end
+ @tags.uniq!
+ end
+end
+
+class Collection
+ def initialize(songs_as_string, artist_tags)
+ @arrayofsongs = Array.new
+ array = songs_as_string.lines.to_a
+ array.each do |line|
+ name, artist, lotsofgenres, lotsoftags = line.chomp.split(/\s*\.\s*/)
+ genre, subgenre = lotsofgenres.split(/\s*\,\s*/)
+ tags = lotsoftags.split(/\s*\,\s*/)
+ @arrayofsongs<<Song.new(name, artist, genre, subgenre, tags)
+ end
+ artistsToTags(artist_tags)
+ genresToTags
+ end
+ def find(criteria)
+ if criteria[:tags].kind_of?(Array)
+ then #nothing
+ else criteria[:tags] = [criteria[:tags]]
+ end
+ returnvalue = Array.new
+ @arrayofsongs.each do |song|
+ if song.artist?(criteria[:artist])
+ and song.name?(criteria[:name]) and song.tags?(criteria[:tags])
+ then returnvalue<<song
+ end
+ end
+ returnvalue
+ end
+ def to_s
+ @arrayofsongs.each {|song| puts song.to_s}
+ end
+ def artistsToTags(artist_tags)
+ artist_tags.each do |artist, tags|
+ array = find artist: artist
+ end
+ end
+ def genresToTags
+ @arrayofsongs.each do |song|
+ song.genresToTags
+ end
+ end
+end