Bienvenue à SFLSPC !
À l'école de langue des manchots de l'Antarctique, les manchots s'entraînent chaque année à compacter leur code et à optimiser leurs constantes.
Un manchot « oo » est un espion envoyé par l'école de langue des ours polaires de l'océan Arctique ! Il s'est infiltré dans cette compétition, tentant de transformer l'APLS en une colonie d'ours polaires !
Un manchot travailleur et courageux a non seulement déjoué les plans subversifs des méchants manchots polaires, mais a aussi généré toutes les données de l'APLSPC. Dites vite : merci le manchot.
Un grand manchot, très grand, est l'empereur de l'école de langue des manchots de l'Antarctique.
Un manchot « dudu » est très « dudu ». Il vous a envoyé des documents d'apprentissage « dududu » pour que vous les étudiiez.
Un manchot « tangtang » a écrit un code en $O(n\log n)$ qui n'a pas réussi à passer dans la limite de temps de 2s pour $n\le 5\times 10^5$. Très en colère, il a décidé de se venger de la société en créant ce problème.
Énoncé
Vous devez écrire un code qui, pour les langages requis, satisfait les conditions suivantes :
- Sous les instructions de compilation du langage, il peut s'exécuter normalement et afficher son propre code source ;
- Il ne contient aucun mot-clé du langage au sens d'une correspondance de mots entiers (si vous ne savez pas ce qu'est une correspondance de mots entiers, veuillez vous référer à la section Détails d'implémentation).
Ces deux exigences doivent être satisfaites à la fois pour C++ et Python. En d'autres termes, ce code doit être simultanément un code C++ valide et un code Python valide, tout en respectant les exigences ci-dessus.
Dans ces conditions, votre code doit être aussi court que possible.
Si votre code remplit toutes les conditions et que sa longueur ne dépasse pas 250B, vous obtiendrez $100$ points. Si votre code ne remplit pas certaines conditions, vous pouvez tout de même obtenir des points, voir la section Notation pour plus de détails.
Attention, nous utiliserons des moyens pour garantir que votre code n'a pas accès au fichier source dans le répertoire d'exécution ; vous ne pouvez pas et ne devez pas tenter d'accéder au fichier source pour accomplir la tâche.
Si vous n'êtes pas familier avec la syntaxe, vous pouvez visiter python.org ou cppreference.com pour obtenir des informations pertinentes.
Détails d'implémentation
Votre code ne doit pas contenir de caractères non ASCII, sinon le résultat est indéfini.
Tout d'abord, tous les sauts de ligne de votre code seront forcés en CRLF (\r\n), donc un saut de ligne occupe deux octets.
Ensuite, le système de test appellera séparément les instructions suivantes pour exécuter votre code :
/usr/bin/g++ code.cpp -std=c++2a -O2 -o code && ./code
python3 code.cpp
Ensuite, le système de test utilisera l'instruction suivante pour déterminer si votre code affiche son propre contenu :
diff --strip-trailing-cr code.cpp out
Cette instruction traite les CRLF en fin de ligne comme des LF, ce qui signifie que vous n'avez pas à vous soucier des sauts de ligne spéciaux lors de l'affichage.
En dehors de cela, cette instruction effectue une comparaison strictement rigoureuse, ce qui signifie que les espaces en fin de ligne et autres caractères d'espacement doivent être parfaitement identiques.
Enfin, le système de test vérifiera si votre code contient des mots-clés à partir de la liste fournie, en utilisant une correspondance de mots entiers. La définition d'une correspondance de mots entiers est que les caractères précédant et suivant la position de correspondance ne sont ni des chiffres, ni des lettres, ni des traits de soulignement. Par exemple, int peut correspondre à (int), mais ne peut pas correspondre à print. La liste des mots-clés est jointe à la fin du problème.
Il est particulièrement important de noter que la limite de temps indiquée n'a pas de sens, la limite réelle est de 1000ms. Si votre code dépasse 1000ms, il sera arrêté de force, mais le temps d'exécution et l'espace mémoire ne seront pas reflétés dans le résultat de l'évaluation.
Notation
Définissez votre score préliminaire $s_0$ :
Peu importe si le code contient des mots-clés, si votre code est un code C++ valide et affiche son propre contenu lors de l'exécution en C++, mais n'est pas un code Python valide, $s_0=2$.
Peu importe si le code contient des mots-clés, si votre code est à la fois un code C++ et Python valide, et affiche son propre contenu lors de l'exécution en C++, mais pas en Python, $s_0=10$.
Peu importe si le code contient des mots-clés, si votre code est à la fois un code C++ et Python valide et affiche son propre contenu dans les deux langages, soit $x$ la longueur de votre code,
$$ 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} $$
- Dans les autres cas, $s_0=0$.
$f(x)$ est une fonction continue. Notez que $s_0$ peut être supérieur à $100$.
Enfin, si votre code ne contient aucun mot-clé, votre score final est $\lfloor\min(100,s_0)\rfloor$, sinon il est $\lfloor\min(70,0.7s_0)\rfloor$.
Liste des mots-clés
Voici la liste des mots-clés 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"
}
Voici la liste des mots-clés 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"
}
Remarque
- La fonction main en C++ peut ne pas définir de type de retour. Ainsi, le code suivant est un code C++ valide :
main(){}