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

Автор MikeMirzayanov, история, 8 лет назад, По-русски

Язык этого раунда — Kotlin. Kotlin (Ко́тлин) — статически типизированный язык программирования, работающий поверх JVM и разрабатываемый компанией JetBrains.

Вот вам пример простейшей программы, которая выводит сумму двух чисел:

fun main(args: Array<String>) {
    val (x, y) = readLine()!!.split(' ').map(String::toInt)
    println(x + y)
}

Для того, чтобы познакомиться с языком мы предлагаем вам почитать следующие материалы:

Вы можете отдельно выкачать компилятор языка версии 1.0.1 по ссылке http://s.codeforces.com/files/kotlin-compiler-1.0.1.zip Для запуска компилятора без IDE вам нужна установленная JRE (виртуальная машина Java), её можно найти по ссылке http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

Пароль для архива с IDEA (IDE с поддержкой Kotlin из коробки): c8bf9dd9b91ad9ff Сами ссылки на IDEA — чуть ниже или на официальном сайте https://www.jetbrains.com/idea/download/

Удачи!

====

UPD: Вы можете заранее выкачать пакет разработчика (извините, 300 МБ). На самом деле можно будет обойтись и без него — будет доступен запуск на Codeforces и в 18:30 выложим вариант покомпактнее.

OS
Linux http://s.codeforces.com/files/683-linux.7z
Windows http://s.codeforces.com/files/683-windows.7z
Mac OS http://s.codeforces.com/files/683-macos.7z

Все архивы запаролены, пароль будет опубликован в 18:30.

========

16 июня в 19:00 (московское время) вас ждет Surprise Language Round #8. Напоминаю, что это необычное развлекательное соревнование. Задачи можно будет сдавать лишь на одном языке, а каком — пока секрет.

Таким образом, предполагается что за время раунда участники могут познакомиться с языком и сдать на нем несколько несложных задач. Язык раунда будет анонсирован за 30 минут до старта раунда. В этом же время (или даже чуть раньше) мы опубликуем архивы с инструментами для написания программ на этом языке.

Я рад анонсировать, что лучшие 20 участников получат клевую эксклюзивную футболку, а еще 10 штук будут случайным образом разыграны среди всех тех, кто решил хотя бы три задачи.

Правила проведения раунда:

  • Соревнование будет нерейтинговым для всех участников.
  • Индивидуальное соревнование по правилам ACM ICPC: положение в результатах определяется количеством решенных задач, при равном количестве — набранным штрафным временем. Изначально штрафное время участника равно 0, при каждой сданной задаче оно увеличивается на время, прошедшее с начала контеста, + 20 минут за каждую неудачную посылку до отправки правильного решения. Решение считается правильным, если оно прошло все тесты из предопределенного набора; правильно ли посланное решение, становится известно сразу. Взломов чужих решений нет.
  • В раунде будет 6-10 задач, примерно отсортированных по сложности, и 2 часа на их решение.
  • Решения задач принимаются только на одном языке, который будет объявлен за 30 минут до старта контеста.
  • Пожалуйста, в начале контеста перечитайте этот пост целиком: в нем появится объявление языка, рекомендации по установке компилятора (в интерфейсе контеста будет доступен запуск программы онлайн) и полезные ссылки на документацию. В остальном изучение языка — дело рук самого участника. Для решения задач вы можете использовать любые ресурсы (но не совместное участие); ограничиваться документацией, приведенной в посте, не обязательно.

Удачи!

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

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

First SLR I'm eligible to participate in in 5 years.

9 am on a weekday in my time zone.

:-(

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

It is awesome that Surprise Language Round comes back since the previous Surprise Language Round was 21 months ago.

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

In fact, this contest is interesting, and I want to participant it.

My dream is going to get a T-Shirt. Can you pray for me?

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

Hi, I am new to CodeForces competitions, and this will be first one. Will the programming language be something completely new(like an unknown language)? Or will it be like a custom/madeup language?

thanks pimaster314

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

Tshirt! registered. :)

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

Really excited related to this contest, it will be fun to know a completely new language. Contest Like these makes coding and codeforces interesting.

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

Exclusive! Exclusive!. How this is exclusive?! Can we see it?

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

