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 apenasa-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.Respostas:
Ruby, 918
Esta questão é bastante longa para o golfe, pois consiste em muitas partes pequenas. Por um momento, eu quase quis definir algumas classes adicionais para tornar as coisas mais limpas com o polimorfismo, etc ... (mas no final não o fiz).
Provavelmente pode ser jogado mais. Mas, a partir de agora, nem consigo acompanhar o que fiz na última linha.
Resultado:
fonte
T-SQL 1919
Chamado com "exec q 'Your command here'" Eu não acho que o T-SQL possa realmente receber a entrada do usuário, então acho que isso é o mais próximo possível.
Usa o utilitário bcp para E / S, que eu nunca havia experimentado antes porque vem com o SQL Server 2014.
Não tenho certeza se seria melhor ou pior usar apenas o procedimento armazenado principal e colocar o restante do código lá.
fonte
Cobra - 1505
Resultado:
fonte
Python 2 - 2205 bytes
Aqui está uma tentativa bastante detalhada de uma solução.
Aqui está uma amostra do aplicativo em uso:
fonte
Lote - 1827
O lote não foi criado para esse tipo de coisa.
Ainda para implementar as funções Classificar (no relatório) e Imprimir.
fonte
STATA 1506
Não tentei jogar golfe demais. Imaginei que uma linguagem estatística seria melhor nisso, mas aparentemente.
fonte
C # -
19521883Mostrarei alguma saída quando chegar amanhã. Por enquanto, aqui está o envio:
fonte
C # -
18701881 bytesAbusando
using
aliases,Action
,Func
, exceções para controle de fluxo e muito mais. Estava considerando explorar esse "relatório" não especificou como as coisas deveriam ser classificadas. Bank.data deve usar quebras de linha unix ou esse código será quebrado.Editado para corrigir um possível problema de classificação por campos diferentes de Data e Saldo.
Resultado:
fonte