La fuerza gravitacional es una fuerza que atrae dos objetos con masa. En este desafío, nuestros objetos serán Números y su masa será su valor. Para hacerlo, no nos importa la fuerza de la fuerza sino la dirección de la misma.
Imagina este conjunto de números
[1 6 9 4 6 9 7 6 4 4 9 8 7]
Cada uno de ellos crea una fuerza entre sí y sus números adyacentes. En algunas condiciones, esto provocará que otro número sea atraído (movido) hacia un número. Cuando el número es mayor que el adyacente, lo atrae. Echemos un vistazo a nuestro ejemplo anterior:
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
El número 1
no es lo suficientemente grande como para moverse 6
, pero el número 6
es, etc. Básicamente, los números se mueven al número adyacente más grande (también más grande que el número mismo). Si los dos números adyacentes son iguales, entonces no se atrae. También ocurre cuando el número y el adyacente son iguales.
Esto es solo para mostrar la atracción, pero ¿qué sucede después? Los números que chocan debido a la atracción se resumen:
[20 32 28]
Básicamente, el desafío es, dado un conjunto de números, generar el resultado del conjunto atraído de números.
Ejemplo 1
Input => [10 15 20 10 20 10 10]
[10 → 15 → 20 10 20 ← 10 10]
Output => [45 10 30 10]
Ejemplo 2
Input => [9 9 9 9 8 1 8]
[9 9 9 9 ← 8 1 8]
Output => [9 9 9 17 1 8]
Ejemplo 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]
Ejemplo 4
Input => [1 2 3 2 1]
[1 → 2 → 3 ← 2 ← 1]
Output => [9]
Ejemplo 5
Input => [1]
Output => [1]
Ejemplo 6
Input => [1 1]
Output => [1 1]
Ejemplo 7
Input => [2 1 4]
Output => [2 5]
Notas
- La atracción solo ocurre una vez
- Los números no son atraídos por números no adyacentes
- El conjunto de números solo contendrá enteros positivos
[1 3 5 4 2]
= 15?G*M*m / r^2
, es igual para ambos cuerpos. El más ligero se mueve más que el más pesado por el impulso, no por falta de atracción. Tal vez diga "1 no es lo suficientemente grande como para mover 6".Respuestas:
JavaScript (ES6),
106 104100 bytesGuardado 2 bytes gracias a @Shaggy
Pruébalo en línea!
Comentado
Primero actualizamos la matriz de entrada original0 0
a[]
iterando en una copia de la misma. Durante este paso, todos los valores 'atraídos' por otros se establecen en .Debido a que la matriz se analiza de izquierda a derecha, podemos agregar a siempre que un valor sea atraído por su vecino derecho.unayo unai + 1
Ejemplo: se convierte en y luego .4→5→6 [0,9,6] [0,0,15]
Pero cuando su vecino izquierdo atrae varios valores seguidos, necesitamos agregar al primer atractor de esta secuencia (con ) en lugar de simplemente .ai ak k<i ai−1
Ejemplo: se convierte en y luego .6←5←4 [11,0,4] [15,0,0]
Luego filtramos todas las entradas iguales a .0
fuente
[1,3,5,3,1,2,1]
y se generará[14,2]
, pero en realidad funciona correctamente y genera resultados[13,3]
.Stax ,
27252318 bytesEjecutar y depurarlo
La salida está separada por nuevas líneas.
Este programa opera en pares adyacentes en la matriz y determina si debe haber una división entre ellos mediante este procedimiento.
Considere alguna entrada arbitraria
[... w x y z ...]
. Aquí es cómo determinar si debería haber una división entrex
yy
.x == y
, entonces si.x > y
, entonces iffz >= x
.y > x
, entonces iffw >= y
.La suma se deja como ejercicio.
fuente
Retina 0.8.2 , 64 bytes
Pruébalo en línea! El enlace incluye un conjunto de pruebas. Explicación:
Convierte a unario.
Eliminar los separadores entre los números atraídos.
(?<=(1+))
establece\1
el número antes del separador. Después del separador, hay dos casos:En estos casos, hay una atracción entre los dos números y al eliminar el separador, los números colisionan y se suman.
Convierte a decimal.
fuente
Jalea , 23 bytes
Pruébalo en línea!
Un enlace monádico que toma una lista de enteros como argumento y devuelve una lista de enteros.
Explicación
Alguna inspiración tomada de la respuesta Stax de @ recursive .
fuente
C (gcc) , 111 bytes
Pruébalo en línea!
Toma una matriz de enteros con terminación cero.
Explicación
fuente
Python 2 , 162 bytes
Pruébalo en línea!
fuente
J , 45 bytes
Pruébalo en línea!
Inspirado por la respuesta Stax original de recursive
fuente
R ,
222196173 bytesAquí hay una solución con ayuda de Robin Ryder
Pruébalo en línea!
Un breve conjunto de comentarios
fuente
sign(e)
lugar de(e>0)-(e<0)
{}
en el bucle for son innecesarios ya que solo hay una instrucción en el bucle.y
.m
es un booleanoPython,
114112 bytesEsto utiliza el hecho de que la dirección de la flecha en realidad no importa, y que la presencia de una flecha entre un [i] y un [i + 1] puede determinarse observando el rango de cuatro elementos a [i- 1: i + 3].
Editar: Gracias a Jo King por la aclaración de la regla.
fuente
Perl 5 ,
156147 bytesPruébalo en línea!
fuente
K (ngn / k) , 46 bytes
Pruébalo en línea!
0,x,0
rodear el argumento con 0s3'
trillizos de artículos consecutivos{
}'
para cada hacerx 2 0
obtener el último y el primer triplete actual -x[2]
yx[0]
. son vecinos dex[1]
, en los que se centra el tripletex<\:
compare usando menos que contra cada uno de los tresillos actuales+/
suma. el resultado es un par correspondiente ax[2]
yx[0]
2=
compruebe si cualquiera de los vecinos es mayor que los otros 2 elementosx
, devuelva un par de booleanos 0 o 1-/
restarlos. un resultado de -1 significax[1]
atraído a la izquierda, 1 a la derecha y 0 significa que permanece en su lugar(!#x)+
agregue 0 al primer elemento, 1 al segundo, etc. esto calcula los índices hacia los cuales los elementos son atraídos{x x}/
índice consigo mismo hasta la convergencia. el resultado son los índices efectivos a los que cada elemento se ve atraídox@.=
grupox
(el argumento original) por aquellos. el resultado es una lista de listas+/'
suma cadafuente
Clojure ,
299252bytesPruébalo en línea!
Explicación:
fuente
APL (Dyalog Classic) ,
5251 bytesPruébalo en línea!
traducción de mi k respuesta
fuente
05AB1E , 21 bytes
Pruébalo en línea!
fuente