GithubHelp home page GithubHelp logo

kotlin-polytech / kotlinasfirst2018 Goto Github PK

View Code? Open in Web Editor NEW
32.0 14.0 874.0 873 KB

Base repo for the Kotlin course (2018)

License: Creative Commons Attribution Share Alike 4.0 International

Kotlin 100.00%

kotlinasfirst2018's Introduction

Котлин как первый язык программирования

Решите приведённые в проекте задачи, чтобы научиться программировать на Котлине. Сейчас доступны девять групп задач (уроков).

  1. Простые функции.
  2. Ветвления.
  3. Циклы.
  4. Работа со списками.
  5. Работа с ассоциативными массивами (Maps).
  6. Разбор строк.
  7. Работа с файлами.
  8. Простые классы.
  9. Сложные классы на примере матриц.

В директории tutorial имеется учебное пособие по Котлину на русском языке. Оно содержит введение и восемь разделов, каждый из которых относится к соотвествующему уроку в проекте. Также пособие включает дополнительные разделы, не включающие задач:

  • 4.5 (про организацию памяти)
  • 6.5 (про регулярные выражения)
  • 8.5 (про графы и графовые алгоритмы)
  • 10 (про синтаксический разбор и Kotlin DSL)

Список использованных источников

Формулировки многих задач взяты из следующей книги:

  • А. Юркин. Задачник по программированию. СПб.: Питер, 2002. - 192 с. ISBN 5-318-00399-0.

Материалы по языку Kotlin:

kotlinasfirst2018's People

Contributors

belyaev-mikhail avatar gagarski avatar ice-phoenix avatar lancelote avatar maximpetrov avatar mglukhikh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kotlinasfirst2018's Issues

revert(Int.MAX_VALUE) в Уроке 3

Тестирующая система на Котоеде однажды выдала ошибку, когда моя программа в ответ на их случайный тест попыталась перевернуть число, равное Int.MAX_VALUE. Ошибка связана с тем, что функция возвращает Int, а перевернутое от 2147483647 не влезает в Int. Как поступить в этом случае? Не могла бы тестирующая система в Котоеде принимать Long как результат работы функции, вместо Int? Либо не генерировать настолько такие случайные тесты, на которые функция revert не может дать правильный ответ, так как возвращает только Int?

Ошибка в тестах canOpenLock

Lesson 9 > Random Tests > canOpenLock()

Key:

[[0, 1, 0],
 [0, 0, 1]]

Lock:

[[1, 0, 0, 0, 0, 1, 1, 0, 0],
 [1, 1, 0, 0, 1, 0, 0, 1, 0],
 [0, 1, 1, 0, 1, 0, 0, 1, 0],
 [0, 1, 1, 1, 0, 0, 1, 0, 1],
 [0, 0, 0, 1, 1, 0, 0, 0, 1],
 [1, 1, 0, 1, 1, 0, 1, 0, 0],
 [0, 1, 1, 0, 1, 0, 0, 0, 0],
 [0, 1, 1, 0, 0, 1, 1, 0, 1],
 [1, 1, 0, 1, 1, 0, 0, 0, 0],
 [1, 0, 1, 0, 0, 1, 0, 0, 1],
 [1, 1, 0, 1, 0, 1, 0, 1, 1],
 [0, 0, 1, 1, 1, 1, 0, 1, 1],
 [1, 1, 1, 1, 0, 1, 1, 1, 0]]

Output:

{
  "first": true,
  "third": 0,
  "second": 9
}

В смещении (x, y) = (0, 9) от верхнего левого угла действительно находится подходящий паттерн

Ошибка в тесте

lesson5.task1.RandomTests (findSumOfTwo)
Ошибка при проверке вывода.

Ввод:
"list" -> [
1,
45091,
1,
7738,
28424,
1,
28158,
44506,
46285,
26668,
29617,
1,
0,
2815,
40699
]
"number" -> 1

