QOJ.ac

QOJ

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

#18232. APLSPC

Statistics

¡Bienvenidos a SFLSPC!

En la Escuela de Lenguaje de Pingüinos de la Antártida (APLS), los pingüinos entrenan cada año en cómo comprimir código y optimizar constantes.

¡Un pingüino "oo" es un espía enviado por la Escuela de Lenguaje de Osos Polares del Océano Ártico! ¡Se ha infiltrado en esta competencia con la intención de convertir la APLS en una colonia de osos polares!

Un pingüino trabajador y valiente no solo frustró el malvado plan de subversión de los pingüinos polares, sino que también creó todos los datos para la APLSPC. Digan todos: gracias, pingüino.

Un gran pingüino, que es muy grande, es el emperador de la Escuela de Lenguaje de Pingüinos de la Antártida.

Un pingüino "dudu" es muy "dudu". Te envió un material de estudio "dududu" y te pidió que lo aprendieras.

Un pingüino "tangtang" escribió un código $O(n\log n)$ que no pudo pasar dentro del límite de tiempo de 2s para $n\le 5\times 10^5$. Se enojó mucho y decidió vengarse de la sociedad, así que creó este problema.

Debes escribir un código que, para los lenguajes requeridos, cumpla con lo siguiente:

  1. Bajo las instrucciones de compilación del lenguaje, debe ejecutarse correctamente y mostrar su propio código fuente.
  2. No debe contener ninguna palabra clave del lenguaje bajo el criterio de coincidencia de palabra completa (si no sabes qué es la coincidencia de palabra completa, consulta la sección de detalles de evaluación).

Estos dos requisitos deben cumplirse tanto para C++ como para Python. Es decir, este código debe ser un código válido tanto en C++ como en Python, y cumplir con los requisitos anteriores.

Bajo esta premisa, tu código debe ser lo más corto posible.

Si tu código cumple con todas las condiciones y su longitud no supera los 250B, obtendrás $100$ puntos. Si tu código no cumple con algunas condiciones, también podrás obtener una puntuación parcial; consulta la sección de puntuación para más detalles.

Nota: utilizaremos métodos para asegurar que tu código no tenga acceso al archivo fuente en el directorio de ejecución; no puedes ni debes intentar completar la tarea llamando al archivo fuente.

Si no estás familiarizado con la sintaxis, puedes visitar python.org o cppreference.com para obtener información relevante.

Detalles de evaluación

Tu código no puede contener caracteres que no sean ASCII, de lo contrario, el resultado será indefinido.

Primero, todos los saltos de línea de tu código serán forzados a convertirse en CRLF (\r\n), por lo que un salto de línea ocupará dos bytes.

A continuación, el evaluador llamará por separado a las siguientes instrucciones para ejecutar tu código:

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

Luego, el evaluador utilizará la siguiente instrucción para determinar si tu código muestra su propio contenido:

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

Esta instrucción tratará el CRLF al final de la línea como LF, lo que significa que no necesitas preocuparte por caracteres de salto de línea especiales al imprimir tu código.

Además, esta instrucción realizará una comparación estrictamente completa, lo que significa que los espacios en blanco al final de la línea también deben ser exactamente iguales.

Finalmente, el evaluador buscará en la lista de palabras clave si tu código contiene alguna de ellas, utilizando el método de coincidencia de palabra completa. La definición de coincidencia de palabra completa es que el carácter anterior y posterior a la posición de coincidencia no sean números, letras o guiones bajos. Por ejemplo, int puede coincidir con (int), pero no con print. La lista de palabras clave se adjunta al final del problema.

Es importante notar que el límite de tiempo indicado no tiene sentido; el límite real es de 1000ms. Si tu código tarda más de 1000ms, será terminado a la fuerza, pero el tiempo de ejecución y el espacio utilizado no se reflejarán en el resultado de la evaluación.

Puntuación

Define tu puntuación preliminar $s_0$:

  • Independientemente de si el código contiene palabras clave, si tu código es un código C++ válido y muestra su propio contenido al ejecutarse en C++, pero no es un código Python válido, $s_0=2$.

  • Independientemente de si el código contiene palabras clave, si tu código es un código válido tanto en C++ como en Python, y muestra su propio contenido al ejecutarse en C++, pero no en Python, $s_0=10$.

  • Independientemente de si el código contiene palabras clave, si tu código es un código válido tanto en C++ como en Python y muestra su propio contenido en ambos lenguajes, sea $x$ la longitud de tu código:

$$ 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} $$

  • En otros casos, $s_0=0$.

$f(x)$ es una función continua. Ten en cuenta que $s_0$ puede ser mayor que $100$.

Finalmente, si tu código no contiene palabras clave, tu puntuación final será $\lfloor\min(100,s_0)\rfloor$, de lo contrario será $\lfloor\min(70,0.7s_0)\rfloor$.

Lista de palabras clave

La siguiente es la lista de palabras clave de 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"
}

La siguiente es la lista de palabras clave de 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"
}

Sugerencias

  • La función main de C++ puede definirse sin un tipo de retorno. Es decir, el siguiente es un código C++ válido:
main(){}

Ejemplos

Entrada 1

(vacío)

Salida 1

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.