Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
dbykov-naumen committed Oct 27, 2023
0 parents commit 7c2a2e3
Show file tree
Hide file tree
Showing 204 changed files with 22,575 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# naumen.scala.course.2023.spring

### Лекции

Располагаются в директории ```/lectures/``` виде html презентации (для оффлайн доступа необходимо скачать всю папку и открывать в браузере конкретную лекцию)


### Домашние задания
Распологаются в директории ```/homeworks/``` и будут выкладываться по мере продвижения по курсу.

#### Предоставление результатов
Результаты предоставлять посредством fork текущего репозитория на github, созданием новой ветки homework_${number}, коммитом всех результатов (подробности описаны в самих заданиях) и пушем в эту ветку в рамках своего fork и созданием pull request в основной репозиторий в ветку master.

После первоначально форка репозитория необходимо обновлять свой форк с основного репозитория

Название pull request должно соответсвовать следующему шаблону - "homework_${number} - ${lastName} ${firstName}"
Т.е. для ДЗ №1 и студента "Соколов Артём" было бы следующее - "homework_1 - Соколов Артём"
Это важно, пулреквесты с названием не по шаблону не будут проверяться.
6 changes: 6 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
title: Scala
description: осень 2023
show_downloads: false
lang: ru-RU
google_analytics: UA-109454524-3
theme: jekyll-theme-slate
59 changes: 59 additions & 0 deletions homeworks/homework_1/homework_1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Домашнее задание №1 (курс Scala, Naumen)

## 0. Перед тем как приступить к заданиям

### Установка Scala
Инструкция для установки Scala находится тут - https://www.scala-lang.org/download/

### Cheatsheet
Для первоначального освоения основных ситнаксических конструкций Scala предлагаем воспользоваться cheatsheet (шпаргалка) - <a>https://alvinalexander.com/downloads/scala/Scala-Cheat-Sheet-devdaily.pdf</a>


## 1. Использование REPL

Для выполнения данного задания вам понадобится использовать REPL.

У скалы есть как минимум 2 варианта REPL:
- стандартный, который идет вместе самим компилятором - <a>https://downloads.lightbend.com/scala/2.12.10/scala-2.12.10.msi</a>
- Ammonite - разработанный отдельно от комплиятора и имеющий с более мощный функционал, но запускающийся только под Linux/Mac - <a>https://ammonite.io/#Ammonite-REPL</a>

Используйте REPL и запрограммируйте следующее:

- Вывести на консоль "Hello Scala! This is ${здесь ваше имя}"
- Затем поменяйте приветственное слово ("Hello") на пару других приветственных слов, например, "Hola" и "Guten tag". Выведите результаты замен на консоль.
- Затем для каждого варианта приветствия замените своё имя на его перевернутое значение (пример: "Artem Sokolov" -> "volokoS metrA"). Результаты таких замен также выведите на консоль.

*Примечание: Постарайтесь переиспользовать максимальное количество кода (переменных, строковых литералов, функций и т.д). На данном этапе это не является сколько-либо важным для цели выполнения задания, однако позволяет вам лишний раз попрактиковаться. Вообще программирование с помощью REPL подразумевает скорее отсуствие соблюдения принципов чистоты кода (именование переменных, переиспользование одинаковых кусков кода, DRY, YAGNI и прочих) и позволяет в непринужденной и интерактивной манере попрактиковаться в использовании языка или проверить какую-то идею.*

Результат предоставить в виде текстового файла всего текста из консоли начиная с запуска REPL. Для этого в репозитории создана папка и пустой файл куда необходимо положить результат - ```homeworks/homework_1/task_1/console-output.txt```

Пример содержимого файла:
```
C:\Users\doter>scala Picked up JAVA_TOOL_OPTIONS: -Dorg.lwjgl.opengl.Window.undecorated=true Welcome to Scala 2.13.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161). Type in expressions for evaluation. Or try :help. scala> val a = "Hello Scala! This is Artem Sokolov" a: String = Hello Scala! This is Artem Sokolov scala> println (a) Hello Scala! This is Artem Sokolov scala>
```
## 2. Использование Worksheet

Для целей обучения есть очень удобный способ работы с кодом на Scala - worksheet. Worksheet позволяет иметья интерактивность и наглядность каждой строчки кода, при этом позволяет работать с кодом в рамках целого файла.

Две наиболее удобных альтернативы для этого:
- Scastie - онлайн компилятор и среда исполнения Scala кода с возможностью работать в режиме worksheet - https://scastie.scala-lang.org/
- файл worksheet в IntelliJ IDEA - https://www.jetbrains.com/help/idea/work-with-scala-worksheet-and-ammonite.html

