Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
universe = [1, 2, 3, 4, 5, 6]а = [2, 3]b = universe - а # Дополнение а = [1, 4, 5, 6]Если считаете необходимым, можете определить и унарный оператор (например,
-~Элементы множества можно перебирать, обходя массив. Единственная разница заключается в том, что элементы будут появляться в определенном порядке, а это может оказаться нежелательным. О том, как перебирать массив в случайном порядке, будет рассказано в разделе 8.1.18.
Наконец, иногда возникает необходимость вычислить степень множества. Это не что иное, как множество всех подмножеств данного множества (включая его само и пустое множество). Читатели, знакомые с дискретной математикой, в особенности с комбинаторикой, понимают, что число таких подмножеств равно 2n. Сгенерировать степень множества можно следующим образом:
class Array def powerset num = 2**size ps = Array.new(num, []) self.each_index do |i| a = 2**i b = 2**(i+1) — 1 j = 0 while j < num-1 for j in j+a..j+b ps[j] += [self[i]] end j += 1 end end ps endendx = [1, 2, 3]y = x.powerset# y равно:# [[], [1], [2], [1,2] , [3], [1,3], [2,3], [1,2,3]]8.1.10. Рандомизация массива
Иногда нужно переставить элементы массива в случайном порядке. Первое, что приходит на ум, — тасование карточной колоды, но есть и другие применения — например, случайная сортировка списка вопросов.
Для решения этой задачи пригодится метод
randclass Array def randomize self.sort_by { rand } # Сортировать по ключу, являющемуся end # случайным числом. def randomize! self.replace(self.randomize) endendx = [1, 2, 3, 4, 5]y = x.randomize # [3, 2, 4, 1, 5]x.randomize! # x равно [3, 5, 4, 2]Из-за самой природы сортировки, вероятно, вносится некоторое статистическое смещение. Но обычно это не играет роли.
Выбрать случайный элемент массива (не запрещая дубликатов) можно так:
class Array def pick_random self[rand(self.length)] endendНаконец, не стоит забывать, что метод
randsrand8.1.11. Многомерные массивы
Если для численного анализа вам нужны многомерные массивы, то в архиве приложений Ruby есть прекрасная библиотека
NArrayВ следующем примере показан способ работы с многомерными массивами за счет перегрузки методов
[][]=Array3class Array3 def initialize @store = [[[]]] end def [](a,b,c) if @store[a]==nil || @store[a][b]==nil || @store[a][b][c]==nil return nil else return @store[a][b][c] end end def []=(a,b,c,x) @store[a] = [[]] if @store[a]==nil @store[a][b] = [] if @store[a][b]==nil @store[a][b][с] = x endendx = Array3.newx[0,0,0] = 5x[0,0,1] = 6x[1,2,31 = 99puts x[1,2,3]Единственное, чего мы реально добились, — так это удобного использования запятой в обозначении
[x,y,z][x][у][z][]nil8.1.12. Нахождение элементов, принадлежащих одному массиву и не принадлежащих другому
В Ruby эта задача решается проще, чем во многих других языках. Нужно просто вычислить «разность множеств»:
