Ruby/Практикум/Итераторы
Материал из Викиучебника
[править] Итераторы
[править] Дан целочисленный массив. Найти количество четных элементов.
Возможное решение:
m = [1, 3, 7, 5 ,8] k = m.select{ |i| (i%2)==0 } p k.size
Замечания по решению:
Возможное решение:
m = [1, 2, 3, 4, 5, 6, 7] p m.select{ |x| x%2 == 0}.size
Замечания по решению:
Возможное решение:
m = [2, 3, 6, 7, 9] p( m.select{ |i| i[0].zero? }.size )
Замечания по решению:
Возможное решение:
a = [-1, 2, -2, 1] p a.find_all{ |elem| elem%2 == 0 }.size
Замечания по решению:
Возможное решение:
mac = [1, 2, 3, 4, 5, 6, 7, 8] p mac.inject(0){|sum,item| (item%2==0) ? (sum+1) : sum}
Замечания по решению:
[править] Дано натуральное число. Необходимо проверить, является ли оно совершенным.
Возможное решение:
m = 20 a = Array.new(m-1){ |i| i+1 } b = a.select{ |x| m % x == 0 } p( b.inject(0){ |result,elem| result+elem } == m )
Замечания по решению:
Возможное решение:
n=8128 n1=0 (1...n).each{|d| n1+=d if n%d==0} p n==n1
Замечания по решению:
[править] Дан целочисленный массив. Найти количество его локальных максимумов.
Возможное решение:
m = [1,2,3,2,3,4,2,4,6,7] p( (1..m.size-2).to_a.select{ |i| (m[i] > m[i-1])&&(m[i] > m[i+1]) }.size )
Замечания по решению:
Возможное решение:
maccuB = [4, 8, 6, 5, 1, 2, 3, 5, 4, 8, 9, 6] p (1...maccuB.size-1).select{ |x| (maccuB[x] > maccuB[x-1])&&(maccuB[x] > maccuB[x+1]) }.size
Замечания по решению:
Возможное решение:
require 'enumerator' m = [1,2,3,2,3,4,2,4,6,7] cnt=0 m.each_cons(3){|a,b,c| cnt+=1 if a<b and b>c} p cnt
Замечания по решению:
[править] Дан целочисленный массив. Проверить, чередуются ли в нем положительные и отрицательные числа.
Возможное решение:
m = [5, -12, 5, -12, 9, -25] p (1...m.size-1).all?{ |i| ((m[i-1] < 0) && (m[i+1] < 0)) || ((m[i-1] > 0) && (m[i+1] > 0)) }
Замечания по решению:
Возможное решение:
maccuB = [1, -2, 5, -4] p (0..maccuB.size-2).all?{ |x| (maccuB[x] * maccuB[x+1]) < 0 }
Замечания по решению:
[править] Дан целочисленный массив и отрезок a..b. Необходимо найти элементы, значение которых принадлежит этому отрезку.
Возможное решение:
m = [1,2,3,4,5] a = 1 b = 20 p( m.select{ |x| x>=a && x<=b } )
Замечания по решению:
Возможное решение:
maccuB = [1,2,3,4,5,6] a=2 b=4 maccuB.select{ |x| (a..b).include?( x ) }
Замечания по решению:
Возможное решение:
maccuB = [1, 2, 3, 5, 8] a,b = 2,5 p( maccuB - (maccuB - ((a..b).to_a)) )
Замечания по решению:
[править] Дано число А и натуральное число N. Найти результат следующего выражения 1 + А + А*2 - А*3 + … + (-1**N)*А*N.
Возможное решение:
A,N = 5,7 diapazon = 4..N p diapazon.inject(1 + A + A*2 - A*3){ |sum,i| sum + (-1**i)*A*i }
Замечания по решению: в данном решение допущена серьёзная ошибка. Приоритет у операции ** (возведение в степень) выше чем у операции -. поэтому сначала 1**i, а затем результат берётся с другим знаком. фрагмент кода следует заменить на { |sum,i| sum + ((-1)**i)*A*i }
[править] Дано вещественное число R и массив вещественных чисел. Найти элемент массива, который наиболее близок к данному числу.
Возможное решение:
R,macc = 13.0, [3.1, 7.2, 10.3, 15.5] macc = macc.sort b = macc.select{ |i| i<R } c = macc.select{ |i| i>R } d = b.max e = c.min if (R-d) > (e-R) puts e else puts d end
Замечания по решению:
Возможное решение:
a, R = [1.2,2.5,3.1,4.3,2.1,3.6,5.7], 4.0 p a.sort_by{ |i| (i-R).abs }[0]
Замечания по решению:
Возможное решение:
R,arr = 13.0, [3.1, 7.2, 10.3, 10.6, 15.5] require 'enumerator' arr.each_cons(2){|a,b| if a <=R and b>=R then if R-a<=b-R then p a else p b end end}
Замечания по решению:
[править] Дан целочисленный массив. Необходимо найти максимальный нечетный элемент.
Возможное решение:
a = [1,2,3,4,5,7,8] p( a.select{ |i| i%2 == 1 }.max )
Замечания по решению:
Возможное решение:
arr=[1,6,0,3,9,4,8,2,5,3] p arr.reject{|e| e%2==2}.max
Замечания по решению:
[править] Дано целое число. Необходимо найти все натуральные делители этого числа.
Возможное решение:
a = 12 b = (1..a) p( b.select{ |n| (a%n==0) } )
Замечания по решению:
Возможное решение:
n = 20 mas = (1..n).to_a p( mas.find_all{ |x| x%n == 0 } )
Замечания по решению:
Решение аналогично предыдущему, find_all - синоним select; переводить диапазон в массив - лишнее.
[править] Дан целочисленный массив. Вывести индексы элементов, которые меньше своего левого соседа, и количество таких чисел.
Возможное решение:
m = [5, 4, 1, 3, 2, 7, 0, 1, 7] temp = (1...m.size).select{ |x| m[x] < m[x-1] } p temp, temp.size
Замечания по решению:
[править] Дан целочисленный массив и отрезок a..b. Необходимо найти количество элементов, значение которых принадлежит этому отрезку.
Возможное решение:
m = [1, 2, 3, 4, 5] a,b = 3,5 m.select{ |i| (a..b).include?( i ) }.size
Замечания по решению:
Возможное решение:
m = [1, 3, 4, 5, 6, 9, 3] indd = 0..m.size-1 a,b = 3,7 p indd.select{ |n| (m[n] >= a)&&(m[n] <= b) }.size
Замечания по решению:
[править] Дан целочисленный массив. Необходимо вывести вначале его элементы с четными индексами, а затем - с нечетными.
Возможное решение:
m = [1,2,3,4,5,6,7] s = (0..m.size-1).to_a p s.partition{ |i| i[0].zero? }.flatten.map{ |i| m[i] }
Замечания по решению:
Возможное решение:
a = [1,2,3,4,5,6] (0...a.size).partition{ |x| x%2 == 0 }.flatten.map{ |x| a[x] }
Замечания по решению:
Возможное решение:
arr = [3, 7, 10, 6, 15] p arr.partition{|e| arr.index(e)%2 == 0}
Замечания по решению:
[править] Дан целочисленный массив. Необходимо найти минимальный четный элемент.
Возможное решение:
m = [1,2,3,2,3,4,4] p( m.select{ |i| i[0] == 0 }.min )
Замечания по решению:
Возможное решение:
maccuB = [1,2,3,4,2,23,5,23] p( maccuB.select{ |i| i%2 == 0 }.min )
Замечания по решению:
[править] Дан целочисленный массив. Найти среднее арифметическое модулей его элементов.
Возможное решение:
m = [1, 2, 3, 4, 5] p m.inject(0){ |sum,el| summ + el.abs } / m.size
Замечания по решению:
Возможное решение:
mac = [1,2,3,4] d = mac.size jopa = mac.map{ |jo| jo.abs } j = jopa.inject(0){ |c,jo| c+jo } j/d
Замечания по решению:
[править] Дан целочисленный массив. Найти все элементы, которые меньше среднего арифметического элементов массива.
Возможное решение:
a = [1, 2, 3, 4, 5] b = a.inject(0){ |b,c| b+c } / a.size a.select{ |i| i < b }
Замечания по решению:
[править] Дан целочисленный массив. Необходимо найти количество минимальных элементов.
Возможное решение:
m = [1, 1, 1, 2, 3, 4] a = m.min b = m.select{ |i| i == a } p b.size
Замечания по решению:
Возможное решение:
m = [1, 2, 3, 4, 5] p m.select{ |x| x == m.min }.size
Замечания по решению:
[править] Дано число А и натуральное число N. Найти результат следующего выражения 1 + А + А*2 + А*3 + … + А*N.
Возможное решение:
A,N = 10,15 p (1..N).inject(1){ |s,i| s+A*i }
Замечания по решению:
Возможное решение:
A,N = 20,15 (0..N).map{ |x| x*A }.inject(1){ |x,y| x+y }
Замечания по решению:
[править] Дано натуральное число n. Необходимо найти число n!!, где n!! = 1*3*5*...*n для нечетного n и n!! = 2*4*6*...*n для четного.
Возможное решение:
n = 15 maccuB = (1..n).to_a maccuB = maccuB.partition{ |i| i[0].zero? }[ n%2 ] p( maccuB.inject(1){ |result,elem| result*elem } )
Замечания по решению:
Возможное решение:
n = 23 a = (1..n).to_a p( a.partition{ |x| x%2 == 0 }.select{ |x| x.index( a[-1] ) }.flatten.inject(1){ |rez,x| rez*x } )
Замечания по решению:
Возможное решение:
n=7 product=1 n.step(1,-2){|v| product*=v} p product
Замечания по решению:
Возможное решение:
n = 11 p (1..n).inject(1){|pr,e| pr= (e%2 ==n%2)? pr*e : pr}
Замечания по решению:
[править] Дан целочисленный интервал a..b. Необходимо найти произведение кубов всех нечетных чисел в этом интервале.
Возможное решение:
a,b = 4,19 p( (a..b).to_a.select{ |i| i[0]==1 }.map{ |elem| elem**3 }.inject(1){ |pe3yJIbTaT,nepemeHHa9| pe3yJIbTaT*nepemeHHa9 } )
Замечания по решению:
Возможное решение:
a,b=2,6 p (a..b).inject(1){|p,e| p= e%2==1? p*(e**3) : p}
Замечания по решению:
[править] Дан массив чисел. Необходимо проверить, чередуются ли в нем целые и вещественные числа.
Возможное решение:
m = [1, 2.5, 3, 3.5, 4, 4.5] p s = (1...m.size-1).all?{ |i| (m[i-1]*m[i]).integer? == (m[i+1]*m[i]).integer? }
Замечания по решению:
неоднозначное решение, предлагаю ниже своё решение
Возможное решение:
array=[1.1,1,2.2,3,7.5] int=array[0].integer? ? 0 : 1 p array.partition{|v| v.integer?}.flatten==(0..array.size-1).partition{|i| (i+int)[0].zero?}.flatten.map{|i| array[i]}
Замечания по решению:
Возможное решение:
arr = [1, 2.5, 3, 3.5, 5, 4.5] tmp = arr.partition{|e| arr.index(e)%2==0} p tmp.select{|e| e.all?{|el| el.to_s.include? '.'}}.size==1
Замечания по решению:
[править] Дан целочисленный массив и интервал a..b. Необходимо найти сумму элементов, значение которых попадает в этот интервал.
Возможное решение:
m = [1, 3, 7, 8, 9] a = 1 b = 8 p m.select{ |i| (a..b).include?(i) }.inject(0){ |s,i| s+i }
Замечания по решению:
Возможное решение:
arr = [1, 5, 3, 7, 4, 8] a,b=3,7 p arr.inject(0){|s,e| s= (a..b).include?(e) ? s+e : s}
Замечания по решению:
[править] Дан целочисленный массив. Необходимо вывести вначале его положительные элементы, а затем - отрицательные.
Возможное решение:
a = [1, -1, 3, 0, 5, -7] k = a.select{ |i| i >= 0 } s = a.select{ |i| i < 0 } m = k+s p m
Замечания по решению:
Возможное решение:
array1 = [1, -2, 3, -4, 5, -6] array2 = array1.find_all{ |elem| elem >= 0 } array3 = array1.find_all{ |elem| elem < 0 } array4 = array2 + array3 p array4
Замечания по решению:
Возможное решение:
a=[5,-3,6,0,-6] p a.partition{|v| v>=0}.flatten
Замечания по решению: