Раздел «Язык Ruby».RubyTest3:

Тест по Ruby (часть 3)

Полезно предварительно познакомится со следующими методами:

 String#to_i, 
 File::open, IO#scan, IO#split,
 each, each_with_index, each_index, select, map, sort, sort_by,
 Array::new,
 Array#push,  Array#pop,  Array#shift,  Array#unshift 

В каждой задаче необходимо написать unit-тест, тестирующий реализованный функционал.

Задача 1. Фильтр простых: На вход подаётся строка содержащая натуральные числа. Вывести те из них, которые простые.

Задача 2. Разбить перестановку на циклы: На вход подаётся строка содержащая перестановку N натуральных чисел. Вывести циклы, на которые разбивается данная перестановка — в каждой строке по одному циклу.
Вход: 
 3 1 2 5 4
Выход:
 1 2 3
 5 6

Задача 3. Генерация геометрической прогрессии: Напишите метод generate_qseq такой, что код
generate_qseq(a, q, n) do |x|
  puts x
end
выводит n членов геометрической прогрессии {a, a*q, a*q*q, ...}

Задача 4. Метод flatten: Реализуйте метод my_flatten средствами Ruby, не используя встроенного метода flatten. Примеры входа выхода:
[[[[1]]]].my_flatten #=> [1]
[[[[1]]]].my_flatten(1) #=> [[[1]]]
[[[[1]]]].my_flatten(2) #=> [[1]]
[[[[1]]]].my_flatten(3) #=> [1]
[[[[1]]]].my_flatten(30) #=> [1]
[1,[2,[3],4],5].my_flatten  #=> [1,2,3,4,5]
[1,[2,[3],4],5].my_flatten(1)  #=> [1,2,[3],4,5]
[1,[2,[3,[4]]]].my_flatten  #=> [1,2,3,4]
[1,[2,[3,[4]]]].my_flatten(2)  #=> [1,2,3,[4]]
[[],[1],[]].my_flatten  #=> [1]
[[[]]].my_flatten  #=> []
a = [1,2]
a << a
a.my_flatten  #=> raise ArgumentError "Can't flatten recursive arrays"

n = 1000
a = []
n.times {|i| a = [a,i] }
a.my_flatten # работает линейное по n время
a = []
n.times {|i| a = [i,a,i] }
a.my_flatten # работает линейное по n время
a = []
n.times {|i| a = [a,i]}
a.my_flatten # работает линейное по n время

Задача 5. Генератор несократимых дробей: Напишите генератор несократимых дробей m/n, (m <= n). Генерировать нужно в лексикографическом порядке пар (m,n). Необходимо реализовать две функции sequence и upto. Обе они вызываются с блоком, который принимает два аргумента — n и m. Функция sequence получает количество чисел, а upto — пару чисел N и M. (см. как реализован генератор пифагоровых троек и генератор чисел Фибоначчи)

Задача 6. Таблица: В файле "a.txt" дана таблица, состоящая из нескольких столбцов. Первый столбец содержит содержит слова, остальные столбцы содержат действительные числа. Первая строка таблицы — её заголовок, то есть список имен полей, разделенных пробелом. Имя поля — слово из латинских букв, знаков подчеркивания и цифр. Необходимо поэлементно сложить строки содержащие одинаковые имена и вывести строки в порядке возрастания имен по алфавиту. Результат вывести в стандартный поток вывода.
Вход:
Name Field1 Field2 Field3
Olga 0.2    1      0
Alex 1.6    5      12
Nick 1.7    7      14
Olga 1.1    2      20
Tom  0.7    2      11
Alex 0.6    1      5
Ann  2.1    8      13

Выход:
Name Field1 Field2 Field3
Alex 2.2    6      17
Ann  2.1    8      13
Nick 1.7    7      14
Olga 1.3    3      20
Tom  0.7    2      11

Задача 7. Счастливые билеты: Номер билета — это упорядоченный набор 6 цифр. Билет счастливый, если сумма первых трёх цифр равна сумме последних трёх цифр. Напишите генератор счастливых билетов.
require 'happy_ticket'
123321.happy? # =>true
happy_tickets(:from => 200000) do |ticket|
  puts "Eat #{ticket}"
end

Задача 8. Вычисление цепной дроби: Для данного рационального числа выведите его цепную дробь.
Вход:
  62/43
Выход:
  1+1/(2+1/(3+4/5))