Nos é dada uma lista de números inteiros p1, ..., pk (não necessariamente distintos) em que cada um tem um valor entre 1 e 9, inclusive. Usando cada um dos p1, ..., pk exatamente uma vez, podemos formar concatenações de dígitos, para obter uma nova lista de números; Em seguida, produzimos o produto desta nova lista. O objetivo é maximizar este produto escolhendo as melhores concatenações de dígitos.
Por exemplo, recebemos a lista: 2 3 2 (separados por espaços). Podemos formar as seguintes concatenações:
2 3 2
(o produto dessas concatenações é12
)23 2
(o produto é46
)32 2
(o produto é64
)22 3
(o produto é66
)
Como o maior produto que podemos formar de concatenações é 66, produzimos isso.
Regras:
- Deve haver pelo menos uma multiplicação (ou seja, você não pode simplesmente concatenar todos os dígitos e produzir isso).
- Você não pode usar outros operadores além da multiplicação ou inserir parênteses etc.
- Suponha que a lista de números inteiros fornecida seja separada por espaços e que todos os números inteiros tenham valores entre 1 e 9.
O código mais curto (em bytes) vence!
Casos de teste:
Entrada: 1 2 3
; Saída: 63
(ie, 21*3
)
Entrada: 2 5 9
; Saída: 468
( 52*9
)
Entrada: 1 2 3 4
; Saída: 1312
( 41*32
)
Respostas:
CJam,
32282312 bytesExperimente on-line no intérprete CJam .
Obrigado a @ user23013 por me ajudar a salvar 16 bytes inteiros!
Idéia
A permissão dos caracteres na sequência de entrada a divide em números inteiros (grupos de dígitos consecutivos) separados por espaços. Pressionando um zero e avaliando a sequência de entrada permutada, pressionamos dois ou mais números inteiros. Multiplicar os dois primeiros mais resultará no produto da entrada dividido em exatamente dois números inteiros ou em algum valor abaixo do ideal.
Código
fonte
l2%_,,1>\e!m*{~S+m<~*}%$W=
.l2%S+e!{0\~*}%$W=
.CJam,
3635 bytesBem direto. Repete todas as combinações possíveis e as classifica por produto. Em seguida, gera o maior. Tudo isso, lembrando que pelo menos 1 multiplicação deve estar presente.
Adicionará explicação em breve.
Experimente online aqui
fonte
JavaScript (ES6) 125
Editar Acho que o @oberon acertou: "cada novo dígito deve ser concatenado com o menor número"
Não vou mudar essa resposta roubando a ideia dele. A implementação no ES6 seria de 70 bytes (o sinal foi alterado em comparação para comparar como número e não cadeias)
Minha solução
Como eu disse nos comentários, para cada par de números a, b, o produto a * b é menor que a concatenação simples ab (= a * 10 ^ (dígitos de b) + b). Portanto, é melhor evitar produtos e preferir a concatenação, mas como pelo menos um produto é solicitado, precisamos criar 2 números e multiplicá-los.
Eu tento todo o agrupamento de dígitos possível, construindo um par de números para multiplicar. Cada número é obviamente construído com dígitos em ordem decrescente.
Por exemplo, com uma lista de 4 números, [1 2 3 4] - tente:
O máximo desses valores é o resultado que precisamos.
Os agrupamentos podem ser enumerados em loop em um bitmap de 4 bits, com o valor mínimo 0001 e o valor máximo 0111 (ou seja, 1 << (4 -1) - 1)
Não é tão jogado
Teste usando o trecho abaixo no Firefox.
fonte
Python 3, 111 bytes
Provavelmente é muito mais jogável. Mas eu gosto do tempo de execução (O ( n log n ), não é?).
Ungolfed com explicação.
fonte
Pitão, 25 bytes
Eu faço um loop sobre cada permutação da entrada. Então, como toda combinação ótima consiste em dois números inteiros, apenas a divido em todas as posições possíveis e multiplico as divisões concatenadas. Em seguida, ordeno e obtenho o último elemento.
fonte
R, 164
Como método, não tenho certeza se isso é robusto. Nos casos que testei, parece funcionar sempre. Eu tentei testá-lo contra a solução otimizadores e parece estar bem contra isso também. Estou mais do que preparado para provar que estou errado :) Há espaço para jogar golfe, mas eu esperava receber algum feedback sobre o método primeiro.
O processo geral é:
Expandido com alguns comentários
E algumas execuções de teste (implementadas como uma função chamada g)
fonte