САКОД

x44-2015 (САКОД) группа

Юрий Литвинов

Студент TODO №1 №2 №3 №4 №5 №6 №7 Тест 1 №8 №9 №10
67 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 1 2 1 2 3 1 1 Доклады Текст Презентация Защита
Bzikadze Alexander 1
Nagaev Arthur 1
Андреев Кирилл 4
Батоев Константин 1
Виноградов Михаил 1
Маненкова Анна 27
Мухаммадиев Альберт 1
Небогатиков Иван 1
Чхеидзе Даниил 30

Задачи

Домашняя работа 10. 19.05.17
  1. Текст
  2. Презентация
  3. Защита
Домашняя работа 9. 28.04.17
Презентация с пары, потоки
  1. Реализовать свой собственный CountdownEvent:

    • Конструктор, принимающий число (счётчик) в качестве аргумента
    • Метод Wait(), который блокирует вызвавший его поток, пока счётчик не станет равным нулю
    • Метод Signal(), который уменьшает счётчик на 1 и запускает все потоки, заблокированные на Wait(), если счётчик достиг 0

    Может помочь класс ManualResetEvent. Пользоваться CountdownEvent из стандартной библиотеки нельзя. Многопоточные юнит-тесты обязательны (прежде всего, на гонку по значению счётчика).

  2. Доклады

    Доклады:

    • Дополнительные возможности F# (единицы измерения, lazy, active patterns) --- Кирилл Андреев
    • Code Quotations, библиотека “unquote” --- Артур Нагаев
    • WebSharper (обзор и небольшая демонстрация) --- Альберт Мухаммадиев
    • Type Providers, F# Data
    • FAKE, Scaffold --- Александр Бзикадзе
Домашняя работа 8. 23.04.17
Презентация с пары, Async
  1. Написать функцию, принимающую адрес веб-страницы, скачивающую все веб-страницы, на которые есть ссылки с указанной, и печатающую информацию о размере каждой в формате "адрес страницы --- число символов". Ссылки нужно обрабатывать только заданные в форме <a href="http://...">. Для поиска ссылок на странице могут быть полезны регулярные выражения (класс System.Text.RegularExpressions.Regex). Качать страницы надо параллельно.

Тест 1. 14.04.17
  1. Найти среднее арифметическое синусов всех чисел из списка с помощью хвостовой рекурсии. Конструкции императивного программирования использовать нельзя.

  2. Найти самый большой палиндром, полученный произведением двух трёхзначных чисел. Конструкции императивного программирования использовать нельзя.

  3. Реализовать класс "хеш-таблица", позволяющий добавить элемент, проверить принадлежность элемента таблице и удалить элемент. Хеш-функция должна передаваться хеш-таблице извне. Мутабельные переменные разрешены, пользоваться библиотечной хеш-таблицей нельзя.

Домашняя работа 7. 09.04.17
Презентация с пары, Workflows
  1. Реализовать Workflow, выполняющий математические вычисления с заданной (как аргумент Builder-а) точностью. Например,

        rounding 3 {
            let! a = 2.0 / 12.0
            let! b = 3.5
            return a / b
        }
    

    должно возвращать 0.048

  2. Реализовать Workflow, выполняющий вычисления с числами, заданными в виде строк. Например,

    let result = calculate {
            let! x = "1"
            let! y = "2"
            let z = x + y
            return z
        }
    

    должно возвращать значение, содержащее 3, а

    let res = calculate {
            let! x = "1"
            let! y = "Ъ"
            let z = x + y
            return z
        }
    

    должно возвращать значение, указывающее на отсутствие результата.

