Обсуждение:Ruby/Подробнее о массивах
Добавить темуА куда делся сборник задач? --TweeKane 17:42, 14 августа 2008 (UTC)
Решение задач про массивы by YankovskyAndrey 13:30, 7 ноября 2008 (UTC)
Одномерные
[править]Вывести индексы массива в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
p (0...array.size).to_a.sort_by{|v| array[v]}
85.172.118.16 22:32, 13 января 2009 (UTC)GaGar1n 95.25.53.167 15:59, 21 сентября 2009 (UTC) 95.25.53.167 15:59, 21 сентября 2009 (UTC)
91.103.73.83 13:15, 6 октября 2009 (UTC)
Возможное решение:
m = [1,2,3,4,5,-1,-3,-5,-6]
m.sort.each { |i| p m.index(i) }
r3nya 21:45, 22 августа 2011 (UTC)r3nya
не работает с повторяющимися значениями элементов 77.243.97.11 20:30, 5 ноября 2011 (UTC)
Возможное решение:
class Array
def map_with_index
a=Array.new
self.each_with_index{|o,i|
p=yield o,i
a.push(p)
}
return a
end
end
a.map_with_index{|o,i| [o,i]}.sort{|a,b| a[0]<=>b[0]}.map{|a| a[1]}
46.39.224.21 20:05, 9 сентября 2012 (UTC) 20:07, 9 сентября 2012 (UTC)
Слегка модифицированный вариант предыдущего способа с использованием версии 1.9:
p a.map.with_index{|o,i| [o,i]}.sort.transpose[1]
BlindMan (обсуждение) 21:27, 24 сентября 2012 (UTC)
Ипользуя each_with_index
arr = [55, 66, 43, 48, -300, 42]
arr.each_with_index do |elem, index|
arr.sort
puts index
end
--188.162.36.102 17:10, 7 апреля 2013 (UTC)
====В численном массиве найти сумму отрицательных элементов.====
Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
p array.find_all{|v| v<0}.inject(0){|v,result| result+v}
Возможное решение:
array=[-1,-2,-3,-4,1,2,3,4]
p array.inject(0){ |res,elem| elem < 0? res + elem : res}
--213.109.95.90 05:40, 16 сентября 2012 (UTC) Ruby beginner
Возможное решение:
array = [1, -2, -6, 4, 2, 8, -6, 8, 2, -1]
array_negative, array_positive = array.partition{ |elem| elem < 0 }
p array_negative.inject(0){ |result, elem| result + elem }
Deslaim (обсуждение) 18:47, 24 августа 2014 (UTC)
Найти все индексы, по которым располагается максимальный элемент.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
max=array.max
array.each_index{|x| if array[x]==max then puts "#{x}" end}
или
array=[1,-2,-6,4,2,8,-6,8,2,-1]
p (0...array.size).find_all{|x| array[x]==array.max}
78.107.55.122 07:37, 4 января 2009 (UTC) Azadi | 91.200.47.156 08:06, 20 апреля 2010 (UTC) deGreeZ
В массиве переставить в начало элементы, стоящие на чётной позиции, а в конец — стоящие на нечётной.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
even,odd=Array.new,Array.new
array.each_with_index do |element, index|
ar = index % 2 == 0 ? even : odd
ar << element
end
p odd+even
array=[1,-2,-6,4,2,8,-6,8,2,-1]
(0..array.size-1).inject(:odd=>[], :even=>[]) do |s,i|
(array[i] % 2 == 0 ? s[:odd] : s[:even]) << array[i]
s
end
82.131.7.162 22:29, 15 января 2009 (UTC)
array = [1, 2, 3, -2, 3, 2, -3, -1]
p (0...array.size).to_a.partition{|i| i.odd? }.flatten.map{|i| array[i]}
193.239.216.162 08:35, 14 мая 2009 (UTC) Bill
95.135.17.65 01:02, 10 ноября 2009 (UTC)добавлено reverse перед flatten т.к. чётные элементы массива, это нечётные индексы массива.
~~Commandos~~
p (0...a.size).find_all{|x| x.even?}.map{|i| a[i]}+(0...a.size).find_all{|x| x.odd?}.map{|i| a[i]}
90.155.142.2 20:15, 2 ноября 2010 (UTC) Dpoke
BlackKOT 14:24, 17 января 2012 (UTC)
array = [1, 5, 8, 10, -20, -21, 23, 3]
p array.each_index.to_a.sort_by{|a| a % 2}.map{|b| array[b]}
=> [1, 23, 8, -20, 10, -21, 5, 3]
188.32.158.4 20:12, 1 августа 2012 (UTC)
arr=[1,10,-5,17,-30,2,17,-30,2,7]
arr_ind=(0...arr.size).to_a
arr_odd=arr_ind.find_all{|e| e.odd?}
arr_odd_num=arr_odd.map{|e| arr[e]}
arr_odd.find_all{|e| arr[e]=nil}
p arr.compact+arr_odd_num #=>[1, -5, -30, 17, 2, 10, 17, 2, -30, 7]
79.164.108.243 20:13, 19 марта 2013 (UTC)
a=[0,1,2,3,4,5,6,7,8,9]
(a.partition.with_index{|e,i| i.even?}).flatten #=> [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
--Evgeny.V.Orlov (обсуждение) 08:27, 15 мая 2013 (UTC)
a=[-2,-4,7,1,3,-9,6,7]
p a.partition{ |x| a.index(x).even?}.flatten
SP3k7eRx (обсуждение) 18:44, 29 июля 2014 (UTC)
Одномерные целочисленные
[править]Найти все элементы, большие среднего арифметического элементов.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
average=array.inject(0.0){|v,sum| sum+v.to_f}/array.size
p array.find_all{|v| v>average}
62.16.92.86 08:36, 31 июля 2009 (UTC)hensh
array=[1,-2,-6,4,2,8,-6,8,2,-1]
avg=(arr.inject(0){|x,y| x+y}).to_f/arr.size
p arr.find_all{|x| x>avg}
evgueniy.g@gmail.com
array=[1,-2,-6,4,2,8,-6,8,2,-1]
p array.find_all{ |enum| enum > (array.inject(0){ |x, y| x + y} / array.size)}
borodulind@gmail.com
К чётным элементам прибавить первый элемент, а к нечётным — последний. Первый и последний элемент не изменять.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
(1..array.size-2).each do |index|
array[index]+= index[0].zero? ? array[-1] : array[0]
end
p array
кто-то из нас неправильно понял задачу... если проверять ЭЛЕМЕНТ на четность, то решение должно иметь вид:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
(1..array.size-2).each do |index|
array[index]+= (array[index])[0].zero? ? array[0] : array[-1]
end
p array
78.107.55.122 11:09, 4 января 2009 (UTC)
Второй вариант
a=(0..10).to_a.sort(rand) #=> [10, 6, 1, 7, 3, 8, 5, 9, 4, 2]
b=Array.new; a[1..-2].each{|x| if x[0].zero? then b.push(x+a[0]) else b.push(x+a[-1]) end}; b.push(a[-1]); b.unshift(a[0]) #=> [10, 16, 3, 9, 5, 18, 7, 11, 14, 2]
Qwerty013 20:57, 9 сентября 2009 (UTC)
Третий вариант
p (0...array.size).to_a.map{|i| i > 0 && i < array.size - 1 ? ((i % 2).zero? ? array[i] + array[-1] : array[i] + array[0]) : array[i] }
95.135.17.65 02:14, 10 ноября 2009 (UTC)третий вариант
Четвертый вариант
преследуемые цели: использовать только АУО, не заводить лишних переменных, получить "решение в одну строку"
require 'enumerator'
array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
p array.enum_with_index.map { |e, i| [ [e+array[0], e+array[-1]][e%2 <=> 0], e ][ ([0, array.size-1].include?(i).to_s) <=> 'false' ] }
#=> [1, 3, 12, 5, 14, 7, 16, 9, 9]
P.S.: буду рад услышать коментарии и исправления
DeGreeZ 11:40, 20 апреля 2010 (UTC)
Пятый вариант
sf = (10..20).to_a
(1...sf.size-1).to_a.each{ |x| sf[x] += ((sf[x] % 2).zero? ? sf[0] : sf[-1]) }; p sf
skywarp 19:44, 6 июля 2010 (UTC)
Шестой
(1...array.size-1).to_a.map do |elem|
if array[elem].even?
array[elem]+=array[0]
else
array[elem]+=array[array.size-1]
end
end
p array
--95.220.193.56 16:45, 29 марта 2011 (UTC)
Седьмой в одну строку
[array[0],(1...array.size-1).map{|e| array[e] + array[-array[e][0]] },array[-1]].flatten
194.88.206.172 22:13, 15 июня 2011 (UTC) Sitin
Заменить все положительные элементы на значение минимального.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
min=array.min
(0..array.size-1).each do |i|
if array[i]>0
array[i]=min
end
end
p array
или
array = [1,-2,-6,4,2,8,-6,8,2,-1]
min = array.min
p array.map { |el| el > 0 ? min : el }
62.16.92.86 09:07, 31 июля 2009 (UTC)hensh
~
Найти произведение всех чётных элементов массива.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
product=1
p array.each_with_index{|v,i| if i[0].nonzero? then product*=v end}
p product
Выше приведено решение для четных индексов. В задаче речь идет о чётности именно элементов.
array=[1,-2,-7,4,3,8,-6,5,2,-1]
product=1
p array.each{|v| if v[0].zero? then product*=v end}
p product
85.172.118.16 23:17, 13 января 2009 (UTC)GaGar1n
вот еще вариант
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p array.inject(1) { |res, el| res * (el.even? ? el : 1) }
62.16.92.86 09:16, 31 июля 2009 (UTC)hensh
Слегка модифицированный вариант
p array.inject(1){ |rez, el| el.even? ? rez * el : rez}
~~Commandos~~
предлагаю ещё вариант, используя именно функции, изложенные в данной теме.
p (0...array.size).find_all{ |v| (v % 2).nonzero? }.inject(1){ |prod, v| prod * array[v] }
91.196.95.17 15:24, 10 ноября 2009 (UTC)KolobocK
последний вариант, но короче:
p (0..array.size-1).inject(1){|k,x| (array[x]%2==0) ? (k*=array[x]) : k}
и самый простой вариант:
array.find_all{|z| z.even?}.inject{|x,y| x*y}
194.50.161.38 13:52, 27 октября 2010 (UTC)Sirko
Найти количество минимальных элементов.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
min=array.min
p array.find_all{|v| v==min}.size
Альтернатива:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
p array.count(array.min)
~~Commandos~~
Вывести индексы элементов, меньших своего левого соседа.
[править]Возможное решение:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
(1..array.size-1).each do |i|
if array[i]<array[i-1] then p i
end
end
еще вариант:
array=[1,-2,-6,4,2,8,-6,8,2,-1]
p (1...array.size-1).find_all{ |v| array[v]<array [v-1]}
88.85.186.105 20:02, 31 июля 2009 (UTC)Valery
46.39.224.21 18:38, 25 октября 2012 (UTC).
Двумерные
[править]Поменять первый и последний столбец массива местами.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
array=array.transpose
array[0],array[-1]=array[-1],array[0]
p array.transpose
Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
elSize = array[0].size
p array.each{ |i| i[0] += i[elSize-1]; i[elSize-1] = i[0]-i[elSize-1]; i[0] -= i[elSize-1] }
80.68.6.248 07:10, 6 октября 2009 (UTC)Cheremencev
Возможное решение:
array=[[1,2],[3,4],[5,6]]
array[-1], array[0] = array[0], array[-1]
Janitor 19:17, 12 февраля 2011 (UTC)
Возможное решение:
array=[[1,2],[3,4],[5,6],[7,8]]
array=array.transpose
array[1..-2].push(array[0]).unshift(array[array.size-1]).transpose
194.226.240.200 08:05, 1 марта 2012 (UTC) JayDee
Возможное решение:
p [[1, 2, 3], [4, 5, 6]].transpose.tap{|e| e[0],e[-1]=e[-1],e[0]; }.transpose
84.42.23.118 15:03, 10 апреля 2012 (UTC) prog.devel
Возможное решение:
a=[[2,5,4],[7,3,9]]
p a.each{|x| x[0],x[-1]=x[-1],x[0]} #=> [[4, 5, 2], [9, 3, 7]]
sP3k7eRx (обсуждение) 18:02, 30 июля 2014 (UTC)
Упорядочить N-ый столбец.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
N=2
p array
array=array.transpose
array[N].sort!
p array.transpose
Возможное решение:
array=[[1,-2,-6,74,2,8],[-6,4,2,8,44,33],[1,63,24,11,2,8]]
N=3
p array.transpose.tap{|i| i[n].sort!}.transpose
--178.54.126.195 19:04, 11 ноября 2012 (UTC)Kuznec
Упорядочить строки, содержащие максимальный элемент.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
max = array.flatten.max
(0..array.size-1).each do |i|
if array[i].include?(max) then array[i].sort!
end
end
p array
немного короче.
b=[[-2,0,4],[7,-1,-5],[3,7,-3]]
p (0...b.size).to_a.map{|x| (b[x].include?(b.flatten.max)) ? b[x].sort!: b[x]} #=>[[-2, 0, 4], [-1, 5, 7], [-3, 3, 7]]
и еще короче:
a=[[-2,0,4],[7,-1,-5],[3,7,-3]]
max = a.flatten.max
p a.each{|x| if x.include?(max) then x.sort! end}
LUR 14:24, 30 марта 2010 (UTC)
И ещё вариант в одну строку:
test = [[1,-2,-6,74,2,8],[-6,4,2,8,44,33],[1,63,24,11,2,8]]
(0...test.size).each{|i| (test[i].sort! if test[i].max == test.flatten.max)}
Ivan.Feofanov (обсуждение) 06:18, 19 ноября 2014 (UTC)
Возможное решение:
array=[[1,-2,-6,74,2,8],[-6,4,2,8,44,33],[1,63,24,11,2,8]]
p array.map {|i| i.max==array.flatten.max ? i.sort! : i}
--178.54.126.195 19:26, 11 ноября 2012 (UTC)Kuznec
Упорядочить строки, если они не отсортированы и перемешать, если они отсортированы.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
(0..array.size-1).each do |i|
array[i]==array[i].sort ? array[i]=array[i].sort_by{rand} : array[i].sort!
end
p array
или вариант:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
array.each{|x| if x==x.sort then x.sort_by!{rand} else x.sort! end}
194.50.161.38 08:16, 28 октября 2010 (UTC)Sirko
ещё можно так.
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
p array.map{|e| (e==e.sort)? e.sort_by{rand}:e.sort()}
Erliz 06:37, 26 сентября 2011 (UTC)
Упорядочить строки массива по значению элемента главной диагонали в каждой из строк (в исходном массиве).
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
mainDiagonal=Array.new
(0..array.size-1).each do |i|
mainDiagonal<<array[i][i]
end
indixes = (0..array.size-1).sort_by { |v| mainDiagonal[v] }
p indixes
result = Array.new
indixes.each do |index|
result << array[index]
end
p result
немного короче.
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
diag=(0...array.size).map{|i| array[i][i]}
(0...diag.size).sort_by{|i| diag[i]}.map{|i| array[i]}
ещё покороче:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
n=-1
p array.sort_by{|e| n+=1; e[n]}
Erliz 14:03, 23 сентября 2011 (UTC)
Или вот так:
a = [[-2,0,4],[7,-1,-5],[3,7,-3]]
p (0...a.size).sort_by{|n| a[n][n]}.map{|n| a[n]}
195.112.118.245 04:11, 25 января 2012 (UTC)
А вот еще чуток короче(Ruby v.1.9):
p a.sort_by.with_index {|elem, i| elem[i]}
BlindMan (обсуждение) 22:14, 24 сентября 2012 (UTC)
Или как вариант:
p array.sort_by!{|a| a[array.index(a)]}
--159.224.112.84 07:29, 1 сентября 2015 (UTC)Pashka
Найти номера строк, элементы которых упорядочены по возрастанию.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
for i in 0..array.size-1
if (array[i]==array[i].sort) then p i
end
end
или так:
array.each_with_index{|v,i| if v == v.sort then p i end}
LUR 10:22, 31 марта 2010 (UTC)
как вариант:
puts (0...a.size).to_a.find_all{|x| a[x]==a[x].sort}
а вот мой вариант 90.155.225.248 19:25, 14 июля 2013 (UTC)PaRRoT
array=[[-2,0,4],[7,-1,-5],[3,7,-3],[1,2,3]]
p array.map.with_index{|elem,i| elem==elem.sort ? i : nil }.compact
194.50.161.38 15:09, 2 ноября 2010 (UTC)Sirko
и еще вариант покороче :
p array.find_all { |e| e == e.sort }
--159.224.118.87 12:20, 23 февраля 2014 (UTC)mcio
Двумерные целочисленные
[править]Найти максимальный элемент для каждого столбца, а затем получить произведение этих элементов.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
array.transpose
product=1
(0..array.size-1).each do |i|
product*=array[i].max
end
p product
У Вас здесь ошибка, метод transpose - он ведь не изменяет массив, т.е. надо
array=array.transpose
а в вашем коде находятся максимумы строк, не столбцов. в коде который следует за этим, такая же ошибка, максимумы строк а не столбцов ищете.
возможно верный код:
b=[[90,90,90],[7,-1,5],[3,7,-3]]
b=b.transpose
p (0...b.size).inject(1){|x,y| x*=b[y].max} #=> 729000, что, кстати, равно 90**3
вот, а в следующем примере надо просто транспоуз сделать. я решил оставить ошибки, для наглядности обучения.
warnabas 13:11, 25 января 2010 (UTC) i'm
или
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
maxis = array.map { |obj| obj.max }
p maxis
p maxis.inject(1) { |res, el| res * el }
62.16.92.86 09:39, 31 июля 2009 (UTC)hensh
Короткая версия правильного решения:
p array.transpose.inject(1) { |res,v| res * v.max }
LUR 10:46, 31 марта 2010 (UTC)
Найти минимум в двумерном массиве.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
p (array.map {|v| v.min}).min
Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
p array.flatten.min
Найти произведение положительных элементов.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
p array.flatten.find_all{|v| v>0}.inject{|v,product| v*product}
или без find_all
p array=Array.new(5){Array.new(3){rand(10)-5}}
p array.flatten.inject(1){|val,e| val*= e>0? e : 1}
--Erliz 06:58, 26 сентября 2011 (UTC)
Найти сумму положительных элементов, больших К.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
k=gets.chomp.to_i
p array.flatten.find_all{|v| v>0&&v>k}.inject(0){|v,sum| sum+v}
Возможное решение:
x=[[1,2,17],[22,11,-2],[55,1,11]]
k=10
p x.flatten.inject(0){|r,e|r+=(0<e)&(e>k)? e:0}
--178.151.238.232 11:09, 8 марта 2015 (UTC)
Вычислить сумму и среднее арифметическое элементов главной диагонали.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
sum,average=0,1
(0..array.size-1).each do |i|
sum+=array[i][i]
average*=array[i][i]
end
puts "average = #{average}, sum = #{sum}"
"В математике и статистике сре́днее арифмети́ческое (или просто среднее) набора чисел — это сумма всех чисел в этом наборе делённая на их количество..." ru.wikipedia.org
b=[[90,90,90,1],[7,-1,5,14,41,4,1],[3,7,-3,3,54,5,1],[3,1,3,1,3,1]]
x=0
(0...b.size).inject(0){|x,y| x+=b[y][y] }
print x," ", x/b.size
warnabas 18:20, 25 января 2010 (UTC)
Как вариант (возможно немного более ruby-шное решение, Ruby v.1.9):
a=[[90,90,90,1],[7,-1,5,14,41,4,1],[3,7,-3,3,54,5,1],[3,1,3,1,3,1]]
diag = a.map.with_index{|row, i| row[i]}
p sum = diag.inject(:+)
p mean = sum / a.length
BlindMan (обсуждение) 22:38, 24 сентября 2012 (UTC)
Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
p (0...array.size).to_a.each.inject(0) {|res,i| res+array[i][i]}.tap{|i| print "sr.arefm.="+(i/array.size).to_s+" summ="}
array=[[-2,0,4],[7,-1,-5],[3,7,-3]] ~~~~
p sum = (0...array.size).to_a.inject(0){|sum, num| sum+array[num][num]}, sum.to_f/array.size
--178.54.126.195 21:31, 11 ноября 2012 (UTC)Kuznec
Возможное решение (учитывая что у матрицы по определению n строк и m столбцов):
a=[[3,-5,7,9],[2,2,-6,8],[-9,5,1,3],[1,7,-9,2],[1,8,-6,0]]
p s=a.map.with_index{|e,i| e[i]}.inject(0){|r,e| r+= (e==nil)? 0 : e}, s/a[0].size
sP3k7eRx (обсуждение) 18:44, 4 августа 2014 (UTC)
Найти номера строк, все элементы которых — нули.
[править]Возможное решение:
array=[[-2,0,4],[7,-1,-5],[3,7,-3]]
(0..array.size-1).each do |i|
if array[i].all?{|v| v==0} then p i end
end
95.135.17.65 03:00, 10 ноября 2009 (UTC)
Конструкция "0..array.size-1" записывается короче через многоточие "0...array.size"
Вот так короче:
(0...array.size).find_all{|x| array[x].all?{|v| v==0}}
Или в обратном порядке:
(a.map{|v| v.all? {|e| e==0}}).map.with_index {|e,i| p i if e}
--Evgeny.V.Orlov (обсуждение) 09:40, 15 мая 2013 (UTC)
Возможне решение:
a=[[3,-5,7,9],[0,0,0,0],[2,2,-6,8],[-9,5,1,3],[1,7,-9,2],[0,0,0,0]]
p a.map.with_index{|e,i| (e.all?{|x| x==0})? i : nil}.compact #=> [1, 5]
sP3k7eRx (обсуждение) 06:15, 7 августа 2014 (UTC)