Ein Berg ist definiert als eine Menge von Liniensegmenten, deren erster Punkt Koordinaten hat, (0,a)
wo a > 0
und deren letzter Punkt Koordinaten hat (b,0)
, wo b > 0
. Alle Zwischenpunkte haben eine y-Koordinate (Ordinate), die streng grĂśĂer als 0 ist. Sie erhalten die Punkte auf dem Berg in aufsteigender Reihenfolge der x-Koordinate (Abszisse) sortiert. Beachten Sie, dass zwei Punkte dieselbe x-Koordinate haben kĂśnnen, wodurch ein vertikaler Abschnitt des Berges erzeugt wird. Wenn Sie zwei Punkte mit derselben x-Koordinate erhalten, sollten diese in der angegebenen Reihenfolge verbunden werden. AuĂerdem kann es horizontale Segmente des Berges geben. Diese horizontalen Segmente werden auf keinen Fall beleuchtet. Alle Koordinaten sind nicht negative Ganzzahlen.
Die Frage: Was ist die Gesamtlänge des Berges, der beleuchtet werden wßrde, vorausgesetzt, die Sonne ist eine unendliche vertikale Lichtebene rechts vom Berg? Diese Zahl muss nicht gerundet werden. Wenn sie jedoch gerundet ist, mßssen mindestens vier Dezimalstellen angegeben werden. Ich habe ein Bild beigefßgt: Hier stellen die Linien, die fett gedruckt sind, die Segmente dar, die beleuchtet sind. Beachten Sie, dass P in der Eingabe vor Q steht (PQ ist ein vertikales Liniensegment), sodass der vorherige Punkt mit P und nicht mit Q verbunden ist.
Sie kĂśnnen Eingaben in jedem vernĂźnftigen Format vornehmen, z. B. in Form einer Liste von Listen, einer einzelnen Liste, einer Zeichenfolge usw.
Testfall:
(0,3000)
(500, 3500)
(2500, 1000)
(5000,5000)
(9000,2000)
(9000,3500)
(10200,0)
Output: 6200.0000
Hier gibt es zwei beleuchtete Segmente, wie in diesem Bild gezeigt: Das erste hat eine Länge von 5000/2 = 2500 und das zweite eine Länge von 3700.
Das ist Code-Golf , also gewinnt die kĂźrzeste Antwort in Bytes.
(x1, y1)
und(x2,y2)
. den Punkt, wird als âBlockierenâ ist(x3, y3)
. es sei angenommen , y2 <y3 <= y1. Dann wird die Länge des Segments((y1 - y3)/(y1 - y2))*sqrt((x1 - x2)^2 + (y1 - y2)^2)
. Dies ist im wesentlichen der Entfernungsformel, multipliziert mit dem Bruchteil des tatsächlich verwendeten SegmentsAntworten:
Python 2 ,
 134 131 128 124 120 117 109Â107 BytesProbieren Sie es online!
Ăbernimmt die Eingabe als Liste von Tupeln / Listen mit zwei Elementen von Gleitkommazahlen.
Erläuterung
for
Mathematik - Welcher Teil des Liniensegments ist Licht ausgesetzt?
Durch Verbinden der beiden Formeln erhalten wir den folgenden Ausdruck, der den Kern dieses Ansatzes bildet:
Code - Wie funktioniert es?
Ănderungsprotokoll
Allmählich die Formel fßr Golfzwecke optimiert.
1 Byte dank FlipTack gespeichert .
2 Bytes gespart durch Entfernen der unnĂśtigen Bedingung, dass diese Bedingung redundant ist
y>Y
, wenn die lokalen Maxima der Y- Koordinate nach dem aktuellen Punkt, von dem abgezogen wurde,y
positiv sind. Dies macht das Golfspiel von FlipTack leider ungĂźltig.Einsparung von 3 Bytes durch geringfĂźgige Ănderung des Algorithmus: Anstatt eine Zählervariable zu haben, diese zu erhĂśhen und die Liste zu erweitern, wird bei jeder Iteration das erste Element entfernt.
8 Bytes dank ovs gespart ; Ăndern
(x,y),(X,Y)
der Schleifenbedingung mit einerlist.pop()
Technik.2 Bytes gespart dank Ărjan Johansen (Formel etwas optimiert).
quelle
JavaScript, 97 Bytes
(5 Bytes kĂśnnen gespeichert werden, wenn die Verwendung der umgekehrten Eingabeversion als gĂźltig angesehen wird.)
quelle
APL + WIN, 48 Bytes
Fordert zur Eingabe einer Liste mit x-Koordinaten gefolgt von einer Liste mit y-Koordinaten auf
Erläuterung
Die beleuchteten vertikalen Abstände = h und die beleuchteten horizontalen Abstände betragen (3) * (1) / (2). Der Rest ist Pythagoras.
quelle
+/.5*â¨(h*2)+Ăâ¨((hâ-2-/â\m)á-2-/mââ˝â)Ăâ˝-2-/â
funktionierenâ¨
Operator, daher kann ich nicht sagenSchnell , 190 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 2 ,
122120 BytesProbieren Sie es online!
quelle
[::-1]
.Python 2 , 89 Bytes
Probieren Sie es online!
Nimmt eine Liste von Schwimmerpaaren auf. Basierend auf der LĂśsung von ovs .
quelle
[::-1]
.APL (Dyalog Unicode) , 31 Byte SBCS
Verwendet Grahams Formel .
Anonyme Präfixfunktion, die eine 2 à n-Datenmatrix als rechtes Argument verwendet. Die erste Zeile enthält x-Werte von rechts nach links und die zweite Zeile die entsprechenden y-Werte.
Probieren Sie es online!
{
âŚ}
âAnonymer Lambda woâľ
ist das Argument:â
2-/âľ
âDeltas (paarweise minus-Reduktionen)â
áâż
âÎx â Îy (lit. vertikale Teilungsreduktion)â
Ăâ¨
âQuadrat (Lit. Multiplikation Selfie)â
1+
âman fĂźgte hinzuâ
(
âŚ)Ă
âMultipliziere folgendes damit:ââ
2âˇâľ
âzweite Zeile des Arguments (die y-Werte)ââ
â\
âLaufmaximum (hĂśchste bisher erreichte HĂśhe von rechts)ââ
2-/
âDeltas von (paarweise minus-Reduktion)ââ
Ăâ¨
âQuadrat (Lit. Multiplikation Selfie)â
.5*â¨
Quadratwurzel (wĂśrtlich: halbe Potenz)â
+/
âSummequelle
Jelly , 23 Bytes
Ein dyadischer Link mit einer Liste von y-Werten links und einer Liste der entsprechenden x-Werte rechts (wie vom OP in Kommentaren ausdrĂźcklich erlaubt)
Probieren Sie es online!
Wie?
Der Bruchteil eines (abfallenden) Abschnitts, der beleuchtet wird, ist derselbe Bruchteil, der beleuchtet wßrde, wenn es sich um einen vertikalen Abfall handeln wßrde. Beachten Sie, dass die berechneten HÜhen auf dem Weg negativ sein kÜnnen, da eine Quadrierung auftritt, um die Neigungslängen zu bewerten (auch im Folgenden werden die Lauflängen der beleuchteten Neigungen als negativ geteilt durch negativ berechnet).
25-Byte-Monadic-Version mit einer Liste von
[x,y]
Koordinaten:Probier diese.
quelle
â¸
s undâš
s.Kotlin , 178 Bytes
Probieren Sie es online!
Der Testteil ist sehr viel nicht golfen :)
quelle