вторник, 30 января 2018 г.

Swift 13. Classes and Structures

13 Урок посвящен описанию понятия класс и структура в Swift.
Домашнее задание:

/*
 1. Создайте структуру студент. Добавьте свойства: имя, фамилия, год рождения, средний бал. Создайте несколько экземпляров этой структуры и заполните их данными. Положите их всех в массив (журнал).

 2. Напишите функцию, которая принимает массив студентов и выводит в консоль данные каждого. Перед выводом каждого студента добавляйте порядковый номер в “журнале”, начиная с 1.

 3. С помощью функции sorted отсортируйте массив по среднему баллу, по убыванию и распечатайте “журнал”.

 4. Отсортируйте теперь массив по фамилии (по возрастанию), причем если фамилии одинаковые, а вы сделайте так чтобы такое произошло, то сравниваются по имени. Распечатайте “журнал”.

 5. Создайте переменную и присвойте ей ваш существующий массив. Измените в нем данные всех студентов. Изменится ли первый массив? Распечатайте оба массива.

 6. Теперь проделайте все тоже самое, но не для структуры Студент, а для класса. Какой результат в 5м задании? Что изменилось и почему?

 007. Уровень супермен

 Выполните задание шахмат из урока по энумам используя структуры либо классы
 38:53
 */

struct Student {
    var firstName: String
    var lastName: String
    var year: Int
    var averageRate: Double
}

var student1 = Student(firstName: "Alex", lastName: "Tim", year: 1984, averageRate: 4.5)
var student2 = Student(firstName: "Vasya", lastName: "Ivanov", year: 1990, averageRate: 4.1)
var student3 = Student(firstName: "Petya", lastName: "Petrov", year: 1980, averageRate: 4.7)
var student4 = Student(firstName: "Vanya", lastName: "Petrov", year: 1982, averageRate: 3.9)

var listStudents = [student1, student2, student3, student4]

/*
 2
 */

print("\nN 2\n")
func printList(listStudents: [Student]) {
    
    for (index,student) in listStudents.enumerated() {
        print("№ \(index + 1). \(student.lastName) \(student.firstName) was born \(student.year). AverageRate: \(student.averageRate)")
    }
}

printList(listStudents: listStudents)

/*
 3
 */
print("\nN 3\n")

let listRateSorted = listStudents.sorted { (st1, st2) -> Bool in
    st1.averageRate > st2.averageRate
}

printList(listStudents: listRateSorted)

/*
 4
 */
print("\nN 4\n")
let listNameSorted = listStudents.sorted { (st1, st2) -> Bool in
    st1.lastName == st2.lastName ? st1.firstName < st2.firstName : st1.lastName < st2.lastName
}
printList(listStudents: listNameSorted)


/*
 5
 */
print("\nN 5\n")
var modifyListStudents = listStudents
modifyListStudents[0].firstName = "Den"
modifyListStudents[0].lastName = "Zaytsev"
modifyListStudents[1].firstName = "Vasek"
modifyListStudents[1].lastName = "Trubachev"
print("Old List (Struct):")
printList(listStudents: listStudents)
print("\nModify List (Struct):")
printList(listStudents: modifyListStudents)

/*
 6
 */
print("\nN 6\n")

class StudentClass {
    var firstName: String
    var lastName: String
    var year: Int
    var averageRate: Double
    init(firstName: String, lastName: String, year: Int, averageRate: Double) {
        self.firstName = firstName
        self.lastName = lastName
        self.year = year
        self.averageRate = averageRate
    }
}

var newStudentList = [
    StudentClass(firstName: "Alex", lastName: "Tim", year: 1984, averageRate: 4.5),
    StudentClass(firstName: "Vasya", lastName: "Ivanov", year: 1990, averageRate: 4.1),
    StudentClass(firstName: "Petya", lastName: "Petrov", year: 1980, averageRate: 4.7),
    StudentClass(firstName: "Vanya", lastName: "Petrov", year: 1982, averageRate: 3.9)
]

func printList(listStudents: [StudentClass]) {
    
    for (index,student) in listStudents.enumerated() {
        print("№ \(index + 1). \(student.lastName) \(student.firstName) was born \(student.year). AverageRate: \(student.averageRate)")
    }
}

