Tout le monde sait que C est un langage de programmation de haut niveau charmant et sûr. Cependant, en tant que codeur, vous définissez la tâche suivante.
Écrivez un programme pour ajouter deux nombres.
- Entrée: deux entiers séparés par des espaces.
- Sortie: La somme des deux nombres dans l'entrée.
La torsion est que votre code doit être sûr à 100%. En d'autres termes, il doit se comporter correctement quelle que soit l'entrée. Si l'entrée est en effet composée de deux entiers séparés par des espaces, tous deux comptant moins de 100 chiffres, elle doit sortir la somme. Sinon, il doit générer un message d'erreur et quitter en toute sécurité.
Cela peut-il être difficile après tout?
Des félicitations générales seront données aux cas d'entrée pathologiques qui cassent les réponses des autres :)
Le code doit être compilé sans avertissement en utilisant gcc -Wall -Wextra sur ubuntu.
Clarification.
- L'entrée provient de stdin.
- L'espace horizontal n'est qu'un seul caractère d'espace. Il ne doit rien y avoir avant le premier numéro et l'entrée doit se terminer par un saut de ligne + EOF ou simplement EOF.
- la seule entrée valide, spécifiée dans le formulaire Backus-Naur augmenté , est:
NONZERODIGIT = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" POSITIVENUMBER = NONZERODIGIT * 98DIGIT NEGATIVENUMBER = "-" POSITIVENUMBER NUMBER = NEGATIVENUMBER / POSITIVENUMBER / "0" VALIDINPUT = NUMBER SP NUMBER * 1LF EOF
- Le message d'erreur est la lettre unique «E», suivie d'une nouvelle ligne.
- Le code doit se terminer proprement en moins de 0,5 seconde, quelle que soit l'entrée.
Réponses:
6610 octets (non réduit)
Programme «Good boy» C qui répond à tous les critères de défi. Utilise un complément de 10 pour les nombres négatifs. Également inclus, un harnais de test et des cas de test.
Voici un petit harnais de test et quelques cas de test pour vous aider à démarrer. N'hésitez pas à éliminer l'utilisation excessive de perl. Le système sur lequel il a été développé n'avait pas de bash moderne.
Un petit ensemble de cas de test:
la source
bc
une réponse séparée.289
EDIT : ce code ne fonctionne que pour les entiers positifs. Les règles ont changé depuis que je poste cette réponse.
Version non golfée et commentée:
la source
./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)
par(s>99||c<48||c>57)
corriger ça?442
Il est assez long, donc je pourrai le jouer plus loin pendant le week-end. Suppose que l'entrée provient de stdin, terminée par EOF (sans nouvelle ligne), le séparateur n'est qu'un caractère de la valeur ASCII 32 (c'est-à-dire,
' '
caractère).Le message d'erreur sera un seul caractère «E», suivi d'une nouvelle ligne.
Avec des nouvelles lignes et un peu d'indentation ajoutées: (une version lisible suit, alors n'hésitez pas à passer ici)
La version lisible (certaines instructions sont légèrement modifiées pour la rendre plus lisible, mais ce qu'elles font devrait être le même):
La
goto fail;
chose est ici pour se moquer d'Apple.La version de gcc que j'ai utilisée est
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
, et il n'y a aucun avertissement.la source
getchar()
obtient toujours de stdin). Il est supposé se terminer par EOF sans nouvelle ligne . Vous pouvez tester cela, soit en entrant [1] [espace] [1] [Ctrl + D] [Ctrl + D], ouecho -n '1 1' | program
633 octets
Programme «Bad boy» C qui relève la moitié du défi. Abuse C, lance de nombreux avertissements, mais fonctionne ... en quelque sorte. L'arithmétique de précision arbitraire est en fait effectuée par
bc
.Version non minimisée
la source