Домашняя работа 6. 01.04.17
Презентация с пары, ООП на F#
  1. Переписать на F# задачу про моделирование локальной сети прошлого семестра, в возможно более F#-овом стиле. Мутабельное состояние в этой задаче использовать можно.

    Оригинальное условие:

    Смоделировать работу локальной сети:

    • в сети есть несколько компьютеров, связанных друг с другом (каким образом - можно задавать, например, матрицей смежности);
    • на каждом компе стоит ОС (Windows, Linux, etc...);
    • в сети гуляют вирусы, так что для каждой машины есть ненулевая вероятность заразиться (вероятность зависит от типа ОС), заражаются компьютеры, непосредственно соединённые с заражёнными;
    • заражения (и проверки, заразился компьютер или нет) происходят дискретно - по ходам.

    Требуется периодически выводить состояние сети.

  2. Переписать на F# задачу о двоичном дереве поиска с итератором.

    Оригинальное условие:

    Реализовать двоичное дерево поиска (с операциями добавления, поиска и удаления) и итератор для его обхода

Домашняя работа 5. 24.03.17
Презентация с пары, генерики в F#
  1. Реализовать функцию, которая по произвольной строке проверяет корректность скобочной последовательности в этой строке. Скобки бывают трёх видов.

  2. Записать в point-free стиле func x l = List.map (fun y -> y * x) l

  3. Написать программу - телефонный справочник. Она должна уметь хранить имена и номера телефонов, в интерактивном режиме осуществлять следующие операции:
    1. выйти
    2. добавить запись (имя и телефон)
    3. найти телефон по имени
    4. найти имя по телефону
    5. вывести всё текущее содержимое базы
    6. сохранить текущие данные в файл
    7. считать данные из файла

  4. Реализовать интерпретатор лямбда-выражений, выполняющий бета-редукцию по нормальной стратегии (зависать на термах, не имеющих нормальной формы, вполне ок). Лямбда-выражения задаются через размеченные объединения.

Домашняя работа 4. 17.03.17
Презентация с пары, продолжение про F#
  1. Реализовать три варианта функции, подсчитывающей количество четных чисел в списке (с использованием стандартных функций map, filter, fold). Использование рекурсии не допускается.

  2. Реализовать функцию, применяющую функцию к каждому элементу двоичного дерева и возвращающую новое двоичное дерево, каждый элемент которого --- результат применения функции к соответствующему элементу исходного дерева (map для деревьев)

  3. Посчитать значение дерева разбора арифметического выражения, заданного через вложенные discriminated union-ы

  4. Реализовать функцию, генерирующую бесконечную последовательность простых чисел

    Ко всем задачам требуются юнит-тесты

Домашняя работа 3. 12.03.17
Презентация с пары, лямбда-исчисление
Лямбда-исчисление для самых маленьких
Хороший курс про типизированное лямбда-исчисление
  1. Проверить, что все элементы списка различны

  2. Вывести позицию в списке, на которой сумма двух соседних элементов максимальна. Например, для [1; 5; 6; 2] функция должна вернуть значение 2.

  3. Выполнить бета-редукцию λ-терма ((λa.(λb.b b) (λb.b b)) b) ((λc.(c b)) (λa.a)). Решение (в виде последовательности преобразований) набрать в TeX-е и выложить файл .tex на GitHub. Может помочь www.papeeria.com

  4. Докажите, что S K K = I. Доказательство набрать в TeX-е и выложить на GitHub. Делать надо самостоятельно, это известное (и несложное) упражнение, так что гуглить нечестно.

Домашняя работа 2. 03.03.17
Презентация с пары, про F#
  1. Реализовать функцию, которая вычисляет произведение цифр данного числа

  2. Реализовать функцию, которая выдает первую позицию вхождения заданного числа в список

  3. Реализовать функцию, проверяющую, является ли строка палиндромом

  4. Написать mergesort: функцию, которая принимает список и возвращает отсортированный список

Домашняя работа 1. 18.02.17
Презентация с пары, введение
Домашняя страница F#
Обучалка по F# с онлайн-интерпретатором
Хороший блог про F#
Конспект пары, введение
  1. Посчитать факториал

  2. Посчитать числа Фибоначчи (за линейное время)

  3. Реализовать функцию обращения списка (за линейное время)

  4. Реализовать функцию, которая принимает на вход n и m и возвращает список из элементов [2n; 2n + 1; ...; 2n + m]

© 2014-2018 HwProj