História
Há muito tempo, Bobby criou uma carteira de Bitcoin com 1 Satoshi (1e-8 BTC, a menor unidade monetária) e a esqueceu. Como muitos outros, mais tarde ele pensou: "Droga, se eu investisse mais naquela época ...".
Sem parar de sonhar acordado, ele dedica todo seu tempo e dinheiro à construção de uma máquina do tempo. Ele passa a maior parte do tempo em sua garagem, sem saber dos assuntos mundanos e dos rumores que circulam sobre ele. Ele conclui o protótipo um dia antes de sua eletricidade estar prestes a ser desligada devido a pagamentos perdidos. Erguendo os olhos da bancada, vê uma van da polícia estacionando em sua casa, parece que os vizinhos intrometidos pensavam que ele estava dirigindo um laboratório de metanfetamina em sua garagem e chamou a polícia.
Sem tempo para executar testes, ele pega um pendrive com os dados de taxa de câmbio dos últimos anos, conecta o capacitor de fluxo ao discombobulador quântico e se vê transportado de volta ao dia em que criou sua carteira
Tarefa
Dados os dados da taxa de câmbio, descubra quanto dinheiro Bobby pode ganhar. Ele segue uma regra muito simples: "Compre na baixa - venda na alta" e, como ele começa com um capital infinitesimalmente pequeno, assumimos que suas ações não terão impacto nas taxas de câmbio no futuro.
Entrada
Uma lista de valores flutuantes> 0, como uma sequência separada por um único caractere (nova linha, guia, espaço, ponto e vírgula, o que você preferir) transmitida como argumento de linha de comando para o programa, lida de um arquivo de texto ou STDIN ou passada como parâmetro para uma função. Você pode usar tipos de dados numéricos ou matrizes em vez de uma sequência, porque é basicamente apenas uma sequência com colchetes.
Saída
O fator pelo qual o capital da Bobbys se multiplicou até o final da negociação.
Exemplo
Input: 0.48 0.4 0.24 0.39 0.74 1.31 1.71 2.1 2.24 2.07 2.41
Taxa de câmbio: 0,48 $ / BTC, já que está prestes a cair, vendemos todos os Bitcoins por 4,8 nanodólares. Fator = 1 Taxa de câmbio: 0,4, não faça nada
Taxa de câmbio: 0,24 $ / BTC e subida: converta todos os $ em 2 Satoshis. Fator = 1 (o valor do dólar ainda permanece inalterado)
Taxa de câmbio: 0,39 - 2,1 $ / BTC: não faça nada
Taxa de câmbio: 2,24 $ / BTC: venda tudo antes da queda. 44,8 nanodólares, fator = 9,33
Taxa de câmbio: 2,07 $ / BTC: compra 2,164 Satoshis, fator = 9,33
Taxa de câmbio: 2,41 $ / BTC: compra 52,15 nanodólares, fator = 10,86
Output: 10.86
Detalhes adicionais
Você pode ignorar casos extremos estranhos, como entrada constante, valores zero ou negativos, apenas um número de entrada, etc.
Fique à vontade para gerar seus próprios números aleatórios para testar ou usar gráficos de ações reais. Aqui está uma entrada mais longa para teste (saída esperada aprox. 321903884.638)
Explique brevemente o que seu código faz
Gráficos são apreciados, mas não são necessários
fonte
Respostas:
APL, 16 caracteres
Esta versão utiliza @Frxstrem 's mais simples algoritmo e @xnor ' s
max(r,1)
idéia.Ele também assume que a série está aumentando globalmente, ou seja, o primeiro valor do bitcoin é menor que o último. Isso é consistente com a descrição do problema. Para obter uma fórmula mais geral, as primeiras taxas devem ser descartadas, adicionando 2 caracteres:
{×/1⌈÷/⊃1↓⍵,¨¯1⌽⍵}
Exemplo:
Explicação:
Comece com os dados da taxa de câmbio:
Emparelhe cada número com o anterior (o primeiro será emparelhado com o último) e coloque-os em uma matriz:
Reduza cada linha por divisão, mantenha aquelas com razão> 1 e combine as proporções por multiplicação. Isso eliminará todos os fatores repetidos consecutivos de taxas crescentes sucessivas, bem como a proporção espúria entre a primeira e a última taxa de câmbio:
fonte
Python, 47
Exemplo executado no caso de teste .
Faça uma lista de carros alegóricos. Multiplica-se recursivamente no fator de lucro dos dois primeiros elementos até restarem menos de dois elementos. Para o caso base, dá
True
qual é igual1
.Usar
pop
fornece o mesmo número de caracteres.O mesmo acontece no final da lista.
Para comparação, meu código iterativo no Python 2 tem 49 caracteres, 2 caracteres a mais
Começando com
c=-1
é um truque para fazer o primeiro "movimento" imaginário nunca mostrar lucro. Iniciar o produto em-1
vez de1
nos permitir atribuir os dois elementos juntos, e nós o devolvemos gratuitamente antes de imprimir.fonte
([n:(n+1)*500 + 1] for n in range(N_elem/500) )
e multiplicar os fatores parciaissys.setrecursionlimit
(no CPython)Python,
79817677 bytesx
é a entrada codificada como uma lista. A função retorna o fator.fonte
1.
vez de1
no final da função, caso contrário, recebo TypeError: o descritor ' mul ' requer um objeto 'float' mas recebeu um 'int'f=
parte.CJam, 33 bytes
Isso pode ser jogado ainda mais.
Recebe entrada de STDIN, como
e gera o fator para STDOUT, como
Experimente online aqui
fonte
Pyth , 18
Explicação:
max(H[1]/H[0],1)
ideia graças a @xnorfonte
C #,
333, 313Minha primeira tentativa. Provavelmente poderia otimizá-lo mais, mas como eu disse na primeira tentativa, o problema será resolvido !.
Entrada
Saída
Edit: Obrigado DenDenDo por sugerir não usar math.floor para arredondar e usar int em vez de bool para cortar caracteres. Lembre-se disso para futuros quebra-cabeças!
fonte
Math.Floor(...)
quais não é necessário. Além disso, eu não sei se é possível em c #, mas geralmente você pode usar 1 e 0 paratrue
efalse
.