Для выполнения задания необходимо сделать следующее:
- Перенесите весь свой код из п.1 в формат worksheet и добейтесь того, что он точно также комплиируется и выполняется.
- Зарефакторите код (например, выделите одинаковые части строки в переменные, объедините изменяющиеся части в коллекции, выделите в функцию код который выводит строки на консоль и т.д.)

Результат предоставить в виде ссылки на ваш сниппет кода, сохраненный в https://scastie.scala-lang.org/ (не забудьте проверить что по сгенерированной ссылке лежит именно то что вы хотите предоставить и в дальнейшем не изменяйте данный сниппет). Сылку записать в файл ```homeworks/homework_1/task_2/scastie-url.txt```

## 3. Использование SBT

Для первоначального знакомства с SBT предлагаем работать через IntelliJ IDEA.

Инструкция по созданию нового SBT проекта в IDEA - https://docs.scala-lang.org/getting-started/intellij-track/building-a-scala-project-with-intellij-and-sbt.html

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

Далее необходимо перенести код из п.2 вместо текущего "Hello world" (в тело объекта ```object Main extends App```) и исполнить его с помощью SBT (команда sbt run в консоли).

Результат - после всех манипуляций скопировать папку sbt проекта в папку результатов (```homeworks/homework_1/task_3```) и закоммитить в git всю папку проекта со всеми файлами.

Empty file.
Empty file.
3 changes: 3 additions & 0 deletions homeworks/homework_2/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/.idea
/target
project/target
9 changes: 9 additions & 0 deletions homeworks/homework_2/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name := "Lecture2"

version := "0.1"

scalaVersion := "2.12.10"

libraryDependencies += "com.lihaoyi" %% "utest" % "0.5.3" % "test"

testFrameworks += new TestFramework("utest.runner.Framework")
9 changes: 9 additions & 0 deletions homeworks/homework_2/homework_2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Домашнее задание №2 (курс Scala, Naumen)


Необходимо выполнить четыре задания, приведённые в файле <a href='https://github.com/naumen-student/naumen.scala.course.2023.spring/tree/master/homeworks/homework_2/src/main/scala'>(src/main/scala/Exercises.scala)</a>
<br>
А также реализовать соответствующие юнит-тесты <a href='https://github.com/naumen-student/naumen.scala.course.2023.spring/tree/master/homeworks/homework_2/src/test/scala'>(src/test/scala/Test.scala)</a>


