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

Язык этого раунда — Picat, во многом похожий на Prolog. Мы постарались подобрать задачи так, чтобы большинство из них было удобно решать с использованием декларативного подхода.

Традиционная программа A+B (числа A и B разделены пробелом) выглядит следущим образом:

main =>
  A = read_int(),
  B = read_int(),
  C = A + B,
  println(C).

Основной источник информации о языке — сайт http://picat-lang.org/. Используется версия 0.9. Если официальный сайт недоступен, скачать архив с компилятором можно здесь, пароль b161bb757645d9f0.

Несколько замечаний:

  • вердикт "ошибка компиляции" означает, что сильно нарушен синтаксис. В большинстве случаев (например, если ваша программа вызывает неописанную функцию), вердикт будет "неправильный ответ"
  • названия переменных должны начинаться с большой буквы или с подчеркивания
  • в функции printf рекомендуется использовать %n вместо \n
  • не используйте модуль mip, он выводит отладочную информацию в stdout

28 марта в 20:00 (московское время) состоится первый Уайлд-кард раунд VK Cup 2015, который будет проведен в формате Surprise Language Round. Правила:

  • Одновременно проводится два раунда: Уайлд-кард раунд 1 и Уайлд-кард раунд 1 (интернет-трансляция). В основном раунде участвуют команды, прошедшие квалификацию VK Cup. Интернет-трансляция открыта для всех (не только для участников VK Cup) в формате индивидуального участия. Команды, которые уже прошли в Раунд 2, могут участвовать в основном раунде вне конкурса.
  • В Раунд 2 проходят 50 лучших команд из основного раунда, которые не прошли в Раунд 2 по результатам Раунда 1.
  • Соревнование будет нерейтинговым для всех участников.
  • Соревнование проводится по правилам ACM ICPC: положение в результатах определяется количеством решенных задач, при равном количестве — набранным штрафным временем. Изначально штрафное время участника равно 0, при каждой сданной задаче оно увеличивается на время, прошедшее с начала контеста, + 20 минут за каждую неудачную посылку до отправки правильного решения. Решение считается правильным, если оно прошло все тесты из предопределенного набора; правильно ли посланное решение, становится известно сразу. Взломов чужих решений нет.
  • В раунде будет 8-10 задач, примерно отсортированных по сложности, и 2.5 часа на их решение.
  • Решения задач принимаются только на одном языке, который будет объявлен в начале контеста. Язык существует давно, а не придуман нами специально для раунда.
  • Пожалуйста, в начале контеста перечитайте этот пост целиком: в нем появится объявление языка, рекомендации по установке транслятора (в интерфейсе контеста будет доступен запуск программы онлайн) и полезные ссылки на документацию (на английском). В остальном изучение языка — дело рук самого участника.

Мы надеемся, что выбранный нами язык будет незнакомым для большинства участников раунда. Для справки приведу список Surprise/Unknown Language Round, которые проводились на Codeforces ранее.

Раунд Язык
Surprise Language Round #7 FALSE
Пятница, 13-ое, День Программиста Ada
Surprise Language Round #6 Roco
VK Cup 2012 Уайлд-кард раунд 1 Factor
Surprise Language Round #5 COBOL
Unknown Language Round #4 Befunge
Unknown Language Round #3 Pike
Unknown Language Round #2 Io
Unknown Language Round #1 Tcl

Удачи!


Контест окончен. Поздравляем победителей и напоминаем, что лучшие 50 команд из основного раунда проходят в Раунд 2! Разбор задач опубликован здесь.

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

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

Класс. Очень соскучился по этим раундам.

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

Я что-то не очень понимаю логику таких раундов. Быстрее нагуглить, как работать на "волшебном" языке программирования?

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

    Логика логикой, а участвовать в таких раундах очень весело.

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

      та вообще, веселье, partyhard просто...

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

    Ну, зачастую этот "волшебный" язык использует другую парадигму, так что просто нагуглить как сделать цикл, ввод-вывод и условный оператор недостаточно.

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

