Блог пользователя Joshik

Автор Joshik, 11 лет назад, По-русски

Компания JetBrains открывает регистрацию на Kotlin Challenge — соревнование по программированию для тех, кто хочет попробовать новый язык программирования для платформы Java.

Помните, на конференциях вы слышали доклады по Kotlin? Помните, кто-то из друзей вдохновенно рассказывал о том, что вот-вот появится новая Java от JetBrains? Помните, младшая сестра жаловалась, что никак не освоит Kotlin, потому что нет русской документации? Теперь все изменилось: мы начинаем свою собственную олимпиаду по Kotlin, и даже сделали немного документации по-русски для тех родных заядлых олимпиадников, которые еще не изучили даже технический английский.

Мы приглашаем к участию в Kotlin Challenge всех, кто любит сложные олимпиадные задачи и всех, кто пробует самое свежее в информационных технологиях, чтобы сыграть роль первопроходцев, покоряющих неизведанный край нового языка, сразиться с серьезными соперниками и выиграть почет, славу и призы.

Важно:

  1. На олимпиаде допускается только один язык (и это — Kotlin);
  2. правила весьма похожи на правила ACM ICPC;
  3. сроки проведения: сейчас уже идет регистрация, с 16 октября по 15 ноября — тренировочное решение задач, 16 ноября — тренировочное знакомство с движком проверки задач и вживание в роль бойца за призы. 7 декабря начинается серьезная игра на выбывание — четвертьфинал, полуфинал будет в феврале 2014, а 29 апреля 2014 года — очный финал в Санкт-Петербурге. Подробное расписание — kotlin.jetbrains.org/challenge/schedule
  4. Четвертьфинал проходит в два этапа (7 декабря с 14 до 16 и 11 декабря с 20 до 22 часов по Москве), причем в первом этапе фиксируются 100 лучших, которые точно пройдут в полуфинал. Они не могут участвовать во втором этапе, где участвуют все остальные. Такое разбиение на два этапа придумано для того, чтобы участники могли сыграть в удобное для себя время: в декабре кому-то надо срочно сдавать зачет, кому-то — бежать за подарками.
  5. Призы тоже будут: всем участникам полуфинала достаются красивые специально сделанные по этому случаю футболки. Всем участникам финала вручаются очень красивые футболки Kotlin Challenge. За первое, второе и третье места в финале вручаются денежные призы: 200 000, 100 000 и 60 000 рублей.
  6. Для участия в Kotlin Challenge обязательна регистрация. Участвуют все желающие, кому уже исполнилось 14 лет.
  7. Официальный язык соревнований — русский. Соответственно, все задачи будут доступны только на одном языке.

Сайт Kotlin Challenge — kotlin.jetbrains.org/challenge/.

Группа ВКонтакте — vk.com/kotlinchallenge В группе также предлагается обсуждать соревнование, язык Kotlin, задачки (после окончания туров) и прочее; общаться с организаторами, жюри и другими участниками.

Добро пожаловать и удачи в соревновании!

  • Проголосовать: нравится
  • +34
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Ребята, ВЫ СУПЕР!

Обязательно поучавствую :)

»
11 лет назад, # |
  Проголосовать: нравится +43 Проголосовать: не нравится

Эх, придется посмотреть код и довести до ума java2kotlin конвертер :)

»
11 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Чем Kotlin может удивить (заинтересовать)?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится -13 Проголосовать: не нравится

    Футболками :)

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Может оказаться крутым языком: статическая типизация, работает на JVM, совместим с библиотеками на Java, куча модных языковых наворотов (есть очень нужные — nullsafety, например), короткий синтаксис, быстро компилируются программы. Во многом похож на Scala, вот сравнение от разработчиков Kotlin.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится -20 Проголосовать: не нравится

      Как я понял, здесь не просто статическая типизация, а есть некая поддержка вывода типов, что хорошо. Синтаксис на любителя, похоже на смесь C++ с Pascal, ИМХО.

      Во многом похож на Scala, вот сравнение от разработчиков Kotlin.

      Неплохо бы увидеть сравнение ещё и с Haskell. И вообще, обоснование зачем учить Kotlin, а не тот же Haskell, скажем. (Кроме работы поверх JVM.)

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится

        Потому же, почему стоит учить java, и даже больше. По сути это просто java с хорошими исправлениями и дополнениями, которые по разным причинам не исправляет oracle.

»
11 лет назад, # |
Rev. 3   Проголосовать: нравится +11 Проголосовать: не нравится

А условия что, только на русском будут (пост до сих пор не переведен)? Если да, то это огромное повышение шансов на футболку.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

    Официальный язык соревнований — русский.

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Что-то письмо с подтверждением регистрации не приходит на почту (gmail)

»
11 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится

