Sie versuchen, eine Kugel in eine 5-seitige Box einzupassen, aber manchmal passt sie nicht vollständig. Schreiben Sie eine Funktion, um zu berechnen, wie viel von der Kugel außerhalb (über dem Rand) der Box liegt.
Es gibt 3 mögliche Situationen:
- Die Kugel passt vollständig in die Schachtel. Die Antwort wird 0 sein.
- Die Kugel sitzt am Rand der Schachtel. Die Antwort wird mehr als die Hälfte des Gesamtvolumens sein.
- Die Kugel sitzt auf dem Boden der Kiste.
Sie können jede Situation hier sehen:
Sie müssen ein Programm oder eine Funktion schreiben, um diesen Wert mit mindestens 4 signifikanten Stellen zu berechnen.
Eingabe: 4 nicht negative reelle Zahlen in beliebigem Format * - Breite, Länge, Tiefe der Box (Innenmaße) und Durchmesser der Kugel.
Ausgabe: 1 nicht negative reelle Zahl in einem verwendbaren Format * - das Gesamtvolumen (nicht der Prozentsatz) der Kugel außerhalb der Box.
* muss in / aus einer Dezimalzeichenfolge konvertierbar sein
Es wird empfohlen, die Verwendung der Trigonometrie so weit wie möglich zu beschränken.
Dies ist ein Beliebtheitswettbewerb, denken Sie also über den Tellerrand hinaus!
quelle
Antworten:
Forth
Unten finden Sie eine Kugel außerhalb des Kastens.
Die "Kugel" ist die Volumenberechnungsfunktion
f
. Die Referenz-Testfälle bilden die "Box".Ausgabe:
quelle
Java - ganzzahlig
Dieses Programm verwendet kein pi und ruft keine externe Funktion auf - nicht einmal sqrt. Es verwendet nur einfache Arithmetik -
+
,-
,*
und/
. Abgesehen von einem Skalierungsschritt wird ausschließlich mit ganzen Zahlen gearbeitet. Im Grunde teilt es die Kugel in kleine Würfel und zählt diejenigen, die sich außerhalb des Kastens befinden.Ausgabe:
In dieser Form benötigt das Programm mehr als 2 GB Speicher (funktioniert
-Xmx2300m
hier) und ist ziemlich langsam. Es verwendet den Speicher, um eine Reihe von Quadratwurzeln (arithmetisch) vorab zu berechnen. es ist nicht wirklich notwendig, aber ohne das wäre es viel langsamer. Verringern Sie den Wert derMIN
Konstanten, um sowohl den Speicherbedarf als auch die Geschwindigkeit zu verbessern (dies verringert jedoch die Genauigkeit).quelle
Python 2 (Array-basierter Ansatz)
Es wird ein Array von Arrays mit Wahrheitswerten erstellt, wenn sich ein bestimmtes Quadrat in diesem Raster innerhalb oder außerhalb des Kreises befindet. Je größer der Kreis ist, den Sie zeichnen, desto präziser sollte es werden. Es wählt dann entweder einen Bereich unter oder über einer bestimmten Reihe aus und zählt die Anzahl der Quadrate, die zum Kreis gehören, und dividiert diese durch die Anzahl der Quadrate, die sich im gesamten Kreis befinden.
quelle
Python 2.7, Kugelkalottenformel
Diese Version gibt in einigen Fällen eine Laufzeitwarnung aus, gibt jedoch weiterhin die richtige Antwort aus.
Für 11 Zeichen mehr kann ich die Warnung loswerden.
Hier sind die auf Version 1 ausgeführten Testfälle:
quelle
import numpy as n
zufrom numpy import*
und alle die wegzunehmenn.
in Ihrem Code.Mathematica
Verwenden der numerischen Integration mit geeigneten Grenzen.
quelle
Referenzimplementierung - C #
Ausgabe:
quelle
Rubin
Mal sehen ...
Wenn die Box ganz innen ist, dann Breite> Durchmesser; Länge> Durchmesser und Höhe> Durchmesser.
Das sollte die erste Prüfung sein, die ausgeführt wird.
Wenn es unten sitzt, dann ist w> d; l> d und h
V=(pi*h^2 /3)*(3r-h)
Also in diesem Fall bekommen wir einfach die Höhe und lassen sie durchlaufen.Wenn es nicht weiter geht, verwenden wir eine ähnliche Formel (
V=(pi*h/6)*(3a^2 + h^2)
). Tatsächlich basiert unsere frühere Formel auf dieser! Im Wesentlichen verwenden wir das, und a ist einfach das kleinere von w und l. (Hinweis, wir können Höhe bekommen, indem wir tunh=r-a
)Nun der Code!
Hinweis ** Ich habe es nicht zu oft getestet, daher ist möglicherweise ein Fehler aufgetreten. Wenn jemand einen bemerkt, sagen Sie es!
Die Mathematik ist jedoch solide.
Kürzere Version:
(Jetzt weiß ich sicher, dass es anders ist, h für v2 zu bekommen, aber ich werde es später beheben.
quelle
h=r-a
" Ich habe gerade über die Kugelkalottenformeln nachgelesen , und das Diagramm legt keine so einfache Beziehung nahe. Ich werde es noch einmal lesen.a = wi > le ? le : wi
dass es funktionieren sollte. Ansonsten hast du einen Bug.a = wi>le?le:wi
funktioniert nicht. Ich vermute, es liegt daran, dass ich Git Ruby (2.2 Entwickler) verwende, es könnte ein Ungleichgewicht besagt haben.c ++
Mein Code ermittelt das Volumen des Rotationskörpers des Graphen eines Teils eines Halbkreises.
pdbd
Hält den linearen Abstand der Projektion eines Punktes auf der Oberfläche der Kugel, der die Lippe des Kastens berührt, zum Durchmesser der Kugel, der im ausgefahrenen Zustand normal zum Boden des Kastens ist. Die zwei Ausdrücke, die enthalten,M_PI
sind im Grunde genommen die Anti-Ableitung des Integrals vonpi * -(x^2)+2rx
in Bezug auf x (wobei x ein Maß für die Länge entlang des oben erwähnten Durchmessers durch die Kugel ist und wobei r der Radius der Kugel ist), ausgewertet entweder beipdbd
oder Der Unterschied zwischen Kugeldurchmesser und Kastentiefe hängt vom jeweiligen Fall ab, der bei den verschiedenen Abmessungen auftritt.quelle