Stock Time Machine
Você obteve acesso a um conjunto de dados, tomorrowStocks
que contém os preços das ações da sua empresa favorita na NASDAQ. Este conjunto de dados é um contêiner indexado por minutos após a abertura. Cada índice contém o preço das ações naquele momento.
// Assume the stock market opens at 9:30AM EDT
// tomorrowStocks[] contains the prices of your target stock.
// If the stock is $22 @ 10:30AM EDT
tomorrowStocks[60] == 22
Saída
Sua tarefa é determinar o melhor resultado possível de 1 purchase
e da partir do conjunto de dados fornecido.1 sale
1 stock
Gotchas
- Você deve comprar e vender exatamente 1 ação.
- Você não pode comprar e vender no mesmo horário.
- Você deve comprar antes de vender.
Dados de teste
[1,2,3,4,5] # 4
[1,99,2,105] # 104
[99,1,99,100] # 99
[99,1,1,2,1,3] # 2
[5,4,3,3,1] # 0
[5,4,3,1] # -1
[5,2,1] # -1
[5,4,1] # -1
[55,45,20,1] # -10
[5,1] # -4
[10,7,5,1] # -2
[7] # Invalid input -- assume size >= 2
Este é um código de golfe ; envie a resposta mais curta no seu idioma favorito!
code-golf
math
array-manipulation
MrDuk
fonte
fonte
[5,4,3,1]
você pode mas para5
e vender para4
ou comprar para4
e vender para3
obter o resultado ideal de-1
.Respostas:
05AB1E , 4 bytes
Usando a abordagem de FryAmTheEggman . Código:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
Python 2, 46 bytes
Teste em Ideone .
Como funciona
Essa é uma abordagem recursiva que tira proveito das comparações de tipo misto maravilhosamente perversas do Python 2.
O melhor resultado possível é a diferença do máximo da lista com o primeiro elemento removido e o primeiro elemento, ou outra diferença que não envolve o primeiro elemento.
Depois de extrair o primeiro elemento com
x.pop(0)
(que o remove permanentemente de x ), calculamosx.pop(0)-max(x)
. Observe que essa diferença tem o sinal "errado".Se a lista atualizada x ainda contém pelo menos dois elementos,
x[1:]
gera uma lista não vazia e aand
substitui pelo negativo de uma chamada recursiva, calculada como-f(x)
. Quando houver muito poucos elementos para continuar, ele seráx[1:]and-f(x)
avaliado como uma lista vazia.Para selecionar o resultado máximo, assumimos o mínimo da diferença e o negativo da chamada recursiva (ou
[]
). Como todos os números inteiros são estritamente menores que[]
,min
simplesmente retornará seu argumento à esquerda se o direito for[]
.Finalmente, o unário menos
-
corrige o sinal do resultado calculado.fonte
MATL , 7 bytes
Experimente online! Ou verifique todos os casos de teste .
fonte
Gelatina , 5 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
IŒṡS€Ṁ
Quase do mesmo tamanho, é muito ruim fazer o usoṀ
antes de somar, às vezes, dá a resposta errada ...Pitão, 9
Experimente aqui ou execute um conjunto de testes .
Localiza as diferenças consecutivas entre cada elemento e localiza cada substring dessa matriz. Por fim, some os elementos e retorne o máximo.
Explicação:
Foi mencionado para mim que esse algoritmo funciona não é totalmente intuitivo. Espero que este exemplo ilustre por que esse algoritmo funciona:
fonte
Pitão, 9
Yay pfns!
fonte
_hS-M.cQ2
é equivalente.-
a ordem dos argumentos ... já que tenho que usar_hS
e não posso usar #eS
PowerShell v2 +, 58 bytes
Recebe entrada
$n
, canaliza cada elemento em um loop|%{...}
. A cada iteração, dividimos com$n
base no pré-incrementado++$i
até o final da matriz de entrada,|sort
que , pegamos o máximo[-1]
e subtraímos o elemento atual$_
. Em seguida,|sort
todas essas diferenças e, novamente, tomamos o máximo[-1]
.Lança um erro detalhado do índice da matriz, porque tentamos passar além do final da matriz. Mas, como STDERR é ignorado por padrão , não nos importamos.
fonte
JavaScript (ES6),
5754 bytesNo JavaScript, é mais fácil tirar o máximo do restante da matriz e subtrair o elemento atual. (No caso do último elemento, o resultado ainda será -Infinity.) Editar: salvou 3 bytes graças a @CharlieWynn.
fonte
with
(o que não ajuda neste caso).J, 21 bytes
Pega uma matriz de valores como argumento e retorna o resultado.
Explicação
fonte
Java, 141 bytes
O lambda aceita um ArrayList e retorna um número inteiro.
Código não protegido com casos de teste:
Até onde eu sei, Java não tem uma maneira de olhar adiante em um fluxo, e manipular o método a partir do qual o fluxo é gerado produz resultados estranhos. Assim, fazer
a.remove(0)
dentro de um mapa interrompe terrivelmente o fluxo.fonte
VBA, 154
Recebe a entrada na coluna A começando em A1, sai em C1. Deve ser executado com a última célula em A selecionada. Observe que o Excel adiciona automaticamente os espaços entre os termos no VBA; caso contrário, isso pode ser mais prejudicado.
fonte
Java, 116
Outra solução java, usei esta para provar que, os fluxos podem parecer bons, mas nem sempre são úteis para jogar golfe.
há muito espaço para melhorias nesta solução
fonte
Clojure, 99 bytes
Divide a lista de entrada na primeira posição, depois na segunda e assim por diante, para obter uma lista parecida com esta:
[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]
em seguida, para cada par, subtraia o mínimo dos primeiros elementos do máximo do segundo elemento e encontre o máximo deles. Seria mais curto se o Clojuremin
max
estivesse pegando seqüências em vez de qualquer número de argumentos.Veja on-line: https://ideone.com/b2nllT
fonte
rubi, 52 bytes
aparece os preços de venda possíveis e analisa todos os itens anteriores para encontrar lucro. Então obtém lucro máximo.
fonte
C,
10199 bytesEntrada: matriz terminada nula. Por exemplo: {1,2,3,4,5,0}
Saída: retorna o melhor resultado
Você pode salvar 8 bytes (
9391 total) se nunca quiser perder dinheiro:fonte
R,
5844 bytesdestroçado
EDIT: função alterada. original abaixo.
ou, se você estiver disposto a aceitar várias mensagens de aviso, livre-se do -2 após o comprimento, por 56 bytes.
E se você sentir vontade de não negociar e perder dinheiro quando essa é a única possibilidade, você pode chegar a 52
fonte
f=
não é necessário.