var newModifyListStudents = newStudentList

newModifyListStudents[0].firstName = "Den"
newModifyListStudents[0].lastName = "Zaytsev"
newModifyListStudents[1].firstName = "Vasek"
newModifyListStudents[1].lastName = "Trubachev"

print("Old List (Class):")
printList(listStudents: newStudentList)
print("\nModify List (Class):")
printList(listStudents: newModifyListStudents)

/*
 7
 */
print("\nN 7\n")

enum ChessColor: String {
    case  white, black
}
enum ChessLetter: Int {
    case a , b, c, d, e, f, g, h
}

enum ChessDigit: Int {
    case one = 0 , two, three, four, five, six, seven, eight
}

enum ChessType: Int {
    static let  countOfType = 6
    case king = 0x2654, queen, rook, knight, bishop, pawn
}

class ChessFigure {
    let type: ChessType
    let color: ChessColor
    var letter: ChessLetter
    var digit: ChessDigit
    
    init(type: ChessType, color: ChessColor, letter: ChessLetter, digit: ChessDigit) {
        self.type = type
        self.color = color
        self.letter = letter
        self.digit = digit
    }
    func symbol() -> Character {
        let delta = (self.color == .white) ? 0 : ChessType.countOfType
        let unicode = self.type.rawValue + delta
        let scalar = UnicodeScalar(unicode);
        return Character(scalar!)
    }
}

func createEmptyChessMate() -> [[Character]] {
    var chessArray = [[Character]]()
    for vertical in 0...7 {
        var line = [Character]()
        for horizontal in 0...7 {
            line += (horizontal + vertical) % 2 == 0 ? "⬛" : "⬜"
        }
        chessArray.append(line)
    }
    return chessArray
}

func showChessMate(chessMate: [[Character]]) {
    let letter = "   a b c d e f g h"
    print(letter)
    for (index,lineArray) in chessMate.enumerated().reversed() {
        var lineChar = String(index + 1) + " "
        for char in lineArray {
            lineChar += String(char)
        }
        print(lineChar)
    }
    print(letter)
}

func setFiguresInChess(chessMate: [[Character]], figureArray array: [ChessFigure]) ->  [[Character]]{
    var chessArray = chessMate
    
    for figure in array {
        chessArray[figure.digit.rawValue][figure.letter.rawValue] = figure.symbol()
    }
    return chessArray
}

var chessMate = createEmptyChessMate()
let figuresArray = [
    ChessFigure(type: .king, color: .white, letter: .b, digit: .one),
    ChessFigure(type: .rook, color: .white, letter: .d, digit: .seven),
    ChessFigure(type: .rook, color: .white, letter: .e, digit: .eight),
    ChessFigure(type: .king, color: .black, letter: .f, digit: .eight)
]
chessMate = setFiguresInChess(chessMate: chessMate, figureArray: figuresArray)
showChessMate(chessMate: chessMate)





Console:



N 2

№ 1. Tim Alex was born 1984. AverageRate: 4.5
№ 2. Ivanov Vasya was born 1990. AverageRate: 4.1
№ 3. Petrov Petya was born 1980. AverageRate: 4.7
№ 4. Petrov Vanya was born 1982. AverageRate: 3.9

N 3

№ 1. Petrov Petya was born 1980. AverageRate: 4.7
№ 2. Tim Alex was born 1984. AverageRate: 4.5
№ 3. Ivanov Vasya was born 1990. AverageRate: 4.1
№ 4. Petrov Vanya was born 1982. AverageRate: 3.9

N 4

№ 1. Ivanov Vasya was born 1990. AverageRate: 4.1
№ 2. Petrov Petya was born 1980. AverageRate: 4.7
№ 3. Petrov Vanya was born 1982. AverageRate: 3.9
№ 4. Tim Alex was born 1984. AverageRate: 4.5

N 5

Old List (Struct):
№ 1. Tim Alex was born 1984. AverageRate: 4.5
№ 2. Ivanov Vasya was born 1990. AverageRate: 4.1
№ 3. Petrov Petya was born 1980. AverageRate: 4.7
№ 4. Petrov Vanya was born 1982. AverageRate: 3.9

