Hier ist eine kurze Herausforderung am Montagmorgen ...
Schreiben Sie eine Funktion oder ein Programm in der geringsten Anzahl von Bytes, die:
- Nimmt als Eingabe eine Liste von
[x,y]
Koordinaten - Nimmt als Eingabe eine Liste der
[x,y]
jeweiligen Massen der Koordinaten - Gibt den berechneten Schwerpunkt in Form von aus
[xBar,yBar]
.
Hinweis:
- Die Eingabe kann in beliebiger Form erfolgen, solange ein Array verwendet wird.
Der Schwerpunkt kann nach folgender Formel berechnet werden:
In reinem Englisch...
- Um zu finden
xBar
, multiplizieren Sie jede Masse mit ihrer jeweiligen x-Koordinate, addieren Sie die resultierende Liste und dividieren Sie sie durch die Summe aller Massen. - Um zu finden
yBar
, multiplizieren Sie jede Masse mit ihrer jeweiligen y-Koordinate, addieren Sie die resultierende Liste und dividieren Sie sie durch die Summe aller Massen.
Trivial Python 2.7 Beispiel:
def center(coord, mass):
sumMass = float(reduce(lambda a, b: a+b, mass))
momentX = reduce(lambda m, x: m+x, (a*b for a, b in zip(mass, zip(*coord)[0])))
momentY = reduce(lambda m, y: m+y, (a*b for a, b in zip(mass, zip(*coord)[1])))
xBar = momentX / sumMass
yBar = momentY / sumMass
return [xBar, yBar]
Testfälle:
> center([[0, 2], [3, 4], [0, 1], [1, 1]], [2, 6, 2, 10])
[1.4, 2.0]
> center([[3, 1], [0, 0], [1, 4]], [2, 4, 1])
[1.0, 0.8571428571428571]
Das ist Code-Golf, also gewinnt die geringste Anzahl von Bytes!
code-golf
arithmetic
array-manipulation
Herr Public
quelle
quelle
[x,y,m],[x,y,m]...
:?[(x1,y1,m1), (x2,y2,m2)]
zB mit einer Liste von Tupeln? Oder spielt es keine Rolle, ob es sich bei den Argumenten um Tupel, Listen oder Arrays handelt? Was ist mit drei Listen / Arrays?Antworten:
MATL ,
65 BytesDas Eingabeformat ist ein Zeilenvektor mit den Massen, dann eine zweispaltige Matrix mit den Koordinaten (in denen Leerzeichen oder Kommas optional sind).
Erstes Beispiel:
Zweites Beispiel:
Probieren Sie es online!
Erläuterung
m
Bezeichnen wir den Massenvektor (erste Eingabe) undc
die Koordinatenmatrix (zweite Eingabe).quelle
y
ist ziemlich nützlich !! +1Mathematica, 10 Bytes
Beispiel:
quelle
Dot
. Aber ich werde nach Ihrer Verwendung oben sehen!Mathcad, 19 "Bytes"
Da Mathcad ein 2D-Whiteboard und spezielle Operatoren (z. B. Summationsoperator, Integraloperator) verwendet und in einem XML-Format speichert, kann ein tatsächliches Arbeitsblatt mehrere hundert (oder mehr) Zeichen enthalten. Für die Zwecke von Code Golf habe ich die Anzahl der Zeichen oder Operatoren, die der Benutzer eingeben muss, um das Arbeitsblatt zu erstellen, als Mathcad-Bytezahl definiert.
Die erste (Programm-) Version der Challenge benötigt nach dieser Definition 19 "Bytes" und die Funktionsversion 41 "Bytes".
quelle
MATLAB / Octave,
18 bis16 BytesVielen Dank an User Becher und Don Müsli für das Entfernen von 2 Bytes!
Vorausgesetzt, die Koordinaten befinden sich in einer
N x 2
Matrix,x
in der die erste Spalte die X-Koordinate und die zweite Spalte die Y-Koordinate ist, und die Massen befinden sich in einer1 x N
Matrixy
(oder einem Zeilenvektor):Die Erklärung dieses Codes ist ziemlich einfach. Dies ist eine anonyme Funktion, die die beiden Eingaben
x
und aufnimmty
. Wir führen die gewichtete Summation (der Zählerausdruck jeder Koordinate) in einem linearen Algebra-Ansatz unter Verwendung der Matrix-Vektor-Multiplikation durch. Indem Sie deny
Massenvektor nehmen und diesen mit der Koordinatenmatrixx
durch Matrix-Vektor-Multiplikation multiplizieren, würden Sie die gewichtete Summe beider Koordinaten einzeln berechnen, dann dividieren wir jede dieser Koordinaten durch die Summe der Massen und finden so den gewünschten Mittelpunkt von Masse, die als 1 x 2 Zeilenvektor für jede Koordinate zurückgegeben wird.Beispiel läuft
Probieren Sie es online!
https://ideone.com/BzbQ3e
quelle
;
, und auch'
durch die richtige Auswahl des Eingabeformats (x
als Zeilenvektor)Gelee, 6 Bytes
oder
Die Eingabe erfolgt über zwei Befehlszeilenargumente: Masse zuerst, Koordinate zweitens.
Probieren Sie es online!
Erläuterung
oder
quelle
Julia,
2517 BytesVerpasste den offensichtlichen Ansatz: / Call like
f([3 1;0 0;1 4], [2 4 1])
.quelle
CJam, 14 Bytes
Eine unbenannte Funktion mit erwartet die Liste der Koordinatenpaare und die Liste der Massen auf dem Stapel (in dieser Reihenfolge) und belässt den Massenmittelpunkt an ihrer Stelle.
Teste es hier.
Erläuterung
quelle
Perl 6,
363330 Bytesquelle
Im Ernst, 16 Bytes
Nimmt Eingaben als
[x-coords]\n[y-coords]\n[masses]
und Ausgaben alsxbar\nybar
Probieren Sie es online!
Erläuterung:
quelle
Haskell,
5550 BytesDies definiert eine Binärfunktion
f
, die wie folgt verwendet wird:Sehen Sie, wie es beide Testfälle besteht.
Erläuterung
Haskell ist nicht gut für die Verarbeitung mehrdimensionaler Listen geeignet, daher gehe ich hier einige Rahmen durch. Die erste Zeile definiert einen kurzen Alias für
zipWith
den wir zweimal benötigen. Grundsätzlichf
ist dies eine Funktion, die die Liste der Gewichte aufnimmta
und erzeugtf a
, eine Funktion, die die Liste der Positionen aufnimmt und den Massenmittelpunkt erzeugt.f a
besteht aus drei Funktionen:quelle
JavaScript (ES6), 60 Byte
Akzeptiert ein Array von (x, y, mass) "Triple" und gibt ein "Tupel" zurück.
quelle
[x,y,m]
notwendig? Sie sind nicht erforderlich, wenn die Pfeilfunktion nur ein Eingabeargument enthält.R
3225 Bytes-7 Bytes durch Umschalten auf Matrixalgebra bearbeiten (danke @ Sp3000 Julia Antwort)
Übergeben Sie ein Array (Matrix mit 2 Spalten, x, y) als Koordinaten und
m
Gewichtungsvektor, und geben Sie ein Array mit den erforderlichen Koordinaten zurückquelle
PHP, 142 Bytes
Explosionszeichnung Erforderliche Eingabe RückkehrArray: [ xbar, ybar ]
Die
p()
Funktion ist eine Basiskarte,[m]
bei der jeder Wert mit dem entsprechenden Wert[x]
oder[y]
multipliziert wird. Diec()
Funktion in der nimmtArray[Array]
, stellt diearray_sum
undarray_map
für die Raumfunktionen, dann berechnetΣmx/Σm
undΣmy/Σm
.Könnte es möglich sein, die Berechnung selbst in eine Funktion für den Raum zu verwandeln, wird sich zeigen.
quelle
Mathcad, 8 "Bytes"
Ich weiß nicht, woran ich in meiner vorherigen Antwort nicht gedacht habe. Hier ist ein kürzerer Weg, um die Matrixmultiplikation richtig einzusetzen. Die Variable p enthält die Daten. Wenn Sie die Anzahl der Variablen auf die Gesamtsumme setzen, addieren Sie weitere 2 "Bytes" (Erstellung der Eingabetabelle = 1 Byte, Variablenname = 1 Byte).
quelle
Python 3, 63 Bytes
Vektoroperationen auf Listen sind lang: /
Dies ist eine anonyme Lambda-Funktion. Geben Sie einen Namen und rufen Sie wie folgt auf
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.quelle
Python 3,
959088 BytesLösung
Ergebnisse
dank @Zgarb sparen 2 Bytes
Eine rekursive Lösung zum Spaß (95 Bytes)
Ergebnisse
quelle
*([c]+[m])
könnte zu verkürzt werden*[c,m]
.Axiom, 158 Bytes
ungolf es
Ergebnisse
quelle
k, 13 Bytes
Probieren Sie es online!
quelle