Вывод: (0, 12)
Ожидалось: (11, 12)

Под индексом 12 стоит "0", под 0 и 11 стоят "1", поэтому эти ответы эквивалентны.

Опечатка

Lesson 7 > markdownToHtmlLists() > Описание задачи

///////////////////////////////начало файла/////////////////////////////////////////////////////////////////////////////
* Утка по-пекински
    * Утка
    * Соус
* Салат Оливье
    1. Мясо
        * Или колбаса
    2. Майонез
    3. Картофель
    4. Что-то там ещё
* Помидоры
* Фрукты
    1. Бананы
    23. Яблоки
        1. Красные
        2. Зелёные
///////////////////////////////конец файла//////////////////////////////////////////////////////////////////////////////
 *
 *
 * Соответствующий выходной файл:
///////////////////////////////начало файла/////////////////////////////////////////////////////////////////////////////
<html>
  <body>
    <ul>
      <li>
        Утка по-пекински
        <ul>
          <li>Утка</li>
          <li>Соус</li>
        </ul>
      </li>
      <li>
        Салат Оливье
        <ol>
          <li>Мясо
            <ul>
              <li>
                  Или колбаса
              </li>
            </ul>
          </li>
          <li>Майонез</li>
          <li>Картофель</li>
          <li>Что-то там ещё</li>
        </ol>
      </li>
      <li>Помидоры</li>
      <li>
        Яблоки
        <ol>
          <li>Красные</li>
          <li>Зелёные</li>
        </ol>
      </li>
    </ul>
  </body>
</html>
///////////////////////////////конец файла//////////////////////////////////////////////////////////////////////////////

Кто съел бананы?

Ошибка в тестах markdownToHtmlSimple

Lesson 7 > RandomTests > markdownToHtmlSimple()
// Я приведу лишь начальный кусок вывода

Input:

\n.JNTIq}S6Ih4TE?qZLS)*wX'[~~uxlol6\nZd9Fpm%`h`\\=Zw`WcW,[w{T(1caqH~hj\n@Pih<r&i\tvqCuL*q=IN;KQjjG~~Y\\7;2

Expected:

<html><body><p>\n.JNTIq}S6Ih4TE?qZLS)<i>wX'[<s>uxlol6\nZd9Fpm%`h`\\=Zw`WcW,[w{T(1caqH~hj\n@Pih<r&i\tvqCuL</i>q=IN;KQjjG</s>Y\\7;2

Actual:

<html><body><p>\n.JNTIq}S6Ih4TE?qZLS)<i>wX'[<s>uxlol6\nZd9Fpm%`h`\\=Zw`WcW,[w{T(1caqH~hj\n@Pih<r&i\tvqCuL<i>q=IN;KQjjG<s>Y\\7;2

Смотрим примечательные символы:
* -> читаем подпоследовательность <i>. Все сходится
~~ -> входим во вложенную <s>. Сходится
* -> Данный символ не является входным для текущей подпоследовательности. Значит это не закрытие *, которое привело бы к ошибке <i><s></i></s>, а новая вложенная подпоследовательность: <i><s><i></i></s></i>. Однако в Expected ожидается </i>

// Мне не очень хочется деградировать свой код с recursive descent парсера до трех флагов

Ошибка на Котоеде

lesson5.task1.RandomTests (bagPacking)
Правильный ответ засчитан за неправильный

Ввод:
"capacity" -> 2260
"treasures" ->

