Eine weitere leichte Herausforderung für Sie.
Deine Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die die Eingabe übernimmt, die drei Paare von x- und y-Koordinaten enthält und die Fläche des darin gebildeten Dreiecks berechnet. Für diejenigen, die sich nicht erinnern können, wie man es berechnet, finden Sie es hier .
Beispiel:
1,2,4,2,3,7 # input as x1,y1,x2,y2,x3,y3
7.5 # output
Sehen Sie es bei Wolfram Alpha
Einige Überlegungen:
- Die Eingabe besteht aus sechs positiven Ganzzahlen zur Basis 10.
- Sie können davon ausgehen, dass die Eingabe in einem angemessenen Format vorliegt .
- Die Punkte bilden immer ein gültiges Dreieck.
- Sie können davon ausgehen, dass die Eingabe bereits in einer Variablen wie gespeichert ist
t
. - Der kürzeste Code in Bytes gewinnt!
Bearbeiten: Um Verwirrung zu vermeiden, habe ich vereinfacht, wie die Eingabe behandelt werden soll, ohne einen der aktuellen Codes zu gefährden.
Denken Sie daran, dass Ihr Programm / Ihre Funktion einen gültigen Bereich ausgeben muss, damit keine negative Zahl ausgegeben werden kann
[[1, 2], [4, 2], [3, 7]]
) in haben kannT
?[1 2;4 2;3 7]
(mit Julia-Syntax)?Antworten:
CJam,
1816 BytesProbieren Sie es online im CJam-Interpreter aus .
Idee
Wie auf Wikipedia erwähnt , kann die Fläche des Dreiecks
[[0 0] [x y] [z w]]
wie folgt berechnet werden|det([[x y] [z w]])| / 2 = |xw-yz| / 2
.Für ein generisches Dreieck
[[a b] [c d] [e f]]
können wir seinen ersten Scheitelpunkt in den Ursprung übersetzen und so das Dreieck erhalten[[0 0] [c-a d-b] [e-a f-b]]
, dessen Fläche mit der obigen Formel berechnet werden kann.Code
quelle
Mathematica, 27 Bytes
quelle
Partition[t,2]
, was dem2/
in CJam entspricht. ;)JavaScript (ES6)
42.44.Bearbeiten Eingabeformat geändert wird , kann ich 2 Bytes speichern
Eine anonyme Funktion, die das Array als Parameter verwendet und den berechneten Wert zurückgibt.
Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser.
quelle
The input will be a vector with six base 10 positive integers.
Julia, 32 Bytes
Erstellt eine Matrix mit den entsprechenden Begriffen eines Kreuzprodukts, ermittelt
det
daraus den resultierenden Wert, nimmt den absoluten Wert für den Umgang mit Negativen und dividiert ihn dann durch 2, da es sich um ein Dreieck und nicht um ein Parallelogramm handelt.quelle
Matlab / Octave, 26 Bytes
Ich wusste bisher nichts davon eingebaut =)
quelle
Java,
7988 BytesVerwendet nur die Grundformel, nichts Besonderes.
Edit: Vergaß den absoluten Wert zu nehmen :(
quelle
return(t[0]*(t[3]...
sollte es genügen, nein?Minkolang 0,8 , 34 Bytes
Wer will etwas Ei
n0g
?Erläuterung
Sehr einfach. Verwendet die Formel
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.quelle
JayScript , 58 Bytes
Deklariert eine anonyme Funktion:
Beispiel:
quelle
Rubin, 45
quelle
PHP - 68
8889BytesVielen Dank an Martjin für ein paar tolle Hinweise!
Um es zu verwenden, erstellen Sie eine Datei
area.php
mit diesem Inhalt, die zusätzliche Zeile entspricht der Annahme, dass die Daten in einem variablent
Teil der Spezifikation gespeichert sind , und das ␍ am Ende fügt einen Wagenrücklauf hinzu, damit die Ausgabe schön und getrennt ist:Geben Sie dann die Koordinaten in der Befehlszeile ein
x₁ y₁ x₂ y₂ x₃ y₃
, zquelle
t
."$a
->$t
, entfernen Sie$a=$argv;
9 Bytes speichern<?php echo
mit<?=
, weitere 7 Bytes Speicherregister_globals=On
in Ihrerphp.ini
Datei (Standard). Weitere Informationen findenPyth,
3430 BytesProbieren Sie es online aus.
Berechnet abs (a * (df) + c * (fb) + e * (bd)) / 2 aus Eingabe a, b, c, d, e, f.
quelle
R, 37 Bytes
Konvertiert den Koordinatenvektor in eine Matrix und setzt eine Reihe von Einsen aufeinander.
Berechnet die Determinante und dividiert durch 2.
Gibt das absolute Ergebnis zurück. Wenn die Bestellung immer im Uhrzeigersinn war,
abs
wäre das nicht erforderlich.quelle
Python 2,
484750 BytesSehr einfach; folgt der Standardgleichung:
Die anderen, ähnlich einfachen Ansätze sind länger:
Pythons Zugang zu einer bestimmten Funktion erfolgt über Numpy .
Dank an muddyfish für 1 Byte und xnor für das Abfangen eines Fehlers.
quelle
0
von2.0
zu verlassen2.
abs
, um die Antwort positiv zu machen.PHP, 77
Basierend auf der Antwort von @Yimin Rong hatte ich das Gefühl, dass ich es um ein paar Bytes verbessern könnte, indem ich einige Variablen verwende
list()
anstatt sie direkt$argv
abzukürzen. Ebenfallsecho
nicht einen Raum brauchen , wenn Trennzeichen zwischen Echo und das Ding ist Echo wird.echo$variable;
,echo(4+2);
Undecho'some string';
sind gleichermaßen gültig , währendechofunction($variable)
verwirrt PHP.Andererseits habe ich auch hinzugefügt
abs()
, um mathematisch genau zu sein, da einige Kombinationen von Scheitelpunkten "negative Fläche" ergaben.Sie können es über CLI ausführen
quelle
AWK - 51
42BytesAWK hat keine eingebauten
abs
so verwenden, umsqrt(x^2)
zu ersetzen.Speichern als
area.awk
und verwenden alsecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
, zquelle
PowerShell, 70 Bytes
Verwendet die gleiche Standardformel wie andere Lösungen. Pro Frage wird davon ausgegangen, dass das Array vorbestückt ist, z
$t=(1,2,4,2,3,7)
. Aber doof , töten die$
und die[]
Syntax dieses ...quelle
$
und Ihre[]
Anregung haben mich dazu inspiriert, eine AWK-Lösung auszuprobieren, die in ihrer Länge nicht unumstritten ist!Gleichstrom , 52 Bytes
Angenommen, die Eingabe befindet sich im Register
t
als:x1 y1 x2 y2 x3 y3
mitx1
am Anfang dest
Stapels.1 2 4 2 3 7stStStStStSt #puts coordinates into register t (closest thing dc has to variables) 1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p 7.5
Dabei wird die folgende Formel für die Fläche verwendet:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
Und für eine schnelle Aufschlüsselung des Prozesses:
1k Lt Lt sa Lt sb Lt d sc Lt lt r
: Set Dezimalgenauigkeit bis 1 Stelle, Verschieben Teile des Stapelst
zu dem Hauptstapel und verschiedene Teile des Hauptstapels zu anderen Registern für die Speicherung (bewegend
dupliziert die Oberseite des Hauptstapels,r
kehrt sich die oberen beiden Elemente des Hauptstapels,L/l
Bewegung / Kopie aus dem angegebenen Register an main,s
Verschiebt den oberen Bereich des Hauptstapels in das angegebene Register.)Main:
y3 x3 y2 x1
a:,
y1
b:,x2
c:,y2
t:y3
la lc lb lt la
: Die oben auf den Stapel in den Registern kopierena
,c
,b
,t
, unda
auf den Hauptstapel in dieser ReihenfolgeMain:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a:,
y1
b:,x2
c:,y2
t:y3
- * sd
: Berechnen((y3-y1)*x2)
und Put - Ergebnis ind
(Registera
,b
,c
, undt
nicht mehr verwendet werden , so dass ich sie nun aus der Liste der Stapel fallen würde)Main:
y2 y1 y3 x3 y2 x1
d:
((y3-y1)*x2)
- * se - *
: berechnen((y1-y2)*y3)
und((y2-x3)*x1)
; Speichern Sie die ersteren ine
und lassen Sie die letzteren auf dem HauptstapelMain:
((y2-x3)*x1)
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
le ld + +
: Kopieren Sie die Oberseite des Registerse
undd
in den Hauptstapel. Berechnen Sie die Summe der obersten 2 Stapelwerte (drücken Sie das Ergebnis zweimal zurück in den Hauptstapel)Main:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
2 /
: Push 2 auf Hauptstapel teilen auf Stapel 2. Werte durch die 1. (d
unde
nicht mehr verwendet werden, so dass sie aus der Liste von Stapeln dropping)Main:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2
Wenn Sie den Wert im Stapel neu anordnen, sehen Sie, dass er der Formel oben in dieser Erklärung entspricht:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
p
: Druckt die Oberseite des Hauptstapels für die Ausgabe.quelle