Правда, какая официальная позиция к тем участникам, кто будет писать на своем любимом языке и конвертировать код в Kotlin? Например, это явно запрещается или считается неспортивным и просто не поощряется? А может это считается полностью допустимым?

ИМХО, мне кажется, что это какой-то чит, который убивает идею такого соревнования.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится -9 Проголосовать: не нравится

    Хм, а как сконвертить, например, код на C++? Там же куча проблем, начиная от фич C++ вроде темплейтов и unsafe-работы с указателями, и заканчивая необходимостью конвертить весь STL и сабмитить 100Мб исходников.

    Впрочем, с Java таких проблем не будет, особенно если не надо конвертить стандатрые библиотеки.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    Очевидно, что запретить пользоваться конвертором мы технически не можем. Но на всякий случай считаем это неспортивным.

    В любом случае, конвертор сейчас работает, мягко говоря, неидеально. Он скорее не помогает, а, наоборот, мешает. Мы пробовали применить его на решении олимпиадной задачки среднего размера, получили дюжину ошибок компиляции, которые без понимания языка пофиксить сложно, да и просто муторно. Проще сразу писать решение на котлине. Да и приятнее, попробуйте ;)

    Не исключено, что участникам финала конвертор мы все-таки отключим.

»
11 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

А где задачи? Вроде как сегодня старт

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Задачи выложены. К сожалению, из-за технических неполадок результаты проверки сейчас не показываются, но все решения принимаются и никуда не теряются. Приносим свои извинения!

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Всем привет. ребята подскажите пожалуйста, темплейт кода для ввода данных на языке kotlin. пробую в Scanner передавать System.in а "in" как ключевое слово воспринимает. понимаю, глупый вопрос, но не дает покоя(

»
11 лет назад, # |
Rev. 15   Проголосовать: нравится +10 Проголосовать: не нравится

Мелочи(и не очень), которые я нашел:

Кажется неудобным, что range'и для итерации включают последний элемент. Вот надо скажем проитерироваться первые k индексов или все кроме первого, вылазят минус единицы. Да и вообще хочется иметь for с кастомными условиями.

По поводу контеста:

1) было бы круто, если бы список посылок был чуть адекватнее.

(1. Отображались еще не проверенные посылки
(2. Как-нибудь отличались фразы для АС задач, от тех, по которым просто решение принято на проверку. По сданной задаче у меня написано:
Решение принято жюри.

По несданной:
Решение принято жюри.
Ошибка компиляции.

(2. По каждой следующей задаче показываются посылки всех предыдущих.

(3. Естественное желаение — после отправки задачи обновлять страницу с результатом, сейчас браузер (по крайней мере Chrome) предлагает снова передать данные, а значит будет повторная посылка. Насколько я помню, можно сделать редирект на эту страницу, вместо прямой отдачи, чтобы такого не было.

2) У меня за ошибку компиляции в табличке сейчас отмечен минус, было бы круто, чтобы на штраф в основных соревнованиях CE не влияли. Тоже касается посылок после АС.

3) Хочется, чтобы можно было скачать решение, чтобы узнать тот ли файл ты отправил.

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

5) Хоть какая-то анимация загрузки при переключении таба, номера страницы. Просто жмешь — и ничего не происходит, а потом не обновляется.

6) У меня очень долго грузится список людей.

7) Хочется уметь обновлять уже отфильтрованный список людей.(там где найден ты, например) (f5 сбрасывает фильтр)

8) Не столь важно, но обычно запись "+x" обозначает, что перед плюсом было x не удачных попыток, а у вас вроде бы общее кол-во попыток.

9) Во время одного контеста не слишком важно, у кого сколько задач было раньше. Будет ли стандартный монитор, на котором указано без наведений мышки, кто что решил на этом контесте без наведения мыши(а также штраф). Хотя может быть я просто не нашел?

10) На контесте не так принципиально, ибо задач меньше, но всё-таки приятно, на тренировке просто очень хочется: возможность скрыть уже сданные задачи, чтобы не крутить 100км, чтобы добраться до последних задач

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +10 Проголосовать: не нравится

    11) Еще хочется, чтобы при авторизации была галочка "Запомнить меня".

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    1) Баги известны, будут исправлены. Основная проблема — по задаче действительно отображаются посылки всех предыдущих, отсюда вся каша.

    2) Ошибка компиляции не считается в штрафном времени, как и написано в правилах. Сейчас в таблице минусы тоже неверно работают :-(

    3) К сожалению, наверно, в ближайшее время сделано не будет.

    4-7) Постараемся исправить.

    8) См.пункт 2 — неправильно работают минусы.

    9) Да, будет отдельный привычный монитор для каждого соревнования.

    10) К сожалению, наверно, в ближайшее время сделано не будет. Может будет сделан другой способ удобной навигации.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      3) Я так понимаю, это из-за потенциальных проблем с безопасностью? Или есть еще какие-то сложности?

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

