La nostra nuova banca ha bisogno di un sistema di transazione di cassiere ma c'è un problema. Sul nostro server rimangono solo poche centinaia di byte di spazio, quindi dovrai scrivere un codice molto compatto.
Banca dati
Per fortuna il nostro database è molto semplice (è stato creato dal figlio dello scolaro del nostro presidente di banca) e finora abbiamo solo pochi clienti.
il file Bank.dataè:
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
Specifiche dell'applicazione
La nostra applicazione bancaria deve implementare i seguenti comandi:
open <firstname> <lastname>
Crea (apre) un nuovo account stampando un numero di account univoco a 3 cifre.
withdraw <account> <amount>
Preleva l'importo da un conto.
deposit <account> <amount>
Importo del versamento su un conto.
close <account>
Chiudi l'account se vuoto.
report <fieldname>
Stampa un rapporto del database ordinato per nome campo. Sposta la colonna fieldname nella prima posizione. Ogni larghezza di colonna sarà il massimo dei dati più ampi e la larghezza del nome campo, separati da uno spazio. La prima riga saranno i titoli dei campi. Solo i saldi devono essere giustamente giustificati con un $segno guida .
print <account>
Stampa i nomi dei campi e registra per questo account formattato come il rapporto.
Ogni volta che un record viene modificato, il Datecampo nel record deve essere aggiornato alla data corrente.
L'applicazione mostrerà un prompt "#" durante l'attesa di un comando. Se un comando fallisce (come un'operazione su un conto sconosciuto o fondi insufficienti), l'applicazione deve stampare il messaggio di errore informativo "non riuscito". Il programma deve riscrivere le modifiche al file dopo ogni modifica e leggere dal file su ciascun comando in quanto vi sono molti programmi di cassiere in tutto il mondo che operano contemporaneamente sul file (non è necessario il blocco dei file, il che può ridurre le prestazioni).
EDIT: i campi stringa sono semplici ASCII (az, AZ, -) senza spazi bianchi e l'importo sarà sempre compreso tra 0,00 e 1000000000,00 (1 miliardo) di dollari con 2 cifre decimali che indicano centesimi. La data sarà in ora locale in ogni filiale (una soluzione semplice ma potrebbe portare ad alcuni problemi in seguito ...).
Produzione
Le risposte dovranno dimostrare di soddisfare le specifiche. Allegare l'output dal programma dopo aver elaborato i seguenti comandi:
report Balance
open Clark Kent
print 001
deposit 001 4530
withdraw 105 893
close 105
report Date
Assicurati di utilizzare una copia originale del Bank.datafile sopra indicato.
punteggio
Questo è code-golf, quindi il tuo punteggio sarà il conteggio dei byte del tuo codice. Sono vietate le scappatoie standard.
<firstname>e <lastname>e sull'intervallo e la precisione di <amount>? (Ad esempio, potrebbero esserci delle ottimizzazioni che sono possibili se <amount>ha sempre esattamente due posizioni decimali - oppure potresti volere che il programma sia utilizzabile dalla filiale mediorientale, dove la maggior parte delle valute usa tre posizioni decimali).
<firstname>ed <lastname>entrambi usano solo a-zA-Z, ma anche una semplice affermazione che non contengono mai caratteri di tabulazione consente l'uso di TSV. Se possono essere una sequenza di caratteri ASCII, è necessaria una forma di escape o delimitazione diversa da quella con un delimitatore a un carattere.