¿Es posible que mi código haya producido respuestas incorrectas para algunos datos ingresados, pero los sitios web de competencia de programación (como CodeChef, TopCoder, HackerRank) no pueden detectarlos y aceptar mi código?

Sucede. Y creo que sucede mucho más a menudo de lo que la mayoría de ustedes piensan.

En primer lugar, truco fácil para su pregunta: escriba una solución correcta y haga que falle solo un caso de prueba: agregue a su código algo como si (n == 11241251) do_something_wrong ();

Estrictamente hablando, esta solución ya es incorrecta para algunos datos de entrada (tal vez para uno solo), pero fallará solo si dicha prueba se presenta en el conjunto de datos. En la mayoría de los problemas, no todas las entradas posibles están cubiertas por datos de prueba, por lo tanto, tal truco es posible. No tiene mucho sentido, pero formalmente es lo que estaba preguntando.

Otra cosa para pensar es usar algoritmos aleatorios. Los concursantes a menudo usan algoritmos que fallan en algunos casos, o en la mayoría de los casos, o incluso en todos los casos, con una probabilidad fija muy pequeña. Si su solución produce una respuesta incorrecta con probabilidad 1e-50, definitivamente es posible que falle; pero espera que esta solución obtenga CA, estos 1e-50 son insignificantemente pequeños.

Y también sucede a menudo que el algoritmo determinista que usted escribió está fallando en muchos casos de prueba, pero obtiene AC. Creo que esta es la parte más cercana al significado previsto de su pregunta. Créeme, sucede a menudo. A menudo sucede cuando algunos principiantes preparan el concurso para otros principiantes. Pero incluso en concursos serios, sigue siendo un problema común.

Ya tengo algo de experiencia trabajando en un concurso como probador; Te diré que muy a menudo cuando el autor piensa que los casos de prueba ya son lo suficientemente buenos, o incluso cuando el autor y el evaluador piensan de esta manera, resulta que están equivocados y, de hecho, las pruebas deben mejorarse mucho 🙂 Incluso si tiene una buena experiencia con la redacción de soluciones difíciles / hacky por su cuenta, nunca podrá adivinar todos los trucos / hacks / heurísticas que se le ocurrirán a otras personas.

¿Por qué no sabemos sobre problemas con los casos de prueba que son débiles? A menudo, nadie escribe una solución que está mal pero pasa todas las pruebas dadas; y cuando las personas tienen tales soluciones, a menudo no se dan cuenta del hecho de que sus soluciones son incorrectas; y cuando lo entienden, a menudo no quieren hacerlo público debido a algunas razones (no quieren molestar o dañar al autor, sienten vergüenza de obtener AC para una solución incorrecta, etc.), pueden decirle al problema al respecto en una conversación privada o no se lo digas a nadie.

Por cierto, Michal Danilák contó una historia interesante en su respuesta a esta pregunta: ¿es útil la fase de desafío en TopCoder?

Y sobre mi experiencia … Tengo la experiencia de escribir una solución aleatoria con solo un 80% de posibilidades de aprobación. Tengo la experiencia de escribir una solución para un problema en un concurso internacional in situ en el que tuve que codificar el caso de muestra para obtener AC; resultó que mi solución de geometría es lo suficientemente precisa para todas las demás pruebas en el conjunto de datos, excepto la muestra (que no era de hecho, el peor de los casos para esta solución). Tengo una experiencia de escribir 5 soluciones para una tarea, las 5 dan diferentes respuestas para la misma prueba, pero las 5 reciben AC. Vi un concurso regional donde las soluciones oficiales de los creadores de problemas estaban equivocadas, pero estaban pasando todas las pruebas de un conjunto utilizado en el concurso. Vi un problema en CodeForces donde la entrada es un solo número de hasta unos pocos miles, y sin embargo, mi solución de CA funcionaba mal durante unas pocas docenas de números, y al cambiar algunas constantes logré obtener la solución de CA que estaba fallando ~ 7 % de todos los casos de prueba posibles (por lo que era natural esperar que fallara incluso un conjunto de pruebas aleatorias con un número relativamente grande de pruebas). Entonces confía en mí, sucede. Sucede a menudo.

Definitivamente posible. Y como dijo Bohdan Pryshchenko, sucede con bastante frecuencia.

Por lo que he visto, hay otro error de concurso más frecuente que este. Es decir, se acepta una solución optimizada de fuerza bruta que se suponía que debía superar el límite de tiempo.

