Reducir usando el valor más bajo

9

El reto

Cree una función que tome una matriz de números y reste de cada elemento el elemento más bajo de la matriz que aún no se ha restado de otro.

  • Después de usar el valor más bajo, no se puede volver a usar.
  • Los números en la matriz son números decimales, y no necesariamente enteros.

Ejemplo:

Input: [6, 4, 7, 8, 9, 2, 1, 4]

Next lowest value:          Output:
[6, 4, 7, 8, 9, 2, 1, 4]    [6, 4, 7, 8, 9, 2, 1, 4]
                   ^         ^
                            6-1 = 5
[6, 4, 7, 8, 9, 2, -, 4]    [5, 4, 7, 8, 9, 2, 1, 4]
                ^               ^
                            4-2 = 2
[6, 4, 7, 8, 9, -, -, 4]    [5, 2, 7, 8, 9, 2, 1, 4]
    ^                              ^
                            7-4 = 3
[6, -, 7, 8, 9, -, -, 4]    [5, 2, 3, 8, 9, 2, 1, 4]
                      ^               ^
                            8-4 = 4
[6, -, 7, 8, 9, -, -, -]    [5, 2, 3, 4, 9, 2, 1, 4]
 ^                                       ^
                            9-6 = 3
[-, -, 7, 8, 9, -, -, -]    [5, 2, 3, 4, 3, 2, 1, 4]
       ^                                    ^
                            2-7 = -5
[-, -, -, 8, 9, -, -, -]    [5, 2, 3, 4, 3,-5, 1, 4]
          ^                                    ^
                            1-8 = -7
[-, -, -, -, 9, -, -, -]    [5, 2, 3, 4, 3,-5,-7, 4]
             ^                                    ^
                            4-9 = -5

Final output: [5, 2, 3, 4, 3, -5, -7, -5]

Casos de prueba

Input: [6, 4, 7, 8, 9, 2, 1, 4] => Output: [5, 2, 3, 4, 3, -5, -7, -5]

Input: [4, 7, 4, 9, -10, 8, 40] => Output: [14, 3, 0, 2, -18, -1, 0]

Input: [0.25, -0.5, 8, 9, -10] => Output: [10.25, 0, 7.75, 1, -19]

Input: [3, 4, 9, 1, 1, 1, -5] => Output: [8, 3, 8, 0, -2, -3, -14]


Este es el , por lo que gana la respuesta más corta en bytes.

Luis felipe De jesus Munoz
fuente
44
Esto podría usar un ejemplo de recorrido. Tal como está ahora, la tarea debe inferirse de los casos de prueba.
Laikoni
1
Gracias @Arnauld por tomarse el tiempo para hacerlo. No he podido usar la PC desde ayer, así que no pude modificar el ejemplo
Luis felipe De jesus Munoz
3
¿Hay alguna razón específica para incluir no enteros en las matrices? No hace que el desafío sea más interesante, descarta algunos enfoques y plantea un gran problema en los idiomas sin tipos no enteros.
Dennis

Respuestas:

5

MATL , 3 bytes

tS-

Pruébalo en línea!

(implicit input as an array)
t                              # duplicate
 S                             # sort
  -                            # element-wise subtract
(implicit output)

Giuseppe
fuente
4

Casco , 4 bytes

Ṡz-O

Pruébalo en línea!

Explicación

      -- input, e.g. [6,4,7,8,9,2,1,4]
   O  -- sort        [1,2,4,4,6,7,8,9]
Ṡz-   -- element wise difference to input: [6-1,4-2,7-4,8-4,9-6,2-7,1-8,4-9]
      -- return result [5,2,3,4,3,-5,-7,-5]
Laikoni
fuente
Esto tiene que ser una broma ..... 4 bytes. Impresionante
Luis felipe De jesus Munoz
3

Ruby, 32 caracteres

->a{a.zip(a.sort).map{|x,y|x-y}}
histocrat
fuente
Puede imprimir los valores: -> a {a.zip (a.sort) {| x, y | p xy}}
GB
3

JavaScript (ES6), 44 bytes

a=>[...a].map(x=>x-a.sort((a,b)=>b-a).pop())

Pruébalo en línea!

Comentado

a =>                 // given the input array a[]
  [...a]             // create a copy of a[]
  .map(x =>          // for each integer x in the copy:
    x -              //   update x by ...
    a.sort((a, b) => //     sorting the original array in descending order
      b - a          //     (we only need to sort it once, but it's shorter to do it here)
    ).pop()          //     taking the element at the top of a[] and subtracting it from x
  )                  // end of map()
Arnauld
fuente
3

Java 10, 83 bytes

a->{var b=a.clone();java.util.Arrays.sort(b);for(int i=0;i<a.length;a[i]-=b[i++]);}

Modifica la matriz de entrada en lugar de devolver una nueva para guardar bytes.

Pruébalo en línea.

Explicación:

a->{                         // Method with double-array parameter and no return-type
  var b=a.clone();           //  Create a copy of the input-array
  java.util.Arrays.sort(b);  //  Sort this copy
  for(int i=0;i<a.length;    //  Loop over the indices
    a[i]-=                   //   Subtract from the `i`'th item in the input-array:
          b[i++]);}          //    The `i`'th item of the sorted array
Kevin Cruijssen
fuente
3

Python 3, 42 40 bytes

lambda a:[b-c for b,c in zip(a,sorted(a))]

lambda a:[a.pop(0)-b for b in sorted(a)]
mypetlion
fuente
37 bytes usando map.
ovs
@ovs Su solución funciona para Python 3. Devuelve un mapobjeto, en lugar de una lista. ¿Sería una especie de área gris para los requisitos del concurso? Tal vez podría enviarlo como su propia respuesta, ya que probablemente sea lo suficientemente diferente como para calificar.
mypetlion
@ovs La especificación también establece que la entrada no será necesariamente ints, así que voy a dejar la mía tal como está.
mypetlion
Devolver un mapobjeto es válido, pero el requisito no int hace que mi sugerencia no sea válida.
ovs
1

Stax , 5 bytes

ÿ◙┘¿N

Ejecutar y depurarlo

Para mostrar cómo funciona, aquí está la versión desempaquetada y comentada.

m       for each element execute, then pop and print:
  xo    sort the original input
  i@    index into array using iteration index
  -     subtract

Ejecute este

recursivo
fuente
1

Japt , 8 6 bytes

c í-Un

Pruébalo aquí


Explicación

           :Implicit input of array U
c          :Flatten (simply creates a 2nd copy of the array because JavaScript's sort mutates the original array)
  í        :Interleave
    Un     :U sorted
   -       :Reduce each pair by subtraction
Lanudo
fuente
1

SmileBASIC, 49 bytes

DEF R A
DIM B[0]COPY B,A
SORT B
ARYOP 1,A,A,B
END

La matriz de entrada se modifica en su lugar.

ARYOPrealiza operaciones en matrices completas a la vez. En este caso se resta Bde Ay almacena el resultado en A.

12Me21
fuente
0

PHP , 86 bytes

function f($a){$b=$a;sort($b);return array_map(function($x,$y){return $y-$x;},$b,$a);}

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente