Hilfe! Meine Matheprüfung steht kurz bevor und ich habe nicht gelernt! 1 Teil der Prüfung ist es, ein Viereck anhand seiner Scheitelpunktkoordinaten zu klassifizieren, was ich leider nicht kann. 2
Ihre Herausforderung besteht also darin, ein Programm zu schreiben, das dies für mich erledigt, damit ich nicht versage!
Herausforderung
Bestimmen Sie bei vier Scheitelpunkten, von denen keiner kollinear ist, die spezifischste Klassifikation des durch diese vier Scheitelpunkte gebildeten Vierecks.
Was ich unter "spezifischster Klassifizierung" verstehe, ist, dass, obwohl alle Quadrate Rechtecke sind, wenn die Form ein Quadrat ist, Sie angeben sollten, dass es ein Quadrat ist, und nicht, dass es ein Rechteck ist.
Eingang
Die Eingabe erfolgt als vier (x, y) Koordinaten. Sie können diese als eine Liste der Länge 4 von Listen / Tupeln der Länge 2 nehmen. Alternativ können Sie Eingaben als eine Liste der x-Koordinaten und eine Liste der jeweiligen y-Koordinaten nehmen.
Zum Beispiel, wenn meine Form Ecken an den Punkten hat (0, 0)
, (5, 0)
, (6, 1)
, und (1, 1)
kann wählen Sie Eingabe in einem der folgenden Formate oder etwas ähnliches zu nehmen:
[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])
Sie können davon ausgehen, dass sich das Viereck nicht selbst schneidet und die Punkte in der richtigen Reihenfolge angegeben werden (dh zwei aufeinanderfolgende Punkte in der Eingabe werden durch ein Liniensegment im Viereck verbunden).
Ausgabe
Sie benötigen eine eindeutige Ausgabe für jede der folgenden Klassen von Vierecken:
- Platz
- Rechteck
- Rhombus
- Parallelogramm
- Trapez / Trapez
- Drachen
- Viereck
Dies kann der genaue Name selbst, ein Zeichen, eine Ganzzahl usw. sein.
Regeln
- Es gelten Standardlücken
- Wenn Ihre Programmiersprache über eine integrierte Software verfügt, die genau diese Aufgabe ausführt, ist diese integrierte Software nicht zulässig.
- Eingebaute Funktionen zum Ermitteln der Entfernung zwischen zwei Punkten sind zulässig.
- Eingebaute Funktionen zum Ermitteln des Winkels zwischen zwei Linien sind zulässig.
Wenn Sie alle Begriffe kennen, können Sie jetzt mit dem Programmieren beginnen! (Testfälle sind am Ende)
Terminologie
Dieser Abschnitt richtet sich an alle, die Erläuterungen zu den Definitionen der verschiedenen Formen benötigen.
Platz
Ein Viereck ist genau dann ein Quadrat, wenn alle vier Seiten gleich lang sind und jedes Paar benachbarter Seiten senkrecht steht (dh, es ist sowohl ein Rechteck als auch eine Raute).
Rechteck
Ein Viereck ist nur dann ein Rechteck, wenn jedes Paar benachbarter Seiten senkrecht steht.
Rhombus
Ein Viereck ist nur dann eine Raute, wenn alle vier Seiten gleich sind.
Parallelogramm
Ein Viereck ist genau dann ein Parallelogramm, wenn jedes Paar gegenüberliegender Seiten parallel ist und jedes Paar gegenüberliegender Winkel gleich ist. Diese beiden Bedingungen implizieren sich gegenseitig, sodass Sie nur nach einer von ihnen suchen müssen.
Trapez / Trapez
Ein Viereck ist genau dann ein Trapez / Trapez, wenn es mindestens ein Paar paralleler Seiten hat.
Drachen
Ein Viereck ist ein Drachen, wenn zwei gegenüberliegende Paare benachbarter Seiten gleich lang sind. das heißt, zwei seiner benachbarten Seiten sind gleich und die anderen beiden sind ebenfalls gleich.
Testfälle
input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral
Links (Desmos Grafikrechner)
Hier finden Sie Links zu Visualisierungen der einzelnen Testfälle.
Quadratisches
Rechteck
Rhombus
Parallelogramm
Trapez / Trapez
Drachen
Viereck
Gewinnkriterien
Ich kann offensichtlich keinen Computer in die Prüfung einbinden, daher muss der Code so kurz wie möglich sein, damit ich ihn mir merken kann. Ich muss es in die Ränder schreiben und mit TryItOffline TM ausführen, damit es in die Ränder passt. Ihr Programm muss so klein wie möglich sein!
1 Natürlich habe ich tatsächlich getan: P
2 Natürlich habe ich tatsächlich getan: P
Antworten:
APL (Dyalog) ,
104898082817978 BytesProbieren Sie es online!
Input-Output
Nimmt eine 4 × 2-Koordinatenmatrix als Eingabe
Ausgänge
1 1 1
für Platz1 1 0
für Rhombus1 0 1
für Rechteck1 0 0
für Parallelogramm1 0
für Kite0 1
für Trapez0 0
für ViereckAlgorithmus
Ermitteln Sie zunächst alle 4 Seitenlängen und Winkel des Vierecks
Wenn beide Paare entgegengesetzter Winkel gleich sind (
OA
), ist die Form eine Art Parallelogramm. Bestimmen Sie, ob alle Seitenlängen gleich sind (AS
, Benachbarte Seiten) und ob alle Winkel gleich sind (AA
).Wenn nicht
OA
, dann:Bestimmen Sie, ob es genau 2 Paare gleicher benachbarter Seiten gibt und ob sie getrennt sind (
aabb
anstelle vonaaab
). Wenn ja, ist die Form ein Drachen.Stellen Sie fest, ob genau 1 Paar parallele gegenüberliegende Seiten vorhanden sind. Wenn ja, ist die Form ein Trapez.
Ansonsten ist die Form ein Viereck.
Code
⍙←{⍵⍺⍺1⌽⍵}
Definiert einen neuen Operator. In APL bedeutet ein Operator eine Funktion höherer Ordnung . Dieser Operator akzeptiert 1 Funktionsargument (⍺⍺
) und gibt eine monadische Funktion zurück, die:1⌽
) das Argument (⍵
)⍺⍺
dazwischen und⍵
Dies ist besonders nützlich für skalare Funktionen, da die meisten von ihnen implizit über Array-Argumente hinweg abgebildet werden, so
⍙
dass diese zwischen jedem benachbarten Elementpaar mit Umlauf angewendet werden können. Zum Beispiel+⍙1 2 3 4
ist das,1 2 3 4 + 2 3 4 1
was auswertet3 5 7 5
.x←-⍙⎕+.×1 0J1
wandelt die Eingabekoordinatenmatrix in ein Array komplexer Zahlen um, die die Vektoren der vier Seiten der Form darstellen.⎕
Wenn verwiesen wird, werden Eingaben entgegengenommen und zurückgegeben1 0J1
stellt den Vektor [1, i] dar ("Vektor" im mathematischen Sinne und "i" als Quadratwurzel von -1). In APL wird eine komplexe Zahla+bi
geschriebenaJb
+.×
Matrix-Multiplikation. Mathematisch wäre das Ergebnis eine 4 × 1-Matrix. In+.×
APL wird es jedoch "inneres Produkt" genannt, das die Matrixmultiplikation und das innere Vektorprodukt verallgemeinert und es Ihnen ermöglicht, sogar Dinge wie das "Multiplizieren" eines dreidimensionalen Arrays mit einem zweidimensionalen zu tun. In diesem Fall multiplizieren wir eine 4 × 2-Matrix und einen 2-Element-Vektor und erhalten einen 4-Element-Vektor (der komplexen Zahlendarstellungen der 4 gegebenen Eckpunkte).-⍙
ist eine paarweise Subtraktion mit Umlauf, wie oben angegeben. Dies ergibt die Vektoren der 4 Seiten der Form (als komplexe Zahlen). Diese Vektoren zeigen in die "umgekehrte" Richtung, aber das spielt keine Rolle.x←
speichert das in der Variablenx
2|1+-⍙(12○x)÷○1
findet (eine Darstellung von) den Außenwinkeln an den 4 Eckpunkten der Form.12○x
Findet das Hauptargument jedes der 4 Seitenvektoren im Bogenmaß.÷○1
dividiert durch π, damit die Winkel leichter zu bearbeiten sind. Somit werden alle Winkel als Vielfaches eines geraden Winkels ausgedrückt.-⍙
Paarweise Subtraktion mit Umlauf wie oben angegeben. Dies ergibt die 4 Außenwinkel.2|1+
Das Hauptargument ist begrenzt (-1,1] und die paarweise Subtraktion ergibt den Bereich (-2,2]. Dies ist schlecht, da derselbe Winkel zwei verschiedene Darstellungen hat. Wenn Sie "add 1 mod 2" ausführen, wird der Winkel neu berechnet. begrenzt auf (0,2]. Obwohl alle Winkel um 1 höher sind, als es sein sollte, ist es in Ordnung, wenn wir dies berücksichtigen.|x
Findet die Größe jedes der 4 Seitenvektoren{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}
definiert und wendet eine Funktion mit dem Array von 4 Außenwinkeln als rechtem Argument⍵
und dem Array von 4 Seitenlängen als rechtem Argument an⍺
.⍵≡2⌽⍵
ist die Wache.1
wird der nächste Ausdruck≡⍙¨0⍺⍵
ausgeführt und sein Wert zurückgegeben.0
das Ergebnis ergibt, wird dieser Ausdruck übersprungen und der folgende2 4=...=⍙⍺)
wird stattdessen ausgeführt.⍵≡2⌽⍵
prüft, ob beide Paare entgegengesetzter Winkel gleich sind.2⌽⍵
Dreht das Winkelarray um 2 Stellen.⍵≡
prüft, ob das dasselbe ist wie es⍵
selbst≡⍙¨0⍺⍵
Gibt einen eindeutigen Wert für jede Form vom Typ Parallelogramm zurück.0⍺⍵
ist das 3-Element-Array des Skalars0
, des Seitenlängen-Arrays⍺
und des Winkel-Arrays⍵
.≡⍙¨
wird≡⍙
für jedes dieser Elemente ausgeführt.≡⍙
überprüft, ob alle Werte eines Arrays gleich sind, indem überprüft wird, ob durch Drehen um 1 dasselbe Array erhalten wird. Skalare drehen sich nicht und≡⍙0
kehren zurück1
. Wie oben erwähnt, wird≡⍙⍺
nach einer Raute und≡⍙⍵
nach einem Rechteck gesucht.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
Gibt einen eindeutigen Wert für jede nicht parallelogrammartige Form zurück. Dies wird erreicht, indem die Kontrollen für Drachen und Trapez miteinander verflochten werden.2=+/1=2|+⍙⍵
sucht nach einem Trapez.+⍙⍵
gibt die angrenzenden Winkelsummen an. Die Innenwinkel paralleler Linien summieren sich zu einem geraden Winkel, ebenso wie die Außenwinkel paralleler Seiten eines Vierecks. Jedes Paar paralleler Seiten sollte also zu zwei1
oder-1
zu benachbarten Winkelsummen führen.1=2|
Die Winkel in⍵
1 sind jedoch größer als sie sein sollten, sodass die Winkel tatsächlich zu1
oder summieren3
. Dies kann mit "mod 2 gleich 1" überprüft werden.+/
summiert das Array. Dies ergibt eine Zählung benachbarter Winkelsummen, die1
oder ist3
.2=
prüfe ob das gleich 2 ist. (Dh ob es genau ein Paar paralleler Seiten gibt)4=+/1=2|+⍙(=⍙⍺)
sucht nach einem Drachen.(=⍙⍺)
gibt ein Array an, das angibt, welche benachbarten Seiten gleich sind. Im Gegensatz zu≡
,=
Arbeitselementweise. Somit ist dies ein 4-Element-Array mit1
s, wobei die Länge dieser Seite gleich der der "nächsten" Seite ist.+⍙
Paarweise Summe mit umwickeln.1=2|
Da(=⍙⍺)
es sich um ein boolesches Array handelt (eines mit nur0
s und1
s), sind die einzig möglichen Werte der paarweisen Summe0
,1
und2
. Ist1=2|
also genauso wie eben1=
.+/
summiert das Array. Dies ergibt eine Anzahl von paarweisen Summen1
.4=
überprüfen , ob die 4. gleich der einzige Weg, wenn passiert ist ,(=⍙⍺)
ist1 0 1 0
oder0 1 0 1
. Wie oben erwähnt, bedeutet dies, dass die Form ein Drachen ist.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
verflochten die oben genannten Prüfungen.⍵(=⍙⍺)
ist das aus 2 Elementen bestehende verschachtelte Array des Arrays⍵
und des Arrays(=⍙⍺)
↑
Fördert das verschachtelte Array zu einer geeigneten Matrix. Da⍵(=⍙⍺)
es sich um ein 2-Element-Array aus 4-Element-Arrays handelt, ist das Ergebnis eine 2 × 4-Matrix.+⍙
Da⌽
(und damit auch⍙
) die letzte (horizontale) Achse dreht, entspricht+⍙
eine Matrix dem Anwenden+⍙
auf jede Zeile einzeln.1=2|
Sowohl residual / mod (|
) als auch equals (=
) funktionieren auf Elementbasis, sogar für Matrizen.+/
Standardmäßig arbeitet reduct (/
) entlang der letzten (horizontalen) Achse. So+/
Summen entlang Reihen und wiederum eine 2 × 4 - Matrix in ein 2-Elemente einfaches Array.2 4=
Da=
pro Element gearbeitet wird, werden die Drachen- und Trapezbedingungen gleichzeitig überprüft.quelle
Mathematica, 195 Bytes
Mit Leerzeichen:
Ausgänge
1
für Quadrate,2
Rauten,3
Rechtecke,4
Parallelogramme,5
Drachen,6
Trapez und7
alles andere. Ich würde einen TIO-Link posten, aber dies funktioniert anscheinend nicht in Mathematik.Wenn die vier Punkte
P
,Q
,R
, undS
, dann{##,#}
ist{P,Q,R,S,P}
, sos
ist die Liste der Seitenvektoren{Q-P,R-Q,S-R,P-S}
,l
sind die Längen dieser Vektoren undr
die Bedingung , dass der Winkel zwischenQ-P
undR-Q
sowie dem Winkel zwischenR-Q
undS-R
sind beide90
Grad.Wenn also alle Seitenlängen gleich sind, ist das Viereck eine Raute. Wenn es
r
hält, ist es tatsächlich ein Quadrat, ansonsten ist es nur eine einfache Raute.Ausschluss von Rhomben, wenn beide Paare der gegenüberliegenden Seitenlängen gleich sind, dann ist das Viereck immer noch Parallelogramm. Wenn dies
r
zutrifft, handelt es sich tatsächlich um ein Rechteck, andernfalls handelt es sich nur um ein einfaches Parallelogramm.Ohne Parallelogramme ist die Liste der Seitenlängen
l
von der Form{a,b,b,a}
oder{a,a,b,b}
für einige,a
undb
dann ist das Viereck ein Drachen. Beachten Sie, dass es sich nicht zusätzlich um ein Trapez oder eine Raute handeln kann.Parallelogramme und Drachen ausschließen. Wenn das Viereck zwei parallele Seiten hat, ist es ein Trapez. Wir überprüfen dies, indem wir
Normalize
die Seitenvektoren untersuchen und prüfen, ob sich ein Paar entgegengesetzter Vektoren addiert{0,0}
.Ausschluss all der oben genannten, wenn
1 > 0
(es ist besser), dann ist das Viereck nur ein einfaches altes Viereck.quelle
Python 2 ,
463410408397 Bytes53 Bytes mit einem Tupel in der sechsten Zeile gespeichert, anstatt in einer Liste zu indizieren.
Speichert 11 Bytes, indem statt des ersten Buchstabens jeder Form die ganzen Zahlen 1 bis 7 ausgegeben werden. Die ganzen Zahlen entsprechen wie folgt:
Probieren Sie es online!
Ungolfed, um die Logik zu zeigen
Wird als Funktion angezeigt, um die Ausgabe für die verschiedenen Testeingaben anzuzeigen. note Ich habe das Testbeispiel "Rechteck" von dem ursprünglich in der Frage angegebenen geändert, bei dem es sich nicht um ein Rechteck handelte.
Die Logik beruht auf Punktprodukten und der Norm (Länge) der Vektoren, die durch die Seiten des Vierecks gebildet werden, um zu beurteilen, ob die Seiten gleich lang, auf gegenüberliegenden Seiten parallel oder senkrecht zu benachbarten Seiten sind.
Probieren Sie es online!
quelle
[(0, 0), (2, 2), (4, 0), (0,-2)]
als DrachenBatch, 287 Bytes
Ausgänge in binärer Form:
1
= Drachen,10
= Viereck,11
= Trapez,100
= Parallelogramm,101
= Raute,110
= Rechteck,111
= Quadrat. Erklärung:g, h, i, j
sind die Quadrate der Längen der Seiten.p
ist die Anzahl der Paare von gegenüberliegenden Seiten mit der gleichen Länge,q
unterscheidet zwischen Parallelogrammen / Rechtecken und Rhombmen / Quadraten, indem überprüft wird, ob die gegenüberliegenden Paare tatsächlich gleich sind,r
unterscheidet zwischen Parallelogrammen / Rhombmen und Rechtecken / Quadraten über eine Rechtwinkligkeitsprüfung,k
prüft auf a Suchen Sie nach Paaren gleicher benachbarter Seiten und suchen Siet
über ein paar parallele Seitenprüfungen nach einem Trapez.quelle
2=|-.=⍙⍺
. Sieht⍺
auf⍙