Modify List (Struct):
№ 1. Zaytsev Den was born 1984. AverageRate: 4.5
№ 2. Trubachev Vasek was born 1990. AverageRate: 4.1
№ 3. Petrov Petya was born 1980. AverageRate: 4.7
№ 4. Petrov Vanya was born 1982. AverageRate: 3.9

N 6

Old List (Class):
№ 1. Zaytsev Den was born 1984. AverageRate: 4.5
№ 2. Trubachev Vasek was born 1990. AverageRate: 4.1
№ 3. Petrov Petya was born 1980. AverageRate: 4.7
№ 4. Petrov Vanya was born 1982. AverageRate: 3.9

Modify List (Class):
№ 1. Zaytsev Den was born 1984. AverageRate: 4.5
№ 2. Trubachev Vasek was born 1990. AverageRate: 4.1
№ 3. Petrov Petya was born 1980. AverageRate: 4.7
№ 4. Petrov Vanya was born 1982. AverageRate: 3.9

N 7

   a b c d e f g h
8 ⬜⬛⬜⬛♖♚⬜⬛
7 ⬛⬜⬛⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬜⬛⬜

   a b c d e f g h

понедельник, 29 января 2018 г.

Swift 12. Enum

12 урок посвящен Enum перечислениям.
Домашнее задание к уроку:
/*
 1. Создать энум с шахматными фигруами (король, ферзь и т.д.). Каждая фигура должна иметь цвет белый либо черный (надеюсь намек понят), а так же букву и цифру для позиции. Создайте пару фигур с расположением на доске, так, чтобы черному королю был мат :) Поместите эти фигуры в массив фигур

 2. Сделайте так, чтобы энумовские значения имели rawValue типа String. Каждому типу фигуры установите соответствующее английское название. Создайте функцию, которая выводит в консоль (текстово, без юникода) название фигуры, цвет и расположение. Используя эту функцию распечатайте все фигуры в массиве.

 3. Используя красивые юникодовые представления шахматных фигур, выведите в консоли вашу доску. Если клетка не содержит фигуры, то используйте белую или черную клетку. Это должна быть отдельная функция, которая распечатывает доску с фигурами (принимает массив фигур и ничего не возвращает)

 4. Создайте функцию, которая будет принимать шахматную фигуру и тюпл новой позиции. Эта функция должна передвигать фигуру на новую позицию, причем перемещение должно быть легальным: нельзя передвинуть фигуру за пределы поля и нельзя двигать фигуры так, как нельзя их двигать в реальных шахматах (для мегамонстров программирования). Вызовите эту функцию для нескольких фигур и распечатайте поле снова.

 5. Следите чтобы ваш код был красивым!

 */

enum ChessColor: String {
    case  white, black
}
enum ChessLetter: String {
    case a , b, c, d, e, f, g, h
}

enum ChessDigit: Int {
 case one = 1 , two, three, four, five, six, seven, eight
}

enum ChessType: String {
    case rook, knight, bishop, pawn, king, queen
    
}
typealias ChessFigure = (ChessType,ChessColor, ChessLetter, ChessDigit)


var whiteKing: ChessFigure = (ChessType.king, ChessColor.white, ChessLetter.b, ChessDigit.one)
var whiteRook1: ChessFigure = (ChessType.rook, ChessColor.white, ChessLetter.d, ChessDigit.seven)
var whiteRook2: ChessFigure = (ChessType.rook, ChessColor.white, ChessLetter.e, ChessDigit.eight)
var blackKing: ChessFigure = (ChessType.king, ChessColor.black, ChessLetter.f, ChessDigit.eight)

let figureArray = [whiteKing, whiteRook1, whiteRook2, blackKing]

/*
 2
 */


func descriptionFigures(figureArray array: [ChessFigure]) {
    for figure in array {
        print(figure.0.rawValue, figure.1.rawValue, figure.2, figure.3.rawValue)
    }
}

descriptionFigures(figureArray: figureArray)

/*
 3
 */

print("\nN 3 \n")


