QOJ.ac

QOJ

Limite de temps : 1 s Limite de mémoire : 256 MB Points totaux : 100 Difficulté: [afficher]

#18232. APLSPC

Statistiques

SFLSPC에 오신 여러분을 환영합니다!

문제 배경

남극 펭귄 언어 학교(Antarctica Penguin Language School)에서는 매년 펭귄들이 코드 압축과 최적화(卡常) 훈련을 합니다.

북극해 북극곰 언어 학교에서 파견된 oo라는 펭귄 간첩이 있습니다! 이 펭귄은 대회에 잠입하여 APLS를 북극곰의 식민지로 만들려고 합니다!

부지런하고 용감한 펭귄 한 마리가 사악한 북극 펭귄의 전복 계획을 좌절시켰을 뿐만 아니라, APLSPC의 모든 데이터를 만들었습니다. 다 같이 말해봅시다: 펭귄에게 감사를.

위대한 펭귄 한 마리가 있습니다. 이 펭귄은 매우 위대하며 남극 펭귄 언어 학교의 대제입니다.

두두(嘟嘟) 펭귄 한 마리가 있습니다. 이 펭귄은 매우 두두합니다. 이 펭귄은 당신에게 두두두 학습 자료를 보내며 공부하라고 요구합니다.

당당(糖糖) 펭귄 한 마리가 있습니다. 이 펭귄이 작성한 $O(n\log n)$ 코드가 $n\le 5\times 10^5$, 2초라는 데이터 범위 내에서 통과하지 못하자, 펭귄은 매우 화가 나서 사회에 복수하기로 결심하고 이 문제를 출제했습니다.

문제

당신은 다음 조건을 만족하는 코드를 작성해야 합니다.

  1. 해당 언어의 컴파일 명령에 따라 정상적으로 실행되어 자기 자신을 출력해야 합니다.
  2. 전역 일치(full-word match) 의미에서 해당 언어의 어떠한 키워드도 포함하지 않아야 합니다(전역 일치가 무엇인지 모른다면 '평가 세부사항' 항목을 참조하십시오).

이 두 가지 요구사항은 C++와 Python 모두에 대해 만족해야 합니다. 즉, 이 코드는 동시에 합법적인 C++ 코드이자 Python 코드여야 하며, 위의 요구사항을 모두 충족해야 합니다.

이 전제하에, 당신의 코드는 최대한 짧아야 합니다.

만약 당신의 코드가 모든 조건을 만족하고 길이가 250B를 넘지 않는다면, $100$점을 얻게 됩니다. 만약 일부 조건을 만족하지 못하더라도 일정 점수를 얻을 수 있으며, 자세한 내용은 '채점 방식'을 참조하십시오.

주의: 우리는 당신의 코드가 실행되는 디렉토리에 소스 코드가 없도록 조치할 것이며, 소스 코드 파일을 호출하는 등의 방식으로 과제를 완료할 수 없으며, 그렇게 해서도 안 됩니다.

문법이 익숙하지 않다면 python.org 또는 cppreference.com을 방문하여 관련 정보를 얻을 수 있습니다.

평가 세부사항

당신의 코드에는 ASCII 이외의 문자가 포함되어서는 안 되며, 그렇지 않을 경우 결과는 정의되지 않습니다.

우선, 코드의 모든 줄바꿈 문자는 강제로 CRLF(\r\n)로 변환되므로, 줄바꿈 하나당 2바이트를 차지합니다.

그다음, 평가기는 다음 명령어를 각각 호출하여 당신의 코드를 실행합니다.

/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와는 매칭될 수 없습니다. 키워드 목록은 문제 마지막에 첨부되어 있습니다.

특별히 주의할 점은, 명시된 시간 제한은 의미가 없으며 실제 제한은 1000ms라는 것입니다. 당신의 코드가 1000ms를 초과하여 실행되면 강제로 종료되지만, 실행 시간과 메모리 사용량은 평가 결과에 반영되지 않습니다.

채점 방식

당신의 초기 점수 $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.