Mantendo este desafio curto.
Você recebe quatro números: p1, p2, p3 e p4.
A soma mágica dos números é definida da seguinte forma:
magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|
Você só pode alterar um dos valores inteiros acima (p1, p2, p3 ou p4). Você precisa alterar o valor para que a soma mágica dos valores atinja seu valor mínimo.
Por exemplo:
p1, p2, p3, p4 = 17, -6, 15, 33. O valor da soma mágica é 78 neste caso.
Você pode alterar o -6 aqui para 16, e o valor da soma mágica será 36, que é o valor mínimo atingível.
Lembre-se de que os números podem ser números inteiros positivos ou negativos.
Isso é código-golfe, portanto, menos bytes em código vencem. Brownie aponta para o uso de uma linguagem prática sobre uma linguagem recreativa. Que o dia 4 esteja com você.
Reiterar:
Amostra 1
Entrada 1
17 -6 15 33
Saída 1
36
Explicação 1
O -6 pode ser substituído por 16 e isso nos dá a soma mágica mínima possível.
Amostra 2
Entrada 2
10 10 10 10
Saída 2
0 or 2
qualquer um é aceitável
Explicação 2
A soma mágica mínima atingível é 0, pois a soma mínima de 4 números inteiros positivos é 0. Se um número tiver que ser alterado, um dos 10 pode ser alterado para 9 e, assim, produzirá a saída 2.
Amostra 3
Entrada 3
1 2 3 4
Saída 3
4
Explicação 3
A entrada por si só produz 6 como sua soma mágica. Alterar o 4 para 1 e a soma mágica mínima é atingida, que é 4.
fonte
+1
de minha parte.Respostas:
Gelatina , 6 bytes
Experimente online!
Uma porta da minha resposta Python .
fonte
Python 2 , 44 bytes
Experimente online!
Classifica a entrada como
a,b,c,d,
em ordem crescente, pega a menor dec-a
ed-b
e a dobra. Por que isso funciona?Primeiro, observe que quando alteramos um elemento para maximizar a soma cíclica total de distâncias, é ideal (ou vinculado para o ideal) alterá-lo para igualar um vizinho, como
17, -6, 15, 33 -> 17, 17, 15, 33
. Isso ocorre porque sua nova distância total para seus vizinhos cíclicos esquerdo e direito é pelo menos a distância entre esses vizinhos, portanto, torná-los iguais é o melhor que podemos fazer.Agora, excluir uma das duas cópias adjacentes de um número fornece a mesma soma cíclica de distâncias. No exemplo, isto é
17, 15, 33
, dando distâncias2 + 18 + 16
. Portanto, em vez de substituir um dos quatro números, é equivalente apenas excluí-lo, deixando três números e usando a soma de suas distâncias cíclicas.Observe que, com 3 números, a maior distância é a soma dos dois menores. Isso ocorre porque, se ordenarmos os números
a ≤ b ≤ c
, então|a - c| = |a - b| + |b - c|
. Em outras palavras, viajamos entre o número maior e o menor duas vezes, usando o número médio como um pit stop uma das vezes. Portanto, a soma das três distâncias é apenas o dobro da distância entre o mínimo e o máximo(c-a)*2
.Portanto, a questão é qual número excluímos para obter a menor distância entre o mínimo e o máximo dos três números restantes. Claramente, excluímos o menor ou o maior dos números. Chamando-os
a, b, c, d
em ordem classificada, excluindoa
folhasd - b
e excluindod
folhasc - a
, e o resultado final é o dobro, o que for menor.fonte
p1
atravésp5
, e ainda só permitiu mudar um número? O caso de quatro números parece muito fácil (somente depois de ver sua resposta).R ,
6633 bytesExperimente online!
Muito mais curto com o algoritmo do xnor (leia a explicação deles e atualize a publicação deles!).
Versão antiga:
R , 66 bytes
Experimente online!
Recebe entrada como um vetor de 4 números inteiros.
Existem 4 maneiras de escolher qual número mudamos; para cada uma delas, precisamos apenas calcular a soma de 3 diferenças absolutas.
rbind
fonte
Geléia ,
1110 bytesExperimente online!
Um link monádico que leva uma lista se números inteiros como entrada. Deve funcionar para o tamanho da lista arbitrária. Funciona com base no fato de que a soma mínima pode ser obtida testando a remoção de cada número da lista, calculando a soma mágica e levando o mínimo.
fonte
Geléia , 8 bytes
Um link monádico que aceita uma lista de números inteiros * que gera um número inteiro
* pode ser qualquer número, desde que haja mais de 1; usando a fórmula mágica do mesmo estilo, somando as diferenças dos vizinhos.
Experimente online!
Quão?
fonte
Japonês
-Q
, 11 bytesUsa o algoritmo do @ xnor, que me salvou em 4 bytes.
Guardado 5 bytes graças a @Shaggy
Tente
fonte
ÃÃ
por uma nova linha.J ,
24201817 bytesversão alternativa usando o algoritmo xnor:
quão
Duas vezes
2 *
o mínimo da[:<./
2ª linha subtraído da primeira linha[:-/
da matriz 2x2 formada pela modelagem2 2$
da entrada classificada\:~
Experimente online!
resposta original: J , 24 bytes
Experimente online!
Usando a ideia de Nick Kennedy.
1(...)\.]
aplique o verbo in parens a todos os outfixes de comprimento 1 (um outfix de comprimento n é uma lista com n elementos contíguos removidos, portanto, isso produz todas as listas possíveis com 1 olmo removido)(1 #. 2 |@-/\ ] , {.)
isso calcula a soma mágica anexando o primeiro olmo à entrada] , {.
e aplicando a diferença abs|@-/
nos infixes de comprimento 22 ...\
e somando o resultado1 #.
.[:<./
retorna o minfonte
05AB1E ,
117 bytesPorto de @xnor resposta Jelly 's .
-4 bytes graças a @Emigna e @Grimy .
Experimente online.
Alternativa de 7 bytes, que funciona apenas na versão herdada de 05AB1E (exigiria um
€
antes do¥
na nova versão):Experimente online.
Explicação:
fonte
{2ôø¥W·
ou 8 com€
na reescrita.{2ô`αW·
C ++ (gcc)
programa completo: 138 bytes
Experimente online!
função principal: 84 bytes
Experimente online!
Também usando o algoritmo xnor explicado em seu post no Python 2.
fonte
Carvão , 20 bytes
Experimente online! Link é a versão detalhada do código. Acontece que estou usando a ideia de @ NickKennedy. Explicação:
fonte
JavaScript (ES6), 51 bytes
Usando o método muito mais inteligente do xnor :
Experimente online!
Resposta original, 96 bytes
Recebe a entrada como uma matriz de 4 números inteiros.
Provavelmentedefinitivamente não é a abordagem mais curta.Experimente online!
fonte
Wolfram Language (Mathematica) , 29 bytes
Uma porta do algoritmo @ xnor
Experimente online!
fonte
Java 8 , 235 bytes
Uma porta da resposta e algoritmo Python do @ xnor
Experimente online!
Java 10 , não comprovado, 222 bytes
Com o Java 10, eu devo substituir o lado esquerdo da declaração do Scanner por
var
, embora não possa compilá-lo on-line e, portanto, só posso adicioná-lo como uma trivialidade. Desculpe.fonte