func createEmptyChessMate() -> [[Character]] {
    var chessArray = [[Character]]()
    for vertical in 0...7 {
        var line = [Character]()
        for horizontal in 0...7 {
            line += (horizontal + vertical) % 2 == 0 ? "⬛" : "⬜"
        }
        chessArray.append(line)
    }
    return chessArray
}
func showChessMate(chessMate: [[Character]]) {
    let letter = "   a b c d e f g h"
    print(letter)
    for (index,lineArray) in chessMate.enumerated().reversed() {
        var lineChar = String(index + 1) + " "
        for char in lineArray {
            lineChar += String(char)
        }
       
        print(lineChar)
    }
    print(letter)
}

func setFiguresInChess(chessMate: [[Character]], figureArray array: [ChessFigure]) ->  [[Character]]{
    var chessArray = chessMate
    
    for figure in array {
        
        let indexes = indexInChessArray(chessLetter: figure.2, chessDigit: figure.3)
        chessArray[indexes.verticalIndex][indexes.horizontalIndex] = unicodeSymbol(figureType: figure.0, figureColor: figure.1)
    }
    return chessArray
}

func indexInChessArray(chessLetter: ChessLetter, chessDigit: ChessDigit) -> (horizontalIndex: Int, verticalIndex: Int) {
    
    let letters = "abcdefgh"
    return (letters.index(of: chessLetter.rawValue.first!)!.encodedOffset, chessDigit.rawValue - 1)
}

func unicodeSymbol(figureType: ChessType, figureColor: ChessColor) -> Character {
    switch (figureType, figureColor) {
    case (let figureType, let figureColor) where figureType == .king:
        return figureColor == .white ? "♔" : "♚"
    case (let figureType, let figureColor) where figureType == .queen:
        return figureColor == .white ? "♕" : "♛"
    case (let figureType, let figureColor) where figureType == .rook:
        return figureColor == .white ? "♖" : "♜"
    case (let figureType, let figureColor) where figureType == .bishop:
        return figureColor == .white ? "♗" : "♝"
    case (let figureType, let figureColor) where figureType == .knight:
        return figureColor == .white ? "♘" : "♞"
    case (let figureType, let figureColor) where figureType == .pawn:
            return figureColor == .white ? "♙" : "♟"

    default:
        return "*"
    }
}
var chessMate = createEmptyChessMate()
chessMate = setFiguresInChess(chessMate: chessMate, figureArray: figureArray)
showChessMate(chessMate: chessMate)

/*
 4
 */
print("\nN 4\n")

func moveFigureChess(figure: ChessFigure, moveTo coordinate: (ChessLetter, ChessDigit)) {
    var emptyChessMate = createEmptyChessMate()
    var mutableFigure = figure
    let startPosition = setFiguresInChess(chessMate: emptyChessMate, figureArray: [figure])
    print("Start Position")
    showChessMate(chessMate: startPosition)
    mutableFigure.2 = coordinate.0;
    mutableFigure.3 = coordinate.1
    
    print("\nFinish Position\n")
    let finishPosition = setFiguresInChess(chessMate: emptyChessMate, figureArray: [mutableFigure])
    showChessMate(chessMate: finishPosition)
}


moveFigureChess(figure: whiteRook1, moveTo: (ChessLetter.d, ChessDigit.one))

Console:

king white b 1
rook white d 7
rook white e 8
king black f 8

N 3 

   a b c d e f g h
8 ⬜⬛⬜⬛♖♚⬜⬛
7 ⬛⬜⬛⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬜⬛⬜
   a b c d e f g h

N 4

Start Position
   a b c d e f g h
8 ⬜⬛⬜⬛⬜⬛⬜⬛
7 ⬛⬜⬛⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬜⬛⬜⬛⬜
   a b c d e f g h

Finish Position

   a b c d e f g h
8 ⬜⬛⬜⬛⬜⬛⬜⬛
7 ⬛⬜⬛⬜⬛⬜⬛⬜
6 ⬜⬛⬜⬛⬜⬛⬜⬛
5 ⬛⬜⬛⬜⬛⬜⬛⬜
4 ⬜⬛⬜⬛⬜⬛⬜⬛
3 ⬛⬜⬛⬜⬛⬜⬛⬜
2 ⬜⬛⬜⬛⬜⬛⬜⬛
1 ⬛⬜⬛⬛⬜⬛⬜
   a b c d e f g h