QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 256 MB Total points: 100 Difficulty: [show]

#18232. APLSPC

Statistics

Добро пожаловать на SFLSPC!

Предыстория задачи

В Антарктической школе пингвиньего языка пингвины каждый год тренируются сокращать код и оптимизировать его по времени.

Один пингвин по имени oo — шпион, подосланный Школой языка белых медведей Северного Ледовитого океана! Он уже проник на это соревнование, пытаясь превратить APLS в колонию белых медведей!

Один трудолюбивый и храбрый пингвин не только сорвал планы злых северных пингвинов, но и создал все тесты для APLSPC. Скорее скажите: спасибо пингвину.

Один великий пингвин, он очень великий, он император Антарктической школы пингвиньего языка.

Один пингвин по имени дуду, он очень дуду. Он отправил вам учебные материалы «дудуду», требуя, чтобы вы их изучили.

Один пингвин по имени тантан написал код с асимптотикой $O(n\log n)$, который не уложился в ограничение $n\le 5\times 10^5$ за 2 секунды. Он очень разозлился, решил отомстить обществу и придумал эту задачу.

Условие задачи

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

  1. При компиляции и выполнении на соответствующем языке программа должна корректно работать и выводить свой собственный исходный код;
  2. В смысле полнотекстового поиска (whole-word matching) код не должен содержать ни одного ключевого слова данного языка (если вы не знаете, что такое полнотекстовый поиск, обратитесь к разделу «Детали реализации»).

Оба требования должны выполняться как для C++, так и для Python. Иными словами, ваш код должен одновременно являться корректным кодом на C++ и на Python, а также удовлетворять вышеуказанным требованиям.

При соблюдении этих условий ваш код должен быть как можно короче.

Если ваш код удовлетворяет всем условиям и его длина не превышает 250 байт, вы получите $100$ баллов. Если ваш код удовлетворяет не всем условиям, вы также можете получить некоторое количество баллов, подробнее см. в разделе «Система оценки».

Обратите внимание: мы примем меры, чтобы в рабочей директории во время выполнения программы не было исходного файла. Вы не можете и не должны пытаться считывать исходный файл программы.

Если вы не знакомы с синтаксисом, вы можете посетить python.org или cppreference.com для получения соответствующей информации.

Детали реализации

Ваш код не должен содержать не-ASCII символов, в противном случае результат не определен.

Во-первых, все символы переноса строки в вашем коде будут принудительно заменены на CRLF (\r\n), поэтому один перенос строки занимает два байта.

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

/usr/bin/g++ code.cpp -std=c++2a -O2 -o code && ./code
python3 code.cpp

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

diff --strip-trailing-cr code.cpp out

Эта команда рассматривает CRLF в конце строки как LF, что означает, что вам не нужно беспокоиться о специальных символах переноса строки при выводе.

Кроме того, эта команда выполняет строгое сравнение, то есть пробельные символы в конце строк также должны полностью совпадать.

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

Особо отметим, что указанное ограничение по времени не имеет значения, фактическое ограничение составляет 1000 мс. Если ваш код будет выполняться дольше 1000 мс, он будет принудительно завершен, однако время выполнения и использование памяти не будут отражены в результатах тестирования.

Система оценки

Определим ваш предварительный балл $s_0$:

  • Независимо от наличия ключевых слов, если ваш код является корректным кодом на C++ и при выполнении на C++ выводит сам себя, но не является корректным кодом на Python, $s_0=2$.

  • Независимо от наличия ключевых слов, если ваш код является корректным кодом одновременно на C++ и Python, и при выполнении на C++ выводит сам себя, но на Python — нет, $s_0=10$.

  • Независимо от наличия ключевых слов, если ваш код является корректным кодом одновременно на C++ и Python и выводит сам себя на обоих языках, пусть $x$ — длина вашего кода, тогда:

$$ s_0=f(x)= \begin{cases} 20&(x\ge10^4)\\ 45-\frac{x}{400}&(2000\le x<10^4)\\ \frac{200}{3}-\frac{x}{75}&(500\le x<2000)\\ 135-\frac{3x}{20}&(300\le x<500)\\ 150-\frac{x}{5}&(x<300) \end{cases} $$

  • В остальных случаях $s_0=0$.

$f(x)$ — непрерывная функция. Заметьте, что $s_0$ может превышать $100$.

Наконец, если ваш код не содержит ключевых слов, ваш итоговый балл равен $\lfloor\min(100,s_0)\rfloor$, в противном случае — $\lfloor\min(70,0.7s_0)\rfloor$.

Список ключевых слов

Ниже приведен список ключевых слов C++:

{
    "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break",
    "case", "catch", "char", "char8_t", "char16_t", "char32_t", "class", "compl", "concept",
    "const", "consteval", "constexpr", "constinit", "const_cast", "continue", "co_await",
    "co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast",
    "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto",
    "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq",
    "nullptr", "operator", "or", "or_eq", "private", "protected", "public", "register",
    "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static",
    "static_assert", "static_cast", "struct", "switch", "synchronized", "template", "this",
    "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned",
    "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"
}

Ниже приведен список ключевых слов Python:

{
    "False", "None", "True", "and", "as", "assert", "async", "await", "break", "class",
    "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global",
    "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return",
    "try", "while", "with", "yield", "match", "case"
}

Примечание

  • В C++ функцию main можно определять без указания типа возвращаемого значения. То есть следующий код является корректным кодом на C++:
    main(){}

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.