Todos saben que C es un lenguaje de programación encantador, seguro y de alto nivel. Sin embargo, usted, como codificador, establece la siguiente tarea.
Escribe un programa para sumar dos números.
- Entrada: dos enteros separados por espacios.
- Salida: la suma de los dos números en la entrada.
El giro es que su código debe ser 100% seguro. En otras palabras, debe comportarse correctamente sin importar la entrada. Si la entrada es de hecho dos enteros separados por espacios, los cuales tienen menos de 100 dígitos, debe generar la suma. De lo contrario, debe generar un mensaje de error y salir con seguridad.
¿Qué tan difícil puede ser después de todo?
Se darán felicitaciones generales a los casos de aportes patológicos que rompan las respuestas de otras personas :)
El código debe compilarse sin advertencias utilizando gcc -Wall -Wextra en ubuntu.
Aclaración.
- La entrada es de stdin.
- El espacio en blanco horizontal es solo un carácter de espacio único. No debe haber nada antes del primer número y la entrada debe terminarse con newline + EOF o simplemente EOF.
- La única entrada válida, especificada en el formulario Backus-Naur aumentado , es:
NONZERODIGIT = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" POSITIVENUMBER = NONZERODIGIT * 98DIGIT NEGATIVENUMBER = "-" POSITIVENUMBER NÚMERO = NEGATIVENUMBER / POSITIVENUMBER / "0" VALIDINPUT = NUMBER SP NUMBER * 1LF EOF
- El mensaje de error es la letra única 'E', seguida de una nueva línea.
- El código debe terminar limpiamente en menos de 0.5s sin importar cuál sea la entrada.
Respuestas:
6610 bytes (sin minificar)
Programa "Good boy" C que cumple con todos los criterios de desafío. Utiliza el complemento de 10 para números negativos. También se incluye un arnés de prueba y casos de prueba.
Aquí hay un pequeño arnés de prueba y algunos casos de prueba para comenzar. Siéntase libre de arrancar el uso excesivo de perl. El sistema en el que se desarrolló no tenía una fiesta moderna.
Un pequeño conjunto de casos de prueba:
fuente
bc
para separar la respuesta.289
EDITAR : Este código funciona solo para enteros positivos. Las reglas han cambiado desde que publico esta respuesta.
Versión no comentada y comentada:
fuente
./tmp.c: In function ‘f’: ./tmp.c:3:1: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] ./tmp.c:3:1: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] ./tmp.c: In function ‘main’: ./tmp.c:3:1: warning: control reaches end of non-void function [-Wreturn-type]
(s>99|c<48|c>57)
por(s>99||c<48||c>57)
arreglar eso?442
Es bastante largo, así que puedo jugar golf durante el fin de semana. Asume que la entrada es desde stdin, terminada en EOF (sin nueva línea), el separador es solo un carácter de valor ASCII 32 (es decir,
' '
carácter).El mensaje de error será un solo carácter 'E', seguido de una nueva línea.
Con nuevas líneas y un poco de sangría agregada: (sigue una versión legible, así que siéntase libre de saltar aquí)
La versión legible (algunas declaraciones están ligeramente alteradas para que sea más legible, pero lo que hacen debería ser lo mismo):
La
goto fail;
cosa está aquí para burlarse de Apple.La versión de gcc que utilicé es
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
, y no hay advertencias.fuente
getchar()
siempre se obtiene de stdin). Se supone que tiene terminación EOF sin nueva línea . Puede probar esto, ya sea ingresando [1] [espacio] [1] [Ctrl + D] [Ctrl + D] oecho -n '1 1' | program
633 bytes
Programa "Bad boy" C que cumple con la mitad del desafío. Abusa de C, lanza muchas advertencias, pero funciona ... más o menos. La aritmética de precisión arbitraria en realidad se realiza mediante
bc
.Versión no minificada
fuente