Recuerdo un incidente en particular. Uno de mis amigos no pudo resolver un problema en las fuerzas de código. Ese problema fue presentado por muchas personas durante el concurso. Después de que terminó el concurso, vio su código. La mayoría de las soluciones eran fuerza bruta simple y deberían obtener TLE. Pero para su sorpresa, gran parte de las presentaciones de fuerza bruta pasaron la prueba del sistema. Luego envió un mensaje al autor del problema explicando la situación. El autor respondió: “La aceptación de soluciones TLE no es genial, pero no es una tragedia “.

Esta situación es peor en problemas de puntaje parcial. Muchas veces, he visto soluciones de fuerza bruta obteniendo 70 – 80% de puntos.

A pesar de esto, sugeriré no enviar fuerza bruta / soluciones incorrectas con la esperanza de que el autor haya cometido un error. Las situaciones que mencioné aquí son ejemplos extremos. Además, la mayoría de las veces el error es para uno o dos casos particulares. Los que pasan son muy afortunados.


Gracias por pedirme una respuesta.

En realidad sucede a veces. El año pasado, en el Concurso Regional Latinoamericano ACPC ICPC, hubo un equipo que respondió incorrectamente a un problema porque no manejaron correctamente el caso X = 0. No recuerdo los detalles exactos de lo que sucedió, pero la idea era siguiente: cuando X = 0, cambiaron 0 por un número muy aleatorio, y ese número no apareció nuevamente en la entrada, por lo que el problema fue aceptado pero el código era incorrecto, porque si ese número era parte de la entrada habrían fallado ese caso de prueba.

También hay otro caso posible. Digamos que tiene un problema de geometría que involucra derivadas, puede rotar el plano en un número aleatorio de grados con decimales incluidos para que siempre tenga una derivada válida y nunca tenga una línea vertical.

El problema con estas estrategias es cuando tienes una fase de desafío como en TopCoder o CodeForces donde otros concursantes pueden encontrar tu caso específico y hacer que tu código falle.

Dicho todo esto: los creadores de problemas para este tipo de concursos generalmente presentan casos de prueba muy buenos, ya que tienen mucho tiempo para pensar en casos esquineros y no solo 2 o 5 horas, como el concursante para pensar en varios problemas.

Gracias por el A2A!

Como han dicho otros, es posible si los casos de prueba no prueban todo el dominio de la entrada.

Un momento interesante cuando sucedió: en el problema Kamehameha en Codechef OCT13 Long concurso. El problema era bipartito, pero las personas lograron escribir soluciones codiciosas que pasaron las pruebas. ¡Tienen que cambiar las cajas de prueba dos veces para eliminar las soluciones codiciosas!

Hola, sí, es posible, pero sucede muy raramente.
Hay dos enfoques para probar el código para muchas plataformas:
primero se prepara una gran cantidad de pruebas, que cubren casi todos los casos especiales de comportamiento del algoritmo (entrada habitual, entrada extrema : valores mínimos y máximos, nulos, etc.), por ejemplo, si en alguna etapa del cálculo tiene que dividir, proporcionarán Divide cero para comprobar si verifica la corrección de entrada.
el segundo enfoque se usa raramente y se usa para verificar algoritmos simples: el sistema ejecuta su código y pasa argumentos generados al azar. En este caso, si tiene dos argumentos enteros, puede obtener cualquier valor del rango -2 ^ 15 + 1 a + 2 ^ 15-1; y la probabilidad de que rompa su algoritmo con errores es mayor.
Por ejemplo, tienes que sumar dos enteros. usted escribió en su programa que si el primer argumento es 3 y el segundo 9, no los sume y devuelva 0. con el primer enfoque de prueba sería imposible descubrir este error si no hay pruebas preparadas para 3 y 9, pero La segunda prueba teóricamente encontrará este error.
Por otro lado, si tiene que encontrar el índice de un elemento en la secuencia de Fibonacci que obtuvo como argumento, el sistema no solo puede pasar la entrada generada al azar, sino que debe haber preparado pruebas con exclusión como para 1, puede devolver el índice 1 y 2 y ambos son correctos.
Para ser honesto, no tengo experiencia en enviar algoritmos con errores y obtener puntaje por ello.

Sí, creo que puede suceder, pero eso es realmente raro.
Si olvidó un caso de esquina pero no está en los datos de prueba, obtendrá AC incluso si su programa no es completamente correcto.
Pero normalmente, los datos de prueba son muy completos (con grandes casos de prueba y casos de esquina).

Si tiene AC en un problema y encuentra una prueba en la que su programa está equivocado, probablemente sea porque su prueba no se ajusta exactamente a los requisitos del problema. Ya tuve eso 1 o 2 veces.