[
  {
    "key": "0",
    "value": {
      "first": 148,
      "second": 148
    }
  },
  {
    "key": "1",
    "value": {
      "first": 486,
      "second": 149
    }
  },
  {
    "key": "2",
    "value": {
      "first": 1,
      "second": 208
    }
  },
  {
    "key": "3",
    "value": {
      "first": 495,
      "second": 2
    }
  },
  {
    "key": "4",
    "value": {
      "first": 2,
      "second": 358
    }
  },
  {
    "key": "5",
    "value": {
      "first": 408,
      "second": 148
    }
  },
  {
    "key": "6",
    "value": {
      "first": 419,
      "second": 24
    }
  },
  {
    "key": "7",
    "value": {
      "first": 135,
      "second": 12
    }
  },
  {
    "key": "8",
    "value": {
      "first": 149,
      "second": 371
    }
  },
  {
    "key": "9",
    "value": {
      "first": 149,
      "second": 1
    }
  },
  {
    "key": "10",
    "value": {
      "first": 148,
      "second": 1
    }
  },
  {
    "key": "11",
    "value": {
      "first": 148,
      "second": 338
    }
  },
  {
    "key": "12",
    "value": {
      "first": 295,
      "second": 148
    }
  },
  {
    "key": "13",
    "value": {
      "first": 388,
      "second": 348
    }
  },
  {
    "key": "14",
    "value": {
      "first": 148,
      "second": 148
    }
  },
  {
    "key": "15",
    "value": {
      "first": 148,
      "second": 149
    }
  },
  {
    "key": "16",
    "value": {
      "first": 429,
      "second": 149
    }
  },
  {
    "key": "17",
    "value": {
      "first": 149,
      "second": 148
    }
  },
  {
    "key": "18",
    "value": {
      "first": 149,
      "second": 2
    }
  },
  {
    "key": "19",
    "value": {
      "first": 2,
      "second": 148
    }
  }
]

Вывод:

[
  "19",
  "17",
  "16",   <---
  "15",
  "14",
  "13",
  "12",
  "11",
  "8",
  "7",
  "4",
  "2",
  "0"
]

Ожидалось:

[
  "19",
  "17",
  "15",
  "14",
  "13",
  "12",
  "11",
  "8",
  "7",
  "4",
  "2",
  "1",   <---
  "0"
]

Дело в том, что вместо элемента "1" был взят элемент "16", у которого такая же стоимость, но меньший вес

Терминология. Двоичные приставки

В chapter04_5.adoc 1 килобайт определяется как 2^10 байт.
Разве не было бы корректнее определить 1 килобайт как 1000 байт, а для обозначения 2^10 байт использовать термин "кибибайт"?

Опечатка в описании функции flattenPhoneNumber

"например, номер 12 -- 34- 5 -- 67 -98 тоже следует считать легальным.
Перевести номер в формат без скобок, пробелов и чёрточек (но с +), например,
"+79211234567" или "123456789" ### для приведённых примеров."

Неправильная работа тестов с assertThrows

Функция assertThrows проверяет тип выброшенного исключения с помощью вызова isInstance, что не всегда корректно.
Пример со студенческим решением lesson6.task1.plusMinus

fun plusMinus(expression: String): Int {
    val parts = expression.split(" ")
    val result = mutableListOf(parts[0].toInt())
    ...
    return result.sum()
}

Если подать данному решению на вход строку "~JD*_c\\teH:QnPQudT,8z", оно выбросит NumberFormatException. А требуется, чтобы при неправильном формате строки выбрасывалось исключение IllegalArgumentException. При этом, тест вида:

assertThrows(IllegalArgumentException::class.java) { plusMinus("~JD*_c\\teH:QnPQudT,8z") }

отработает правильно, так как NumberFormatException является наследником IllegalArgumentException, и соответственно

IllegalArgumentException::class.java.isInstance(NumberFormatException())

возвращает true.

При этом, в котоеде выброшенные исключения проверяются через

modelException.javaClass == studentException.javaClass

и на том же самом тесте решение падает.

Ошибка в тестах printMultiplicationProcess

Lesson 7 > RandomTests > printMultiplicationProcess()

Expected:

      33673
*     98690
-----------
          0
+   303057
+  202038
+ 269384
+303057
-----------
 -971778926

-971778926 - это результат переполнения Int при перемножении. Должно было быть 3323188370

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.