A força gravitacional é uma força que atrai dois objetos com massa. Neste desafio, nossos objetos serão Números e sua massa será seu valor. Para fazer isso, não nos importamos com a força da força, mas com a direção dela.
Imagine esse conjunto de números
[1 6 9 4 6 9 7 6 4 4 9 8 7]
Cada um deles cria uma força entre si e seus números adjacentes. Sob algumas condições, isso fará com que outro número seja atraído (movido) para um número. Quando o número é maior que o adjacente, ele o atrai. Vamos dar uma olhada no nosso exemplo anterior:
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
O número 1
não é grande o suficiente para ser movido 6
, mas o número 6
é, etc ... Basicamente, os números são movidos para o maior número adjacente (também maior que o próprio número). Se os dois números adjacentes forem iguais, não será atraído. Também acontece quando o número e o adjacente são iguais.
Isso é apenas para mostrar a atração, mas o que acontece depois? Os números que colidem devido à atração são resumidos:
[20 32 28]
Então, basicamente, o desafio é: dado um conjunto de números, produza o resultado do conjunto de números atraído.
Exemplo 1
Input => [10 15 20 10 20 10 10]
[10 → 15 → 20 10 20 ← 10 10]
Output => [45 10 30 10]
Exemplo 2
Input => [9 9 9 9 8 1 8]
[9 9 9 9 ← 8 1 8]
Output => [9 9 9 17 1 8]
Exemplo 3
Input => [1 6 9 4 6 9 7 6 4 4 9 8 7]
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Output => [20 32 28]
Exemplo 4
Input => [1 2 3 2 1]
[1 → 2 → 3 ← 2 ← 1]
Output => [9]
Exemplo 5
Input => [1]
Output => [1]
Exemplo 6
Input => [1 1]
Output => [1 1]
Exemplo 7
Input => [2 1 4]
Output => [2 5]
Notas
- A atração acontece apenas uma vez
- Os números não são atraídos para números não adjacentes
- O conjunto de números conterá apenas números inteiros positivos
[1 3 5 4 2]
= 15?G*M*m / r^2
,, é igual para ambos os corpos. O mais leve se move mais do que o mais pesado por causa do momento, não por falta de atração. Talvez diga "1 não é grande o suficiente para mover 6".Respostas:
JavaScript (ES6),
106 104100 bytesGuardado 2 bytes graças a @Shaggy
Experimente online!
Comentado
a[]
Exemplo:4 → 5 → 6 [ 0 , 9 , 6 ] [ 0 , 0 , 15 ] .
fonte
[1,3,5,3,1,2,1]
e emitia[14,2]
, mas na verdade funciona corretamente e é emitido[13,3]
.Stax ,
27252318 bytesExecute e depure
A saída é separada por novas linhas.
Este programa opera em pares adjacentes na matriz e determina se deve haver uma divisão entre eles usando este procedimento.
Considere alguma entrada arbitrária
[... w x y z ...]
. Aqui está como determinar se deve haver uma divisão entrex
ey
.x == y
sim, então.x > y
, então sez >= x
.y > x
, então sew >= y
.A soma é deixada como um exercício.
fonte
Retina 0.8.2 , 64 bytes
Experimente online! O link inclui o conjunto de testes. Explicação:
Converta para unário.
Remova os separadores entre os números atraídos.
(?<=(1+))
define\1
o número antes do separador. Após o separador, existem dois casos:Nesses casos, há uma atração entre os dois números e a exclusão do separador faz com que os números colidam, juntando-os.
Converta para decimal.
fonte
Gelatina , 23 bytes
Experimente online!
Um link monádico que pega uma lista de números inteiros como argumento e retorna uma lista de números inteiros.
Explicação
Alguma inspiração tirada da resposta Stax do @ recursive .
fonte
C (gcc) , 111 bytes
Experimente online!
Toma uma matriz de números inteiros terminada em zero.
Explicação
fonte
Python 2 , 162 bytes
Experimente online!
fonte
J , 45 bytes
Experimente online!
Inspirado pela resposta Stax original da recursiva
fonte
R ,
222196173 bytesAqui está uma solução com a ajuda de Robin Ryder
Experimente online!
Um breve conjunto de comentários
fonte
sign(e)
vez de(e>0)-(e<0)
{}
loop for é desnecessário, pois existe apenas uma instrução no loop.y
.m
é um booleanoPython,
114112 bytesIsso usa o fato de que a direção da seta realmente não importa e que a presença de uma seta entre a [i] e a [i + 1] pode ser determinada observando o intervalo de quatro elementos a [i- 1: i + 3].
Edit: Obrigado a Jo King pelo esclarecimento das regras
fonte
Perl 5 ,
156147 bytesExperimente online!
fonte
K (ngn / k) , 46 bytes
Experimente online!
0,x,0
rodeie o argumento com 0s3'
trigêmeos de itens consecutivos{
}'
para cada fazerx 2 0
obter o último e o primeiro do trigêmeo atual -x[2]
ex[0]
. eles são os vizinhos dosx[1]
quais o trigêmeo está centradox<\:
compare usando menos que em relação a cada um dos trigêmeos atuais+/
soma. o resultado é um par correspondente ax[2]
ex[0]
2=
verifique se um vizinho é maior que os outros 2 elementosx
, retorne um par de booleanos 0 ou 1-/
subtraí-los. um resultado de -1 significa quex[1]
é atraído para a esquerda, 1 para a direita e 0 significa que permanece no lugar(!#x)+
adicione 0 ao primeiro item, 1 ao segundo, etc. isso calcula os índices para os quais os itens são atraídos{x x}/
indexe consigo mesmo até a convergência. o resultado são os índices efetivos pelos quais cada item é atraídox@.=
grupox
(o argumento original) por aqueles. o resultado é uma lista de listas+/'
somar cadafonte
Clojure ,
299252 bytesExperimente online!
Explicação:
fonte
APL (Dyalog Classic) ,
5251 bytesExperimente online!
tradução da minha resposta k
fonte
05AB1E , 21 bytes
Experimente online!
fonte