Not gonna lie, I registered for the T-shirts.

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

    Lol. I updated my Tshirt size, just in case ;-)

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

      LoL. Reminds me of the time when I hurried up in updating my Tshirt size after I won one. I never actually cared because I never though I'll get one ;)

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

        I never updated my T-shirt size on baylor site so I recieved an XL T-Shirt.
        I switched it with my team mate and he still doesn't know about it why did he got a XL T-shirt xD .

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

!!!

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

Может кто-нибудь переложить архив для linux на amazon или ещё куда-нибудь? У меня что-то очень плохой канал для скачивания, 5 KB/s

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

Язык этого раунда — Kotlin

Наслышан. Пойду-ка я футбол лучше посмотрю

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

    Да язык то говорят неплохой, но я честно говоря ожидал чего-то более экзотического и менее джаваподобного :)

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

NO!!I haven't finished downloading it yet. Is there any way to get it faster?

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

Kotlin. Очень разочарован. Думал будет что-то необычное и интересное, как в предыдущих SLR
Однако не может не радовать то, что после этого скорее всего kotlin будет доступен на обычных раундах!

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

First link, the wikipedia one, is broken I can't click on it, only copy and paste to address bar works.

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

which compiler should i select in custom test?

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

Чет это не сюрприз никакой. Во-первых, уже больше двух лет прошло с Kotlin Challenge, во-вторых, этот язык некоторые уже и просто в продакшене юзают, а в третьих — да пишешь просто точно так же, как на джаве, и оно работает.

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

    Ну вот участвовал я в Kotlin Challenge — не совсем как на Java (конечно, много общего). Кроме того Kotlin Challenge был для русскоязычной аудитории, а на Codeforces сейчас это даже не большинство.

    Я думаю очень слабое пересечение сообщества Codeforces и тех, кто в продакшне его использует.

    Этот раунд следует воспринимать как способ познакомиться с языком в соревновательных условиях. Не хотите — не участвуйте, уверен — кому-то будет весело.

    Да, и я тоже надеюсь, что будут и необычные языки в подобных раундах в будущем.

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

      Я тоже участвовал в Kotlin Challenge — и единственное, что выучил — как многомерные массивы создавать. Все остальное то же самое. Я, конечно же, поучаствую: идея уже запущена, три задачки — и домой :)

      Кстати, шаблончики можно взять с https://www.go-hero.net/

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

        Про три задачки-то наврал)

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

          Чет я увлекся :) Решил 8 на работе, после восьмой — сразу домой...

          Девятая подоспела just in time!

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

      Спасибо за раунд!

      Поясните, пожалуйста, общественности, когда стоит ждать Kotlin в числе доступных языков на обычных соревнованиях на сайте?

      Пока в выпадающем списке языков отсылки пробного тура Kotlin-a не видно: http://codeforces.com/gym/101021/submit

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

        На сегодняшнем раунде уже будет — регистрируйтесь и участвуйте!

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

Kotlin? It seems that the next SLR is going to have C++ as the only language:) Btw, it surely will be a great surprise:)

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

    +1 This is so similar to Scala :/

    There isn't much of a surprise.

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

    +1

    They might be choosing Kotlin for introducing some harder task to SLR, but Kotlin is way too common (and too sane). Quite different from old SLRs by Nickolas.

    Well, next time you can do this for Rust, or Elixir, or whatever.

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

    Kotlin is too common to be fair. People who are familiar with the language (or even with Java) has a clear advantage.

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

Дальше будет 1С.

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

still cant figure out how to read input >_>

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

Кажется года 4 назад на полуфинале в Питере давали игрушечный тест на Kotlin в качестве его рекламы, вот ведь неожиданность )

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

I am unable to compile my source code from given compiler. Any help?

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

Аааргх. Я пишу не первый SLR, но только для котлина уже полчаса не могу найти ни одного способа считать и распарсить инпут, который бы скомпилился.