уже отметил этот контест в своем гугл-календаре

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

Ура! Надеюсь, список малоизвестных языков для таких раундов никогда не закончится ;)

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

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

Benefit of Unknown language contest that it is Unrated. Also ,The coder's introduce a new language.

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

Ни разу не участвовал в таких раундах. Подскажите, пожалуйста, могут ли возникнуть проблемы с установкой трансляторов/компиляторов под Windows? Очень не хочется ставить линуксы на работе.

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

    та не,все норм будет

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

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

      P.S. Ahoma, не думаю, что выбранный авторами раунда язык будет на ideone.

      Upd: зашел на ideone. Там действительно много языков. Возможно есть и сегодняшний.

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

    Подскажите, пожалуйста, могут ли возникнуть проблемы с установкой трансляторов/компиляторов под Windows?

    просто зайдите в профиль Nickolas и посмотрите на ее организацию :)

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

Меня только смущает некоторая близость с первой квалификацией RCC.

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

Hope that the surprise language would be really fun! I always enjoyed learning a new language in surprise language rounds :D

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

Команды, которые уже прошли в Раунд 2, могут участвовать в основном раунде вне конкурса.

В полном составе?

Интернет-трансляция открыта для всех (не только для участников VK Cup) в формате индивидуального участия.

Члены одной команды могут участвовать по отдельности?

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

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

    Трансляция ничего не знает о командах VK Cup и там надо участвовать индивидуально. Конечно, члены одной команды могут по отдельности там и участвовать.

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

> Напомним, что в Раунд 2 пройдут все те команды, которые наберут положительный балл не меньший, чем у команды на 400-м месте.

Я занял 343-е место, но при попытке зарегистрироваться на "VK Cup 2015 — Уайлд-кард раунд 1 (интернет-трансляция)" мне пишет, что я квалифицирован на основную версию.

В какой раунд регаться?

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

    Как хотите. У вас есть возможность регаться и туда и туда.

    • если вы хотите участвовать VK Cup командой, то надо регаться на основной (там вы будете вне конкурса, так как прошли в Раунд 2),
    • если вы хотите участвовать индивидуально, то надо регаться на трансляцию.
»
9 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

I think you use icon language :D

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

Он пересечется с RCC2015 1-ой квалификацией!!! Даже времени на отдых не будет. Предлагаю перенести начало на 10-15 минут.

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

    Бизнес по-русски: как убирать соперников

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

    Много ли времени нужно оранжевому, чтобы отобраться в RCC?

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

      учитывая положение дел на RCC, минут 15 хватит)

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

      ну синим да зеленым (как раз основные ребята, что не прошли в VK Round 2) много нужно — почти все два часа (ну или я такой slow:D). Про фиолетовых ничего не могу сказать.

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

        Справедливости ради, синим и зелёным будет легче отобраться из второго и третьего квалификационного раунда. Да и в принципе не вижу ничего страшного в том, чтобы пропустить одну квалификацию.

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

unrated?why? ):

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

Where will be language announced? in contest area?

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

I had some problems loading archive file under Linux, installing p7zip-full does the trick.

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

у меня компилятор на винде пишет *** error(undefined_predicate,main/0), хотя в запуске кф все норм. Что делать?? (Не охота ждать по 20 сек)

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

Реквестирую раунд на языке PETOOH

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

