Produto Escalar Mínimo
A inspiração para esse problema do código de golfe é a competição do Google Code Jam . A premissa por trás do problema é que, dada a entrada de dois vetores de comprimentos variados, encontre o escalar mínimo possível. Um escalar pode ser encontrado usando a seguinte fórmula:
x1 * y1 + x2 * y2 + ... + xn * yn
O problema, no entanto, é que vários valores para o escalar podem ser encontrados, dependendo da ordem dos números no caso de entrada (visto abaixo). Seu objetivo é determinar a solução mínima possível de número inteiro escalar, inserindo os números dos casos de entrada na equação e resolvendo-os. Você pode usar todos os números da entrada apenas uma vez e deve usar todos os números.
Permita-me fornecer um exemplo com os seguintes vetores.
Entrada
3
1 3 -5
-2 4 1
Resultado
-25
O primeiro número inteiro na linha representa o número de números, n, em cada vetor. Nesse caso, temos três números em cada vetor.
O número n pode variar com cada caso de teste, mas sempre haverá dois vetores.
Na entrada de exemplo, o produto escalar mínimo seria -25.
(-5 * 4) + (1 * 1) + (3 * -2) = 25
Regras
- Você só pode usar cada número inteiro nos dois vetores uma vez.
- Você deve usar todos os números inteiros nos vetores.
- Sua saída deve incluir apenas o produto final
- Selecionarei a solução com a menor quantidade de código, que segue todas as especificações listadas acima, em qualquer idioma!
Dica: você não precisa fazer força bruta nesse problema, a menos que ele reduza seu código. Existe um método específico envolvido na localização do escalar de abrangência mínimo :).
fonte
Respostas:
Gelatina, 6 bytes
Experimente online!
Usar força bruta é igualmente curto:
Como funciona
fonte
Sério , 6 bytes
Experimente online!
Explicação:
fonte
APL, 15 bytes
Essa é uma função diádica que aceita matrizes à esquerda e à direita e retorna um número inteiro. Ele usa a mesma abordagem da minha resposta Julia : produto pontilhado das matrizes classificadas, uma descendente e outra ascendente.
Experimente aqui
fonte
MATL , 6 bytes
Código:
Minha primeira resposta MATL :)
Explicação:
Experimente online!
fonte
Mathematica,
3017 bytes-13 bytes por murphy
Função, entrada é vetor1 (lista), vetor2 (lista) Várias revisões:
fonte
Sort@#.Reverse@Sort@#2&
Sort@#.Sort[#2,#>#2&]&
Sort@#.-Sort@-#2&
Sort@#.SortBy[#2,-#&]
Pyth -
148 bytesEu acho que descobri o truque.
Experimente online aqui .
fonte
Julia,
3225 bytesEsta é uma função anônima que aceita duas matrizes e retorna um número inteiro. Para chamá-lo, atribua-o a uma variável e faça
f(x)(y)
.Para as entradas x e y , simplesmente calculamos o produto escalar de x classificado na ordem inversa com y classificado. Nós temos x na ordem inversa da classificação negando todos os valores, classificando e depois negando novamente.
Economizou 7 bytes graças a Dennis!
fonte
Javascript ES6, 69 bytes
Uau, isso é muito longo.
fonte
|i
vez de&&i
Perl 6,
3330 bytesfonte
{sum @^a.sort Z*[R,] @^b.sort}((1,3,-5),(-2,4,1)).say
CJam, 11 bytes
Experimente online!
fonte
Python, 139 bytes
fonte
b = sorted(b)
transforma emb=sorted(b)
(2 bytes salvos). Além disso você pode colocar várias instruções na mesma linha, separando-os com um ponto e vírgula, por exemploa=list(reversed(sorted(a)));b=sorted(b);res=0
lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b)))
. Não exigimos que os envios de funções sejam nomeados (portanto, um lambda sem nome é válido) e on
parâmetro é desnecessário (muitos outros envios o omitem totalmente).C ++, 124 bytes
ungolfed:
No começo, eu usei
std::greater<int>()
para classificar,b
mas apenas reverter a ordem no somatório é mais fácil.fonte
Haskell, 59 bytes
fonte
RETURN , 29 bytes
Try it here.
Substitua qualquer
␆␃␄␇
por seus equivalentes não imprimíveis.Lambda anônima que deixa o resultado na pilha2. Uso:
Explicação
fonte
J, 14 bytes
Usa o mesmo princípio que os outros.
Explicação
fonte