Schreiben Sie ein Programm, das zwei Zahlen als Eingabe verwendet. Die erste ist die Anzahl der Dimensionen - 0 für einen Punkt, 1 für eine gerade Linie, 2 für einen Kreis, 3 für eine Kugel. Die zweite Zahl ist der Radius des Objekts oder, wenn es eindimensional ist, die Zahl selbst. 0 für 0 Dimensionen ausgeben. Die Ausgabe ist die Länge / Fläche / das Volumen des Objekts.
Wenn wir die erste n
, die zweite r
und die Ausgabe aufrufen x
, erhalten wir Folgendes:
für n = 0 ist x = 1
für n = 1 ist x = 2 × r
für n = 2 ist x = r 2 × π
für n = 3, x = ( 4 / 3 ) × r 3 × π
und so weiter ... wenn du willst.
Anmerkungen:
Fälle, in denen eine oder beide Zahlen negativ sind oder die erste Zahl nicht ganz ist, müssen nicht behandelt werden.
Das Programm darf keine Daten aus einer Datei lesen. Die einzige Eingabe sind diese beiden Zahlen.
Die Ausgabe sollte nur Ziffern verwenden (z. B. nicht "14 * pi") und auf mindestens zwei Dezimalstellen genau sein.
Wie für n = 0 können Sie 0 ausgeben, wenn dies den Code kürzer macht.
Extra Beute für eine Antwort, die sogar 4 und mehr dimensionale "Kugeln" abdeckt!
Es ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
Beispiele:
1 1 -> 2
2 3 -> 28,27
3 1 -> 4,19
3 4,5 -> 381,70
1 9.379 -> 18.758
0 48 -> 1
== r
ist die Kugel, die Menge der Punkte mit Abstand vom Ursprung<= r
ist die Kugel. Dann sind dies 0-Ball = Punkt, 1-Ball = Segment, 2-Ball = Scheibe, 3-Ball = Ball, 4-Ball, 5-Ball usw. (aufgeführt als "n
-ball = common name").Antworten:
Jelly , 13 Bytes + extra Beute
Probieren Sie es online!
Funktioniert für jede Dimension, solange der feste Wert von π, den
ØP
(3.141592653589793
) liefert, genau genug ist.Wie?
quelle
Mathematica, 18 Bytes, bis zu 168,15 Billionen Dimensionen
Anonyme Funktion. Nimmt zwei Zahlen als Eingabe und gibt eine ungenaue Zahl als Ausgabe zurück. Funktioniert mit beliebig vielen Dimensionen. Ausgaben
1.
für n = 0. Verwendet die Formel aus Volumen eines n-Balls in Wikipedia.Erläuterung
Wir versuchen, π n / 2 / Γ ( n / 2 + 1) · R n oder
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
in Mathematica zu berechnen . In unserem Fall#
(erstes Argument) ist n und#2
(zweites Argument) ist R . Dies lässt uns mitN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, die wie folgt gespielt werden können:und damit unser ursprüngliches Programm.
quelle
!
funktioniert auch für Nicht-Integrale. Mathematica dafür zu benutzen, fühlt sich fast wie Schummeln an… :)JavaScript (ES6), 45 Byte + zusätzlicher Swag
Eine rekursive Formel aus Wikipedia sollte für eine beliebige Anzahl von Dimensionen funktionieren
quelle
R,
754038 Bytes (plus zusätzliche Beute)Nun, es sieht so aus, als könnte ich Golf spielen, indem ich die Gamma-Funktion anstelle von rekursiven Funktionen verwende.
Definiert eine anonyme Funktion zum Berechnen des Volumens einer
n
eindimensionalen Hypersphäre mit Radiusr
.Einige Beispiele:
Swagless Lösung,
3834 BytesFür ein paar Bytes weniger können Sie eine anonyme Funktion haben, die nur für die Dimensionen 1 bis 3 funktioniert. Gibt
numeric(0)
fürn=0
undNA
für zurückn>3
. (numeric(0)
ist ein numerischer Vektor der Länge 0;NA
steht für "nicht verfügbar".) Die Leistung ist ansonsten identisch mit der obigen allgemeinen Lösung.quelle
Haskell,
746536 Bytes + zusätzliche BeuteRekursive Formel, funktioniert für alle Bemaßungen, die genau als Gleitkommazahl mit doppelter Genauigkeit dargestellt werden können, bei nicht ganzzahligen Bemaßungen jedoch eine Endlosschleife ausführen. Die alte Version der Nachwelt zuliebe:
Funktioniert für alle Dimensionen. Verwendet die Formel aus dem Tau-Manifest .product[n,n-2..1.1]
ist ein doppelter faktorieller Hack, für den keine Null gezählt wirdn==2
quelle
JavaScript,
61514943 Bytes0-3-Dimensionen werden unterstützt, da es keine 4. Dimension gibt .
Vielen Dank an @Hedi für das Speichern von 7 Bytes
Erzeugt Funktion
d
. Erhöhtr
dann dien
Potenz und multipliziert sie mit einer Zahl, abhängig von dern
Verwendung von ternären Operatoren. Ausgänge1
fürn=0
Gibt eine Ausgabe mit mindestens 2 Dezimalstellen (10+ dp) aus
Hier ist ein Snack-Schnipsel!
quelle
3 dimensions that behave in the same way and one that behaves in a different way
- An diesem Punkt scheint er zu sagen, dass es eine 4. Dimension gibt, aber keine 1., 2. oder 3.!MATL , 17 Bytes
Dies funktioniert nur bis zu 3 Dimensionen. Die Eingänge sind in umgekehrter Reihenfolge, das heißt:
r
, dannn
.Probieren Sie es online!
Betrachten Sie
r=3
,n=2
als Beispiel.quelle
Java / C / C ++ / C #,
6967 Bytes + zusätzlicher Swag!Bearbeiten: 2 Bytes dank @AlexRacer gespeichert
Eine dyadische Funktion - das erste Argument ist die Anzahl der Dimensionen, das zweite der Radius der n-Kugel.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Rekursive Formel für das Volumen einer n-Kugel: V n = (2πr 2 V n-2 ) ⁄ n
Whoa! Java (meine Testsprache) schlägt hier Scala, dank der knappen
?:
ternären Syntax! Diese Funktion ist in allen 4 Sprachen der Überschrift syntaktisch korrekt, und ich habe sie mit C (MinGW GCC 5.4.0) und C # (VS Ultimate 2016, C # 6.0) getestet. Ich gehe davon aus, dass es auch in C ++ funktioniert, also dort. Da diese Funktion weitgehend bibliotheksunabhängig ist, sollte sie in jeder C-ähnlichen Sprache mit ähnlicher Syntax funktionieren.quelle
n==0
kann aufn<1
und auchn==1
aufn<2
Haskell,
52 Bytes für Tabulatoreinzug42 Bytes + zusätzlicher SwagBearbeiten: 10 Bytes dank @WChargin gespeichert
Eine dyadische Curry-Funktion - das erste Argument ist die Anzahl der Dimensionen, das zweite der Radius der n-Kugel.
Rekursive Formel für das Volumen einer n-Kugel: V n = (2πr 2 V n-2 ) ⁄ n
Speichern Sie diese als separate Skriptdatei und führen Sie sie mit GHCi aus, mit einer Funktion zum Testen der
v
Ausgabe, z.show (v 3 4.5)
. Ich habe dies nicht getestet, bitte lassen Sie mich wissen, wenn dies nicht funktioniert.Altes Programm mit 6.2832-Approximation für 2π ersetzt (50 Bytes mit Tabulatoreinzug):
Dies kann mit GHCi im mehrzeiligen Modus verwendet werden (mit
:set +m
oder Einschließen des Codes zwischen:{
&:}
, wobei sich die Gehäuse in eigenen Zeilen befinden. Testerfunktion erforderlich.Hier kommt die statische Eingabe mit vollständiger Programmtyp-Inferenz ins Spiel, die es Haskell ermöglicht, weitaus bessere Ergebnisse als Scala zu erzielen und Groovy näher zu kommen, diese jedoch dank der Musterübereinstimmung anstelle einer ternären Eingabe nicht ganz zu übertreffen, was einige Zeichenwiederholungen mit sich bringt.
quelle
2*pi
für6.2832
und 47 , wenn Sie die Klammern um den rekursiven Aufruf fallen:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
...let{}
und ersetzen Sie meine Semikolons durch Zeilenvorschübe, um nur 42 Bytes zu erhalten (ohne Zeilenvorschub).Schläger 69 Bytes (plus extra Beute)
Verwendet die rekursive Formel von https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
Mit Vorschlägen von @wchargin
Ungolfed (v = Volumen, d = Abmessungen, r = Radius):
Testen:
Ausgabe:
quelle
v
ist ungültig, da er ungebunden ist (ganz zu schweigen von den anderen Parametern). Sicher müssen Sie das auch zählen(define(v d r))
? Dies bringt Sie auf 82 Bytes ...cond
sparenif
, indem Sie Ihre durch verschachtelte Ausdrücke ersetzen , wodurch Sie auf 78 Bytes mit reduziert werden(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
zu erhalten(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 Bytes + zusätzlicher Swag
Akzeptiert zwei ganze Zahlen n und r nacheinander und gibt dann das n-Volumen für einen gegebenen Radius r einer n-Kugel aus. Wenn n = 0 ist, ist V = 1 und wenn n = 1 ist, ist V = 2r. Alle weiteren Maße berechnen sich nach folgender Formel:
Seit r n in jeder Formel der Radiusfaktor ist, lasse ich ihn aus der Basisberechnung heraus und wende ihn nur am Ende an.
2π wird im Code durch 6.283 angenähert.
quelle
Scala, 53 Bytes
Tut mir leid, kein extra Beute für mich :(
Erläuterung:
quelle
JavaScript (ES6), 39 Byte, kein Swag
quelle
Python 3,
767268 Bytes + zusätzliche Beute!Rekursive Lösung mit extra Beute!
Rückgabe
0
fürn=0
Alter Ansatz (
1
fürn=1
):Rekursive Formel aus Wikipedia .
Probieren Sie es online aus.
quelle
Python 3, 56 Bytes + zusätzlicher Swag!
Einfach mit extra Beute!
Standardformel.
Probieren Sie es online aus
quelle
Scala,
8179 Bytes + extra Beute!Bearbeiten: 2 Bytes dank @AlexRacer gespeichert
Eine dyadische Funktion - das erste Argument ist die Anzahl der Dimensionen, das zweite der Radius der n-Kugel.
def v(n:Int,r:Float):Float=if n<1 1 else if n<2 2*r else 6.2832f*r*r*v(n-2,r)/n
Rekursive Formel für das Volumen einer n-Kugel: V n = (2πr 2 V n-2 ) ⁄ n
Die fehlende Typinferenz von Scala für Rückgabetypen von rekursiven Funktionen und Funktionsparametern und die ausführliche ternäre Syntax tun hier einiges weh :(
quelle
Groovy,
49 Jahrealt47 Bytes + zusätzlicher Swag!Bearbeiten: 2 Bytes dank @AlexRacer gespeichert
Eine dyadische Funktion - das erste Argument ist die Anzahl der Dimensionen, das zweite der Radius der n-Kugel.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Rekursive Formel für das Volumen einer n-Kugel: V n = (2πr 2 V n-2 ) ⁄ n
Dynamisches Tippen FTW!
Meine Scala- und Java-Antworten verwenden dieselbe Logik, aber bei statischer Eingabe sind die Byteanzahlen aufgrund von Typanmerkungen höher :(. Bei Scala und Groovy kann ich jedoch
return
das Semikolon und weglassen , sodass die Byteanzahl im Gegensatz zu Java / C verbessert wird ...quelle
Lithp , 96 Zeichen + extra Beute
Zeile zweigeteilt zur besseren Lesbarkeit:
Ich denke, ich muss meinen Parser aktualisieren, um weniger Speicherplatz zu benötigen. Die Codegröße würde besonders in diesem
((/ (* (* (* (*
Bereich deutlich reduziert .Verwendung:
Vielen Dank an Rudolf, der ein paar Bytes gespart hat.
quelle
3.141592653589793
" auf "3.1416
" kürzen, 11 Bytes sparen und trotzdem in die Regeln passen?CJam (27 Bytes mit extra Guthaben)
Online-Testsuite . Dies ist ein anonymer Block (Funktion), der Argumente akzeptiert
d r
auf dem Stapel entgegennimmt und das Ergebnis auf dem Stapel belässt.Präparation
Die allgemeine n-dimensionale Formel kann wie folgt umgeschrieben werden
quelle