Notre nouvelle banque a besoin d'un système de transaction de guichet, mais il y a un problème. Il ne reste que quelques centaines d'octets d'espace sur notre serveur, vous devrez donc écrire du code très compact.
Base de données
Heureusement, notre base de données est très simple (elle a été construite par le fils d'écolier de notre président de banque), et nous n'avons pour l'instant que quelques clients.
le fichier Bank.dataest:
Account Firstname Lastname Balance Date
123 Maree Jones 346.22 2014-12-13
035 Thomas Breakbone 3422.02 2015-01-03
422 Henrietta Throsby-Borashenko 277847.74 2014-11-21
501 Timmy Bongo 7.95 2014-11-04
105 William Greene 893.00 2015-01-06
300 Mary Galoway 1228.73 2014-12-28
203 Samantha Richardson 2055.44 2014-11-01
151 Bruce Wayne 956119.66 2014-10-09
166 Chip Stonesmith 266.71 2014-12-15
888 Alexandria Cooper 1299.82 2014-12-30
Spécifications d'application
Notre application bancaire doit implémenter les commandes suivantes:
open <firstname> <lastname>
Crée (ouvre) un nouveau compte imprimant un numéro de compte unique à 3 chiffres.
withdraw <account> <amount>
Retirer le montant d'un compte.
deposit <account> <amount>
Déposer le montant dans un compte.
close <account>
Fermez le compte s'il est vide.
report <fieldname>
Imprimez un rapport de la base de données trié par nom de champ. Déplacez la colonne fieldname à la première position. Chaque largeur de colonne sera le maximum de la largeur de données et de nom de champ la plus large, séparée par un espace. La première ligne sera les titres des champs. Seuls les soldes doivent être justifiés à droite par un $signe de tête .
print <account>
Imprimez les noms de champs et enregistrez pour ce compte au format comme le rapport.
Chaque fois qu'un enregistrement est modifié, le Datechamp de l'enregistrement doit être mis à jour à la date actuelle.
L'application affichera une invite "#" lors de l'attente d'une commande. Si une commande échoue (telle qu'une opération sur un compte inconnu ou des fonds insuffisants), l'application doit imprimer le message d'erreur informatif "a échoué". Le programme doit réécrire les modifications dans le fichier après chaque modification et lire à partir du fichier sur chaque commande car il existe de nombreux programmes de caissier dans le monde qui fonctionnent simultanément sur le fichier (nous n'avons pas besoin de verrouillage de fichier - cela peut réduire les performances).
EDIT: les champs de chaîne sont de simples ASCII (az, AZ, -) sans espace blanc et le montant sera toujours compris entre 0,00 et 1000000000,00 (1 milliard) de dollars avec 2 décimales indiquant les cents. La date sera en heure locale dans chaque agence (une solution simple mais qui peut entraîner des problèmes plus tard ...).
Production
Les réponses devront démontrer qu'elles répondent aux spécifications. Veuillez joindre la sortie de votre programme après avoir traité les commandes suivantes:
report Balance
open Clark Kent
print 001
deposit 001 4530
withdraw 105 893
close 105
report Date
Assurez-vous d'utiliser une copie originale du Bank.datafichier ci-dessus.
Notation
Il s'agit de code-golf, donc votre score sera le nombre d'octets de votre code. Les failles standard sont interdites.
<firstname>et <lastname>et sur la plage et la précision de <amount>? (Par exemple, il peut y avoir des optimisations qui sont possibles si elles ont <amount>toujours exactement deux décimales - ou vous pouvez souhaiter que le programme soit utilisable par la branche du Moyen-Orient, où la plupart des devises utilisent trois décimales).
<firstname>et les <lastname>deux n'utilisent que a-zA-Z, mais même une simple déclaration qu'ils ne contiennent jamais de caractères de tabulation permet d'utiliser TSV. S'ils peuvent être n'importe quelle séquence de caractères ASCII, une forme d'échappement ou de délimitation autre qu'avec un délimiteur à un caractère est nécessaire.