Nosso novo banco precisa de um sistema de transações de caixa, mas há um problema. Há apenas algumas centenas de bytes de espaço restantes em nosso servidor, portanto você terá que escrever um código muito compacto.
Base de dados
Felizmente, nosso banco de dados é muito simples (foi construído pelo filho do estudante do nosso presidente do banco), e nós temos apenas alguns clientes até agora.
o arquivo 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
Especificação de aplicação
Nosso aplicativo bancário deve implementar os seguintes comandos:
open <firstname> <lastname>
Cria (abre) uma nova conta imprimindo um número de conta exclusivo de 3 dígitos.
withdraw <account> <amount>
Retirar valor de uma conta.
deposit <account> <amount>
Valor do depósito em uma conta.
close <account>
Feche a conta se estiver vazio.
report <fieldname>
Imprima um relatório do banco de dados classificado por nome do campo. Mova a coluna fieldname para a primeira posição. Cada largura da coluna será o máximo dos dados mais amplos e a largura do nome do campo, separados por um espaço. A primeira linha serão os títulos dos campos. Os saldos devem ser justificados corretamente com um $
sinal à esquerda .
print <account>
Imprima os nomes de campo e registre para esta conta formatada como o relatório.
Cada vez que um registro é alterado, o Date
campo no registro deve ser atualizado para a data atual.
O aplicativo mostrará um "#" prompt ao aguardar um comando. Se um comando falhar (como uma operação em uma conta desconhecida ou com fundos insuficientes), o aplicativo deverá imprimir a mensagem de erro informativa "falhou". O programa deve gravar as alterações novamente no arquivo após cada alteração e ler o arquivo em cada comando, pois existem muitos programas de caixa em todo o mundo operando no arquivo simultaneamente (não precisamos de bloqueio de arquivo - isso pode reduzir o desempenho).
EDIT: Os campos de sequência são ASCII simples (az, AZ, -) sem espaço em branco e o valor sempre estará entre 0,00 e 1000000000,00 (1 bilhão) de dólares com 2 casas decimais indicando centavos. A data será no horário local em cada filial (uma solução simples, mas poderá levar a alguns problemas mais tarde ...).
Resultado
As respostas precisarão demonstrar que atendem às especificações. Anexe a saída do seu programa depois de processar os seguintes comandos:
report Balance
open Clark Kent
print 001
deposit 001 4530
withdraw 105 893
close 105
report Date
Certifique-se de usar uma cópia original do Bank.data
arquivo fornecido acima.
Pontuação
Isso é código-golfe, então sua pontuação será a contagem de bytes do seu código. As brechas padrão são proibidas.
<firstname>
e <lastname>
e o alcance e precisão <amount>
? (Por exemplo, pode haver algumas otimizações possíveis se <amount>
sempre tiver exatamente duas casas decimais - ou você pode desejar que o programa seja utilizável pela filial do Oriente Médio, onde a maioria das moedas usa três casas decimais).
<firstname>
e <lastname>
ambos usam apenas a-zA-Z
, mas mesmo uma declaração simples de que eles nunca contêm caracteres de tabulação permite o uso do TSV. Se eles podem ter qualquer sequência de caracteres ASCII, é necessária alguma forma de escape ou delimitação que não seja com um delimitador de um caractere.