Особый сок — вспомнить про котлин.челленж, найти пост на хабре, увидеть в нем решение одной из задач, положить его в "запуск" и увидеть, что оно не компилится. То ли мне больше не стоит заниматься программированием, то ли все-таки лыжи не едут.

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

    Я начал экспериментировать с тем вводом, что приведён в анонсе. Он, как оказалось, умеет считывать строку либо в несколько переменных, либо в массив. В итоге в C у меня вот такие костыли:

    val a = readLine()!!.split(' ').map(String::toInt)
    val b = readLine()!!.split(' ').map(String::toInt)
    for( i in 1..a[0] ) {
    for( j in 1..b[0] ) {
    

    Но они хотя бы работают...

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

      Можно же просто написать

      var n = readLine()!!.toInt()
      
      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        В задаче С в одной строке записано и количество элементов и сам массив.

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

      Можно проще, достаточно дропнуть первый элемент:

      val xs = readLine()!!.split(' ').drop(1).toSet()
      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        +забавное соображение: даже если его не дропнуть, на симметрическую разность это не повлияет — если она реализована как "добавить, если нет, и удалить, если есть".

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

          Видимо, я пошел другим путем и завалил две посылки, прежде чем увидел, что первое число — количество элементов.

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

      Но его же.. А давно он там появился?

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

        Да вроде в 18:30, со всеми остальными материалами. Мне тоже этот пример из шапки очень помог )

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

    Я прямо перед стартом чуть выше написал сайт со статистикой GCJ — https://www.go-hero.net/. Можно было там найти любое решение на Kotlin. Я именно так и сделал — можешь посмотреть мои посылки. Собственно, там точная копия моего джавовского шаблона.

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

I cant find any courses that tell me how to read a string or read input one by one:(

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

How to use the compiler? The IDE told me that I did not have Project SDK.

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

Random winners of 10 t-shirts will be determined using the following code (testlib is used). The code will be executed with two parameters in the command line: number of participants with at least 3 problems and penalty of the lowest among them.

#include "testlib.h"
#include <bits/stdc++.h>

using namespace std;

int main(int argc, char* argv[])
{
    registerGen(argc, argv, 1);

    int n = atoi(argv[1]);

    vector<int> places;
    for (int i = 21; i <= n; i++)
        places.push_back(i);
    shuffle(places.begin(), places.end());

    cout << "T-Shirt Random Winners:";
    for (int i = 0; i < 10; i++)
        cout << " " << places[i];
    cout << endl;
}
»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

O(N lg K) was supposed to pass on G?

I got TLE on #21 :/

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

    You meant H? Not sure about O(NlgK), solved it with O(N).

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

      Yeah H, how in O(N).

      I used binary jumping for N lg K.

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

        Iterate over every student, build cycles for them — it is O(N)

        For every cycle get shift = K % cycle_len, for every student in cycle get his new book from (i — shift) pos in cycle (if lesser than 0 += cycle_len). It is O(N) too.

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

    Solved it with O(NlogK): 18526851. I'm guessing your solution is slower than mine because of large array.

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

      Ah! I made the mistake of storing the whole precalc table :/ Should have done it on the fly.

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

Ah, placed 25, so close.

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

What is wrong with this for C?

I get Runtime Error on test 17: 18529037

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

Round is very interesting and educational.

Thank you.

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

I submitted solution for E, got TLE, so I decided to rewrite code from Java. I copy-pasted the Java code to the Kotlin file and IDEA asked: "Do you want to convert it to Kotlin code?". I clicked "Yes" and this way I got E accepted without writing a lot of Kotlin code. I wish I knew the copy-pasting rule from the beginning of the contest.

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

    Yea, sounds cheaty from the perspective of non-Java participant :)

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

      Definitely sounds like that. Before copy-pasting I was prepared for a long process of manual conversion from the language I knew into the language that I didn't know, so that wouldn't be so different if the source language was C++ (or any other language). The process would probably be errorprone and given the size of the SetWithCount class my initial thought was that the chances of successful conversion are slim but I had no better idea. After learning that one can convert code from Java to Kotlin I wrote solution to G in Kotlin without using Java. What's the fun of writing Java solution when it is a Kotlin contest?

      Anyway, the "conversion from Java to Kotlin" message was the big "WTF?!!! I was browsing the Reference manual for two hours, while I could have just written everything in Java and then convert?", so I guess the language wasn't the only surprise for me in this contest:)

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

Heh, before this round, I've just thought, "the author seems to be Mike, so it may be a way to battle-test a new language for regular rounds".

Will Kotlin be available for common rounds now as well?

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

Did someone used "Convert from java" button of http://try.kotlinlang.org/#/Examples/ ?

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

Do I get something wrong about J, or it is easier than I?

In J you don't have to find a minimal path, so you can just blow every single wall and exit. 100k actions is more than enough for that.

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

As a developer working on Kotlin at JetBrains, I'd like to present my solutions for today's problems (except H), maybe they will be of use for someone. (UPD: I did not take part in the round.)

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

    Your B solution looks great. I see that I could have just sorted the students instead of using HashMap<Int, MutableMap<String, Int>>. Such an overkill:) I had a lot of trouble with trying to use Map.computeIfAbsent, because IDEA kept coloring it red, and I finally gave up and used temporary variables. What I wanted to do:

    val s: NavigableMap<Int, Map<String, Int>> = TreeMap()
    val z = s.computeIfAbsent(height, { k -> HashMap() })
    z.put(name, z.getOrDefault(name, 0) + 1)

    Is there a way to use computeIfAbsent (or getOrElse or getOrPut or something else) to achieve the same effect without using temporary variables?

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

      computeIfAbsent is not available in kotlin.Map currently because it breaks variance of Map's generic type parameters. I believe this is being discussed and worked on currently (link).

      I don't think there's a nice way to write this without using temporary variables :) I can only suggest something like the following:

          val s: NavigableMap<Int, MutableMap<String, Int>> = TreeMap()
          s.getOrPut(height) { HashMap() }.let { map ->
              map[name] = (map[name] ?: 0) + 1
          }
      
  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    You don’t need the last capitalize call in F, do you?

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