Как исправлять WA 4 в A?

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

    Сортировать корни правильно. Пример:

        X = (-B-sqrt(D))/A,
        Y = (-B+sqrt(D))/A,
        if X < Y then
          printf("%f %f", X, Y)
        else
          printf("%f %f", Y, X)
        end
    
    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      Делить на 2А надо

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

      Такое не проходило :(

      if (X2 < X1) then
          tmp = X1,
          X1 = X2,
          X2 = tmp
        end,
      
      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        main() =>
          A := read_int(),
          B := read_int(),
          C := read_int(),
          
          D := B * B - 4 * A * C,
          
          A := to_real(A),
          B := to_real(B),
          C := to_real(C),
          
          if D == 0 then
            writef("%f%n", -B / (2 * A))
          else
            X1 = (-B - sqrt(D)) / (2 * A),
            X2 = (-B + sqrt(D)) / (2 * A),
            if X1 > X2 then
              X := X1,
              X1 := X2,
              X2 := X
            end,
            
            writef("%f %f%n", X1, X2)
          end.
        
      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        присваивание там tmp := X1

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

I would like to sincerely thank the organizers for not choosing FALSE again

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

    FALSE was cool)

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

    Choosing the same language for the second time is not particularly fun in general, but choosing it for the second time in row would be definitely sad — regardless of the language itself :-)

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

i spent most of the time with a problem in the case there are not solutions in C; using solve_all works fine and gives me the solutions when they exist, but for the second sample case where there are no solutions, it gives me error(failed,main/0) and i could not get the catch mechanism to work...

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

    We discuss this in the contest editorial (the Russian version for C is ready, the English one will be ready soon).

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

Как и когда можно будет увидеть окончательный результат, без учёта тех, кто участвовал вне конкурса?

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

Time limit for last question was pretty tight — I had to keep resubmitting until it passed.

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

    I think there's solution with complexity O(3N), which should pass comfortably. Though I haven't finished it in time & can't resubmit yet..

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

    Reference solution takes about 200ms.

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

      Then I guess the time limit is too loose and what I submitted (aka brute-force) shouldn't pass :P

      Code in edit.

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

        It was our purpose to make it somewhat loose. And only 3 persons managed to solve it.

        Your solution is basically the intended solution, but to speed up it tremendously you can add Bd[1] #= 1, because the first value will always be 1.

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

          Wow, this is why declarative languages confuse me. That such a small detail could make the program 10x faster is mind-boggling! Thanks for the pointer.

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

What is WA14 in F?

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

This might be the first and the last time when my university Prolog lessons were useful... :)

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

Дорешивание будет?

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

Как решать Е?

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

    Есть простая конcтрукция: N — 2 единицы, 2 и D + N.

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

    выводишь набор из N-2 единичек, двойку и N+D

    тогда сумма будет N-2+2+N+D = 2*N+D,

    а произведение — 2*N

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

как надо было делать H?

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

    Перебор X и Y до 200-300, с перебором N точек внутри (подходят/не подходят вовнутрь треугольника)

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

Не подскажите, с чем может быть связана ошибка error(instantiation_error,b_PICAT_ARG_ccf)?

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

    Это означает, что какая-то переменная используется до того, как ей присвоено значение. Конкретнее могу подсказать по коду.

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

      https://ideone.com/1JBHiq вот... немного отредактировал... На контесте пришлось писать всё в одну строчку, иначе не получалось компилировать у себя локально в консоли((

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

        Вместо while(IT1<=IT2) должно быть while(IT1<IT2), насколько я понимаю.

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

          Спасибо большое!!! Только невероятно обидно... Ошибка всего в одном символе помешала пройти в следующий раунд((

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

Суперский раунд! Показывает приспособленность к меняющимся условиям — написать на новом языке контест. Сам язык стоило назвать "Партизан" — не говорит, где именно произошел failed ._.

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

    Метод "удали строчку — проверь, пропала ли ошибка" работает в таких случаях довольно неплохо) Умею, практикую)

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

    Разве не говорит? Насколько я помню, при неудачной компиляции показывается исходный код с надписью HERE в месте ошибки :)

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

      При неудачной компиляции, но не при неудачном исполнении.

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

Спасибо за раунд и за знакомство с Picat! Мне нравится Prolog, и я пытался на нём что-то интересное писать… но, в общем, впечатления не всегда самые хорошие. Picat в этой связи выглядит весьма интересно.