Bezogen auf diese Frage .
Ein Raum ist definiert als ein (nicht notwendigerweise konvexes) nicht schneidendes Polygon, das als geordnete Liste von zweidimensionalen Koordinaten ausgedrückt wird. Eine ausreichend helle Glühbirne wird an einer bestimmten Stelle im Raum platziert und strahlt Licht in alle Richtungen aus. Ihre Aufgabe ist es, die gesamte beleuchtete Fläche des Raums zu finden. Sie können Eingaben in jedem vernünftigen Format vornehmen. Die Punkte auf dem Polygon / Raum sowie die Koordinaten der Lichtquelle sind rationale Zahlen. Sie können im oder gegen den Uhrzeigersinn aufgenommen werden, jedes Format ist in Ordnung. Der Testfall im Problem wird gegen den Uhrzeigersinn angegeben.
Das folgende Bild zeigt zwei Beispielräume, in denen der violette Punkt die Lichtquelle und der schattierte Bereich den beleuchteten Bereich darstellt.
Testfall:
(1/2, 18)
(1,3)
(5,1/2)
(7,5)
(12,7)
(16,3)
(15,11)
(8,19)
(3,7)
Light source located at (5,8)
Answer: 815523/6710 ≈ 121.538
Hier ist eine grafische Darstellung der Lösung für diesen Testfall. Die zwei Punkte, die die Lösung definieren, die sich nicht auf dem ursprünglichen Polygon befinden, sind (55/61, 363/61) und (856/55, 357/55).
Diese Formel kann bei der Berechnung der Fläche hilfreich sein.
Da es sich um Code-Golf , der kürzeste Code in Bytes gewinnt.
[tag:code-golf]
Antworten:
Python 3 , 388
398408409415417493BytesErhöhen Sie, um die Genauigkeit zu erhöhen
n
Grundlegender Monte-Carlo-Ansatz. Schritte unten aufgeführt.
s
s
durch die Gesamtzahl und multiplizieren Sie dann mit der gesamten Reichweite.Ungolfed-Version:
Probieren Sie es online!
Gutschrift für den Linienschnittalgorithmus
Wir danken auch allen hilfreichen Kommentatoren, die erklärt haben, wie Sie dies noch weiter verbessern können.
quelle
from random import*
(Zeilenumbruch)u=uniform
für -2 Bytes werdeng=lambda i:
n
eine Potenz von 10 sein? Andernfalls können Sie ein Byte mit einer Potenz von 9 speichern.i:(min
kann auch das Leerzeichen beix[i]for
entfernt werden. Auchreturn float(s/n)*(r*t)
kannreturn(r*t)*float(s/n)
. Und ich bin nicht ganz sicher, können aber nicht die Variablenr
unde
werden direkt entfernt und verwendet, da man sie nur einmal benutzen? Es gibt irgendwie ein etwas anderes Ergebnis, obwohlg
es nicht geändert wurde, so dass mich dieser Teil ein bisschen verwirrt (ich bin nicht zu vertraut mit Python, um zu verstehen, warum das Ergebnis etwas anders ist).Haskell , 559
618632BytesGenaue Lösung (außer bei Fehlern). Haskell hat eine exakte rationale Arithmetik eingebaut. Probieren Sie es online!
Beachten Sie, dass dies
815523/6710
nicht814643/6710
für den Beispielraum gilt und der erste Wandschnitt wie folgt berechnet wird(55/61, 363/61)
. Ich bin mir ziemlich sicher, dass dies richtig ist, da der Monte-Carlo-Eintrag (langsam) zum gleichen Ergebnis konvergiert.Legende:
Bonus: Gloss GUI zum Testen. Klicken Sie neben Punkte, um sie zu verschieben.
quelle
APL + WIN
Dies ist eine ungelöste Version dieser interessanten Herausforderung, die ich anbiete, um meine Logik zu demonstrieren. Meine alte Version von APL + WIN eignet sich nicht gut zum Golfen von verschachtelten Kontrollstrukturen. Modernere APLs könnten es besser machen - herausfordern?
Wenn die Leser die Logik bestätigen, werde ich versuchen, diese Lösung zu nutzen. Wenn die Logik falsch ist, werde ich einfach löschen.
quelle
R ,
296255 ByteProbieren Sie es online!
Dies ist eine weiter reduzierte Version der Python-Antwort . Die Monte-Carlo-Kernmethode ist dieselbe, aber ich habe einige Funktionen neu angeordnet, um sie kürzer zu machen. In meiner ersten Iteration war ich bei der Neuanordnung zu aggressiv gewesen, und dann wurde mir klar, dass ich sowohl Länge als auch Geschwindigkeit optimieren konnte, indem ich zu einer Version des Schnittalgorithmus zurückkehrte, die näher am Python lag.
Hier ist eine ungolfed Version, die auch die Ergebnisse aufzeichnet:
quelle