Для выполнения задания рекомендуется использовать <a href='https://github.com/naumen-student/naumen.scala.course.2023.spring/tree/master/homeworks/homework_2'>шаблон sbt проекта</a>
1 change: 1 addition & 0 deletions homeworks/homework_2/project/build.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sbt.version = 1.3.3
76 changes: 76 additions & 0 deletions homeworks/homework_2/src/main/scala/Exercises.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
object Exercises {

/*ПРИМЕР*/
/*Реализовать функцию, которая возвращает все целые числа в заданном диапазоне (от iForm до iTo), которые делятся
на 3 или на 7.*/
/*Реализовать юнит-тесты в src/test/scala для данной функции.*/
def divBy3Or7(iFrom: Int, iTo: Int): Seq[Int] = {
for {i <- iFrom to iTo
if i % 3 == 0 || i % 7 == 0
} yield i
}



/*ЗАДАНИЕ I*/
/*Реализовать функцию, которая возвращает сумму всех целых чисел в заданном диапазоне (от iForm до iTo), которые делятся
на 3 или на 5.*/
/*Реализовать юнит-тесты в src/test/scala для данной функции.*/
def sumOfDivBy3Or5(iFrom: Int, iTo: Int): Long = ???



/*ЗАДАНИЕ II*/
/*Реализовать функцию, которая вычисляет все различные простые множители целого числа отличные от 1.
Число 80 раскладывается на множители 1 * 2 * 2 * 2 * 2 * 5, результат выполнения функции => Seq(2, 5).
Число 98 можно разложить на множители 1 * 2 * 7 * 7, результат выполнения функции => Seq(2, 7).*/
/*Реализовать юнит-тесты в src/test/scala для данной функции.*/
def primeFactor(number: Int): Seq[Int] = ???



/*ЗАДАНИЕ III*/
/*Дано: класс двумерного вектора, а также функции вычисления модуля вектора (abs), вычисления скалярного произведения
векторов (scalar) и косинуса угла между векторами (cosBetween).
Необходимо: реализовать функцию sumByFunc таким образом, чтобы можно было раскомментировать функции sumScalars и sumCosines.
Функция sumScalars должна вычислять сумму скалярных произведений для пар векторов scalar(leftVec0, leftVec1) + scalar(rightVec0, rightVec1).
Функция sumCosines должна вычислять сумму косинусов углов между парами векторов cosBetween(leftVec0, leftVec1) + cosBetween(rightVec0, rightVec1).*/
/*Реализовать юнит-тесты в src/test/scala для функций sumScalars и sumCosines*/
case class Vector2D(x: Double, y: Double)
def abs(vec: Vector2D): Double = java.lang.Math.sqrt(vec.x * vec.x + vec.y * vec.y)
def scalar(vec0: Vector2D, vec1: Vector2D): Double = vec0.x * vec1.x + vec0.y * vec1.y
def cosBetween(vec0: Vector2D, vec1: Vector2D): Double = scalar(vec0, vec1) / abs(vec0) / abs(vec1)
//def sumByFunc(leftVec0: Vector2D, leftVec1: Vector2D, ???, rightVec0: Vector2D, rightVec1: Vector2D) = ???
/*
def sumScalars(leftVec0: Vector2D, leftVec1: Vector2D, rightVec0: Vector2D, rightVec1: Vector2D): Double =
sumByFunc(leftVec0, leftVec1, scalar, rightVec0, rightVec1)
*/
/*
def sumCosines(leftVec0: Vector2D, leftVec1: Vector2D, rightVec0: Vector2D, rightVec1: Vector2D): Double =
sumByFunc(leftVec0, leftVec1, cosBetween, rightVec0, rightVec1)
*/



/*ЗАДАНИЕ IV*/
/*Дано: коллекция металлических шариков balls, где каждый элемент представлен в виде (Name: String -> (radius: Int, density: Double).
Здесь radius - радиус шарика [см], а density - плотность материала [г / (см^3)], из которого он изготовлен (например,
для серебра в коллекции представлен шарик "Silver" радиуса 4 см и плотности 4.505 г / (см^3) )
Необходимо реализовать функцию sortByHeavyweight, которая принимает коллекцию такого формата и возвращает список названий материалов шариков,
упорядоченный в зависимости от массы шариков (первый элемент списка соответствует наиболее "лёгкому" шарику, последний - наиболее "тяжёлому").
В качестве значения числа "Пи" можно использовать java.lang.Math.PI
*/
/*Реализовать юнит-тесты в src/test/scala для данной функции.*/
val balls: Map[String, (Int, Double)] =
Map(
"Aluminum" -> (3, 2.6889), "Tungsten" -> (2, 19.35), "Graphite" -> (12, 2.1), "Iron" -> (3, 7.874),
"Gold" -> (2, 19.32), "Potassium" -> (14, 0.862), "Calcium" -> (8, 1.55), "Cobalt" -> (4, 8.90),
"Lithium" -> (12, 0.534), "Magnesium" -> (10, 1.738), "Copper" -> (3, 8.96), "Sodium" -> (5, 0.971),
"Nickel" -> (2, 8.91), "Tin" -> (1, 7.29), "Platinum" -> (1, 21.45), "Plutonium" -> (3, 19.25),
"Lead" -> (2, 11.336), "Titanium" -> (2, 10.50), "Silver" -> (4, 4.505), "Uranium" -> (2, 19.04),
"Chrome" -> (3, 7.18), "Cesium" -> (7, 1.873), "Zirconium" -> (3, 6.45)
)

def sortByHeavyweight(ballsArray: Map[String, (Int, Double)] = balls): Seq[String] = ???

}
12 changes: 12 additions & 0 deletions homeworks/homework_2/src/test/scala/Test.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import utest._

object Test extends TestSuite{

val tests = Tests{
'test_divBy3Or7 - {
assert(Exercises.divBy3Or7(1, 3) == Seq(3))
assert(Exercises.divBy3Or7(5, 9) == Seq(6, 7, 9))
assert(Exercises.divBy3Or7(0, 100) == Seq(0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49, 51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99))
}
}
}
3 changes: 3 additions & 0 deletions homeworks/homework_3/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/.idea
/target
project/target
9 changes: 9 additions & 0 deletions homeworks/homework_3/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name := "homework_3"

version := "0.1"

scalaVersion := "2.12.10"

libraryDependencies += "com.lihaoyi" %% "utest" % "0.5.3" % "test"

testFrameworks += new TestFramework("utest.runner.Framework")
Loading

0 comments on commit 7c2a2e3

Please sign in to comment.