O desafio é encontrar o número máximo que você pode obter de uma lista de números inteiros usando operadores aritméticos básicos (adição, subtração, multiplicação, negação unária)
Entrada
Uma lista de números inteiros
Resultado
O resultado máximo usando todos os números inteiros na entrada.
A ordem de entrada não importa, o resultado deve ser o mesmo.
Você não precisa produzir a operação completa, apenas o resultado.
Exemplos
Input : 3 0 1
Output : 4 (3 + 1 + 0)
Input : 3 1 1 2 2
Output : 27 ((2+1)*(2+1)*3))
Input : -1 5 0 6
Output : 36 (6 * (5 - (-1)) +0)
Input : -10 -10 -10
Output : 1000 -((-10) * (-10) * (-10))
Input : 1 1 1 1 1
Output : 6 ((1+1+1)*(1+1))
Regras
O código mais curto vence
Aplicam-se "brechas" padrão
Você pode usar apenas operadores + * (adição, multiplicação, subtração, negação unária)
O código deve funcionar desde que o resultado possa ser armazenado em um número inteiro de 32 bits.
Qualquer comportamento de estouro depende de você.
Espero que isso esteja claro o suficiente, esta é minha primeira sugestão de desafio do Code Golf.
fonte
Respostas:
C - 224 bytes - Tempo de execução O (n)
Foi divertido ver apenas soluções de tempo exponencial para um problema de tempo linear, mas suponho que era a maneira lógica de prosseguir, pois não havia pontos de bônus por realmente ter um algoritmo, que é um anagrama de logaritmo.
Depois de converter números negativos em positivos e descartar zeros, claramente estamos interessados principalmente na multiplicação. Queremos maximizar o logaritmo do número final.
log (a + b) <log (a) + log (b), exceto quando a = 1 ou b = 1, então esse é o único caso em que estamos interessados em adicionar algo. Em geral, é melhor adicionar 1 a um número menor, porque isso causa um aumento maior no logaritmo, ou seja, um aumento percentual maior do que adicionar 1 a um número grande. Existem quatro cenários possíveis, ordenados do mais ao menos preferível, para utilização dos seguintes:
O programa monitora o número de unidades, o número de dois e o número mínimo maior que 2 e desce a lista das maneiras mais ou menos preferíveis de usá-las. Por fim, multiplica todos os números restantes.
fonte
Haskell, 126 caracteres
isso é apenas uma força bruta, com exceção de ignorar o sinal da entrada e de subtração e negação unária.
esse código é extremamente lento. o código calcula recursivamente f em cada subsequência da entrada quatro vezes (exceto [] e a própria entrada) . mas ei, é código de golfe.
fonte
SWI-Prolog - 250
Oh garoto, eu gastei muito tempo nisso.
Chamado a partir da linha de comando (por exemplo):
(Por nenhuma razão específica, achei incrível que os nomes das minhas funções de golfe escrevessem "pote de tomate".)
Versão não destruída:
Explicação:
ignore
ou\+
) para permitir que o predicado retornetrue
e continue.is
e depois escreva-o.fonte
Scala, 134
Ungolfed & comentou:
Uma abordagem um pouco diferente, ao perceber que a maior resposta sempre pode ser expressa como um produto de somas.
Tão perto, mas um monte de estupidez de biblioteca (permutações retorna um Iterator em vez de uma Seq, inferência de tipo horrível em sequências vazias, Array.update retornando Unit) me ajudou.
fonte
Python 278 (O (n!))
Explicação
fonte
Haskell -
295 290 265 246 203 189182 bytesFinalmente funciona! Agora também é uma força bruta e não uma solução dinâmica.
Agradecemos a proudhaskeller por algumas dicas de golfe.
Provavelmente, essa não é uma solução completa para o golfe, porque na verdade sou péssima no golfe, mas é a melhor solução possível (e parece complicada, por isso compreendi isso):
Novos casos de teste:
Explicação da solução:
A
main
função apenas obtém uma entrada e é executadag
com ela.g
pega a entrada e retorna o máximo de todas as combinações possíveis de somas e ordens de lista.#
é a função que calcula as somas em uma lista como esta:fonte
;
quando possível? isso não altera a contagem de bytes, mas ajuda a legibilidade troumendouslyd n=[0,2,1]!!n
oud n=mod(3-n)3
. 3) façao
eg
pegue o comprimento da lista em vez de pegar a lista em si, pois eles dependem apenas do comprimento (obviamente, isso permanece apenas enquanto não estiverem alinhados). 4) substituaotherwise
por0<1
. 5) faça a última definição de r ber$o x:y
. 6) removaa@
e substitua um porx:y
. boa sorte com o seu golfe!GolfScript (52 caracteres)
Demonstração online
A análise do feersum é muito boa, mas pode ser levada mais longe se o objetivo é jogar golfe em vez de eficiência. No pseudo-código:
fonte