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