Можно просто взять и создать двумерный массив n*m, заполненный 0 (или ещё как-то) проще чем

    val ar = Array<Array<Int>>(10, {_ -> Array<Int>(20, {_ -> 0})})

?

  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Не то чтобы сильно проще, но все же.

    var ar = Array<Array<Int>>(n, {Array<Int>(m, {0})})
    
    • »
      »
      »
      11 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +17 Проголосовать: не нравится

      В данном случае типовые аргументы выводятся автоматически, поэтому их можно опустить:

      val ar = Array(n) { Array(m) { 0 } }
      
  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    val ar = Array(n) { IntArray(m) }

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +10 Проголосовать: не нравится

      Добавлю, этот вариант лучше всех вышеуказанных, потому что в этом случае с точки зрения Java будет объект типа int[][], а не Integer[][], что позволит избежать лишнего боксинга/анбоксинга.

»
11 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

Знатоки Kotlin, у меня есть проблема. Я тут начал делать тестовый фреймворк для себя и у меня проблема. При запуске вот этого файла в месте создания InputReader падает такой эксепшн:

Exception in thread "main" java.lang.ClassFormatError: Duplicate method name&signature in class file InputReader
	at java.lang.ClassLoader.defineClass1(Native Method)
...

Thoughts?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Это известный многогранный баг: KT-1 — компилятор вместо отображения ошибки может сгенерировать несколько методов с одинаковыми Java-сигнатурами. Простейший случай:

    fun f(c: Collection<String>) { }
    fun f(c: Collection<Any>) { }
    

    В Вашем классе InputReader есть свойство filter, для которого геттер- сеттер-методы генерируются автоматически. Методы getFilter() и setFilter() писать вручную больше не надо :)

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А varargs совсем не рабочий? У меня почему-то вместо массива объектов в рантайме выходит массив из одного элемента, в котором уже нужный массив объектов лежит. Из-за этого итерироваться невозможно

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А, понятно, я же передаю один варарг в другой варарг, а он считает его одним объектом. Это можно как-то исправить?

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится

        Я правильно понимаю, что у Вас метод принимает варарг-параметр типа Any, а вы пытаетесь передать туда массив? В этом случае нужно использовать синтаксис spread-оператора:

        fun f(vararg p: Any) {
            println(p.size)
        }
        
        fun main(args: Array<String>) {
            val arr = array<Any>(1, 2, 3)
            f(arr) // выведет "1"
            f(*arr) // выведет "3"
        }
        
»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

У меня тоже вопрос по котлину. Пытаюсь написать простой генерик метод создания массивов:

fun main(args: Array<String>) {
    var a = newArray(2, "");
}

fun newArray<T>(size: Int, defaultValue: T): Array<T> {
    return Array<T>(size) { i -> defaultValue };
}

Компилируется нормально, но при запуске получаю:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Как такой метод правильно пишется?

  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

    В следующей версии компилятора котлина этот код уже не скомпилируется.

    Проблема в ограничениях виртуальной машины Java. Подробно об этой и схожих проблемах с дженериками в Java можно почитать в хорошей статье Брайана Гётца «Java theory and practice: Generics gotchas» (по-английски или по-русски)

    Цитата:

    «Как реализовать ArrayList? Предположим, что класс ArrayList управляет массивом элементов с типом V, поэтому можно ожидать от конструктора для ArrayList создания массива элементов с типом V:

    class ArrayList<V> {
      private V[] backingArray;
      public ArrayList() {
        backingArray = new V[DEFAULT_SIZE]; // не верно
      }
    }
    

    Но этот код не работает — вы не можете создать экземпляр массива с типом, представленным параметром типа. Компилятор не знает о том, какой тип в действительности представляет V, поэтому он не может создать экземпляр массива элементов с типом V.»

»
11 лет назад, # |
  Проголосовать: нравится +39 Проголосовать: не нравится

19 окт, 24:03 Решение принято жюри.

Весьма необычно :)

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Я выступаю от лица жюри и проверяющей системы.

»
11 лет назад, # |
  Проголосовать: нравится -62 Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

А почему компилируется такой код?

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +7 Проголосовать: не нравится

А как в Kotlin быть с проблемой Null-safety в следующем случае?

val notNull: String = notNull()

fun notNull(): String {
    return notNull
}

fun main(args: Array<String>) {
    println(notNull)
}

Выводится null

»
11 лет назад, # |
  Проголосовать: нравится +31 Проголосовать: не нравится

У кого-нибудь задачи уже загрузились?

У меня грузится только главная страница, а задачи не открываются

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Онлайн монитора с финала вообще нет чтоли?