Mit dem niedrigsten Wert reduzieren

9

Die Herausforderung

Erstellen Sie eine Funktion, die ein Array von Zahlen verwendet und von jedem Element das niedrigste Element im Array subtrahiert, das noch nicht von einem anderen subtrahiert wurde.

  • Nach Verwendung des niedrigsten Werts kann er nicht mehr verwendet werden.
  • Zahlen im Array sind Dezimalzahlen und nicht unbedingt ganze Zahlen.

Beispiel:

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]

Testfälle

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]


Dies ist , also gewinnt die kürzeste Antwort in Bytes.

Luis felipe De jesus Munoz
quelle
4
Dies könnte ein Durchgangsbeispiel verwenden. Aus heutiger Sicht muss die Aufgabe aus den Testfällen abgeleitet werden.
Laikoni
1
Vielen Dank an @Arnauld, dass Sie sich die Zeit dafür genommen haben. Ich konnte den PC seit gestern nicht mehr benutzen, daher konnte ich das Beispiel nicht ändern
Luis felipe De jesus Munoz
3
Gibt es einen bestimmten Grund, Nicht-Ganzzahlen in die Arrays aufzunehmen? Dies macht die Herausforderung nicht interessanter, schließt einige Ansätze aus und stellt ein großes Problem in Sprachen ohne nicht ganzzahlige Typen dar.
Dennis

Antworten:

5

MATL , 3 Bytes

tS-

Probieren Sie es online aus!

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

Giuseppe
quelle
4

Schale , 4 Bytes

Ṡz-O

Probieren Sie es online aus!

Erläuterung

      -- 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
quelle
Das muss ein Witz sein ..... 4 Bytes. Ehrfürchtig
Luis Felipe de Jesus Munoz
3

Ruby, 32 Zeichen

->a{a.zip(a.sort).map{|x,y|x-y}}
Histokrat
quelle
Sie könnten einfach die Werte drucken: -> a {a.zip (a.sort) {| x, y | p xy}}
GB
3

JavaScript (ES6), 44 Byte

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

Probieren Sie es online aus!

Kommentiert

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
quelle
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++]);}

Ändert das Eingabearray, anstatt ein neues zurückzugeben, um Bytes zu speichern.

Probieren Sie es online aus.

Erläuterung:

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
quelle
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
quelle
37 Bytes mit map.
ovs
@ovs Ihre Lösung funktioniert für Python 3. Sie gibt ein mapObjekt anstelle einer Liste zurück. Wäre das eine Art Grauzone für die Anforderungen des Wettbewerbs? Vielleicht könnten Sie es einfach als Ihre eigene Antwort einreichen, da es wahrscheinlich anders genug ist, um sich zu qualifizieren.
Mypetlion
@ovs Die Spezifikation besagt auch, dass die Eingabe nicht unbedingt ints sein muss, also werde ich meine so lassen, wie sie ist.
Mypetlion
Die Rückgabe eines mapObjekts ist gültig, aber die Nicht-Int-Anforderung macht meinen Vorschlag ungültig.
ovs
2

Perl 6 , 15 Bytes

{@^a Z-@a.sort}

Probieren Sie es online aus!

Anonyme Funktion, die eine Liste verwendet und eine Liste zurückgibt.

Scherzen
quelle
1

Stax , 5 Bytes

ÿ◙┘¿N

Führen Sie es aus und debuggen Sie es

Um zu zeigen, wie es funktioniert, finden Sie hier die entpackte, kommentierte Version.

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

Führen Sie diesen aus

rekursiv
quelle
1

Japt , 8 6 Bytes

c í-Un

Probieren Sie es hier aus


Erläuterung

           :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
Zottelig
quelle
1

SmileBASIC, 49 Bytes

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

Das Eingabearray wird an Ort und Stelle geändert.

ARYOPführt Operationen auf ganzen Arrays gleichzeitig aus. In diesem Fall zieht sie Baus Aund speichert das Ergebnis in A.

12Me21
quelle