For problem I, I noticed something strange in some accepted solutions:

I thought we needed to minimize the number of pushes. It seems they are printing three pushes, while the optimal solution is only one push.

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

Regarding the language, I have one feedback comment for now.

When I want a specific construct, I usually Google for it. For the things in the standard library (for example, set or regular expressions), the first link usually invites to read the official API Reference. Its pages list all methods, but I didn't find any single example each time I got there. And it is hard(er) to learn using a construct without an example readily available. So, I usually scrolled the Google results down to find the first link to StackOverflow, and it helped.

The point is, for a new user, it would be nice if the examples came on the first link from a respective Google search. If that link is usually API Reference, it would be nice to have examples right in the API Reference.

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

В течение и после соревнования у меня, кажется, глючила таблица результатов. В какой-то момент я видел себя на первом месте в таблице, но, если на неё посмотреть сейчас, очевидно, что я никогда не был первым. В районе часа после начала соревнования в таблице внезапно появилась целая куча народа или успешных посылок, которых раньше в ней не было — причём посылок, датированных более ранними временами; и я сразу сильно упал. И даже после конца соревнования, когда таблица мне предложила перезагрузить страницу, я её перезагрузил и видел себя на 11-м месте и только Егора с минусом в I прямо подо мной. А сейчас я на 12-м, а минус в I есть у целых двоих человек прямо подо мной.

Ну а язык, как уже говорили, хотелось бы поэкзотичней. По Котлину уже было специальное соревнование, рекламировавшееся и на Кодфорсах. К тому же там выше говорят, что есть даже несколько рабочих конвертеров с Джавы… Но всё равно спасибо — для меня это вышел первый раз пописать на Котлине.

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

    Моя посылка с 11 места тестилась еще примерно минуту после окончания соревнования. И ее не было видно, пока она не дотестилась. (может быть, имеет смысл помечать такие посылки вопросиками?) С остальными, видимо, так же.

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

      А. Это объясняет, почему в конце соревнования таблица не сразу обновилась. Было бы хорошо помечать вопросиками, да. Да хотя бы где-нибудь на видном месте иметь пометку о том, что ещё не всё дотестилось, было бы хорошо. (Или она уже есть, но не на очень видном месте, а я про неё забыл?)

      Но во время соревнования всё равно было как-то странно. Уж первым-то я себя точно не должен был видеть! Если другие люди раньше послали — причём вон насколько раньше! то их посылки должны были бы раньше протеститься, по идее.

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

Может стоит переименовать такие раунды в surprise motherfucka language round?

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

Kotlin was indeed a fun language (no pun intended)

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

А можно как-нибудь узнать статус отправки футболок? Мне еще не доехала, а другому человеку из моего города доехала уже неделю назад (если он не врет), и это как-то странно.