Écrivez un programme qui prend deux nombres en entrée. Le premier est le nombre de dimensions - 0 pour un point, 1 pour une ligne droite, 2 pour un cercle, 3 pour une sphère. Le deuxième nombre est le rayon de l'objet ou, s'il est unidimensionnel, le nombre lui-même. Sortie 0 pour 0 dimensions. La sortie est la longueur / surface / volume de l'objet.
Si nous appelons le premier numéro n
, le second r
et la sortie x
, nous obtenons cela:
pour n = 0, x = 1
pour n = 1, x = 2 × r
pour n = 2, x = r 2 × π
pour n = 3, x = ( quatre / 3 ) × r 3 × π
et ainsi de suite ... si vous voulez, cependant.
Remarques:
Les cas où un ou les deux nombres sont négatifs, ou lorsque le premier nombre n'est pas entier, n'ont pas besoin d'être couverts.
Le programme ne doit lire aucun fichier et les seules entrées sont ces deux nombres.
La sortie doit utiliser uniquement des chiffres (par exemple pas "14 * pi") et doit être précise à au moins deux chiffres décimaux.
Quant à n = 0, vous pouvez sortir 0 s'il raccourcit le code.
Un butin supplémentaire pour une réponse couvrant même des "sphères" de 4 dimensions et plus!
C'est le golf de code , donc la réponse la plus courte en octets gagne!
Exemples:
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
est la sphère, l'ensemble des points à distance de l'origine<= r
est la balle. Alors ce sont 0-ball = point, 1-ball = segment, 2-ball = disque, 3-ball = ball, 4-ball, 5-ball, et c. (répertorié comme "n
-ball = nom commun").Réponses:
Gelée , 13 octets + butin supplémentaire
Essayez-le en ligne!
Fonctionne pour n'importe quelle dimension, tant que la valeur fixe de π fournie par
ØP
(3.141592653589793
) est suffisamment précise.Comment?
la source
Mathematica, 18 octets, jusqu'à ~ 168,15 billions de dimensions
Fonction anonyme. Prend deux nombres en entrée et renvoie un nombre inexact en sortie. Fonctionne avec n'importe quel nombre de dimensions. Sorties
1.
pour n = 0. Utilise la formule du volume d'une n-boule sur Wikipedia.Explication
Nous essayons de calculer π n / 2 / Γ ( n / 2 + 1) · R n , ou
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
en Mathematica. Dans notre cas,#
(premier argument) est n et#2
(second argument) est R . Cela nous laisse avecN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, qui peut être joué comme suit:et donc, notre programme original.
la source
!
marche aussi pour les non-intégrales. Utiliser Mathematica pour cela ressemble presque à de la triche… :)JavaScript (ES6), 45 octets + swag supplémentaire
Formule récursive de wikipedia , devrait fonctionner pour n'importe quel nombre de dimensions
la source
R,
754038 octets (plus un swag supplémentaire)Eh bien, on dirait que je pourrais jouer au golf en cédant et en utilisant la fonction gamma plutôt que les fonctions récursives.
Définit une fonction anonyme pour calculer le volume d'une
n
hypersphère dimensionnelle de rayonr
.Quelques exemples:
Solution sans swag,
3834 octetsPour quelques octets de moins, vous pouvez avoir une fonction anonyme qui ne fonctionne que pour les dimensions 1 à 3. Renvoie
numeric(0)
pourn=0
etNA
pourn>3
. (numeric(0)
est un vecteur numérique de longueur 0;NA
est pour "non disponible".) Les performances sont par ailleurs identiques à la solution générale ci-dessus.la source
Haskell,
746536 octets + swag supplémentaireFormule récursive, fonctionne pour toutes les dimensions qui peuvent être présentées exactement comme un nombre à virgule flottante double précision, mais bouclera à l'infini pour les dimensions non intégrales. L'ancienne version pour la postériorité:
Fonctionne pour toutes les dimensions. Utilise la formule du manifeste tau .product[n,n-2..1.1]
est un hack factoriel double qui ne comptera pas zéro pourn==2
la source
JavaScript,
61514943 octetsLes dimensions 0-3 sont prises en charge car il n'y a pas de 4e dimension .
Merci à @Hedi pour avoir économisé 7 octets
Crée une fonction
d
. Augmenter
ensuite lan
puissance e puis la multiplie par un nombre en fonction desn
opérateurs ternaires. Sorties1
pourn=0
Donne la sortie à au moins 2 décimales (10+ dp)
Voici un extrait de collation!
la source
3 dimensions that behave in the same way and one that behaves in a different way
- À ce stade, il semble dire qu'il y a une 4ème dimension, mais pas de 1ère, 2ème ou 3ème!MATL , 17 octets
Cela fonctionne jusqu'à 3 dimensions seulement. Les entrées sont dans l'ordre inverse, c'est-à-dire:,
r
alorsn
.Essayez-le en ligne!
Considérez
r=3
,n=2
par exemple.la source
Java / C / C ++ / C #,
6967 octets + swag supplémentaire!Edit: sauvé 2 octets grâce à @AlexRacer
Une fonction dyadique - le premier argument est le nombre de dimensions, le second est le rayon de la n-boule.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Formule récursive pour le volume d'une n-boule: V n = (2πr 2 V n-2 ) ⁄ n
Whoa! Java (mon langage de test) bat Scala ici, grâce à la
?:
syntaxe ternaire laconique ! Cette fonction est syntaxiquement correcte dans les 4 langues de l'en-tête, et je l'ai testée avec C (MinGW GCC 5.4.0), et C # (VS Ultimate 2016, C # 6.0). Je suppose que cela fonctionnera également en C ++, donc là. Étant donné que cette fonction est à peu près indépendante de la bibliothèque, elle devrait fonctionner dans n'importe quel langage de type C avec une syntaxe similaire.la source
n==0
peut être raccourci àn<1
et aussin==1
àn<2
Haskell,
52 octets pour le retrait de tabulation42 octets + swag supplémentaireEdit: 10 octets enregistrés grâce à @WChargin
Une fonction cury dyadique - le premier argument est le nombre de dimensions, le second est le rayon de la n-boule.
Formule récursive pour le volume d'une n-boule: V n = (2πr 2 V n-2 ) ⁄ n
Save this as a separate script file and run with GHCi, with a function for testing
v
for output, e.g.,show (v 3 4.5)
. I did not test this, please let me know if this doesn't work.Old program with 6.2832 approximation for 2π replaced (50 bytes with tab indent):
This can be used with GHCi in multiline mode (using
:set +m
or enclosing the code between:{
&:}
, the enclosures being on their own lines. Tester function required.Static typing with full-program type inference comes into play here, allowing Haskell to do far better than Scala, and approaching Groovy, but not quite beating it thanks to the pattern match instead of a ternary, involving some character repetition.
la source
2*pi
for6.2832
, and 47 if you drop the parentheses around the recursive call:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
…let{}
and replace my semicolons with linefeeds to get just 42 bytes (without trailing newline).Racket 69 bytes (plus extra swag)
Uses recursive formula from https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
Including suggestions by @wchargin
Ungolfed (v=volume, d=dimensions, r=radius):
Testing:
Output:
la source
v
n'est pas liée (sans parler des autres paramètres). Vous devez sûrement compter(define(v d r))
aussi? Cela vous amène à 82 octets…cond
with nestedif
expressions, bringing you down to 78 bytes with(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
to get(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 bytes + extra swag
Accepts two integers n and r, one at a time, then outputs the n-volume for given radius r of an n-sphere. When n = 0, V = 1, and when n = 1, V = 2r. All further dimensions are calculated by the following formula:
Since rn is the radius's factor in every formula, I leave it out of the base calculation and only apply it at the end.
2π is approximated in the code by 6.283.
la source
Scala, 53 bytes
Sorry, no extra swag for me :(
Explanation:
la source
JavaScript (ES6), 39 bytes, no swag
la source
Python 3,
767268 bytes + extra swag!Recursive solution with extra swag!
Returns
0
forn=0
Old approach (
1
forn=1
):Recursive formula from Wikipedia.
Try it online.
la source
Python 3, 56 bytes + extra swag!
Straightforward with extra swag!
Standard formula.
Try it online
la source
Scala,
8179 bytes + extra swag!Edit: Saved 2 bytes thanks to @AlexRacer
A dyadic function - first argument is number of dimensions, second is the radius of the n-ball.
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
Recursive formula for the volume of an n-ball: Vn=(2πr2Vn-2)⁄n
Scala's lack of type inference for return types of recursive functions and function parameters and verbose ternary syntax hurts quite a bit here :(
la source
Groovy,
4947 bytes + extra swag!Edit: Saved 2 bytes thanks to @AlexRacer
A dyadic function - first argument is number of dimensions, second is the radius of the n-ball.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Recursive formula for the volume of an n-ball: Vn=(2πr2Vn-2)⁄n
Dynamic Typing FTW!
My Scala and Java answers use the same logic, but with static typing so higher byte counts due to type annotations :(. However, Scala and Groovy allow me to omit the
return
and the semicolon, so that helps the byte count, unlike Java/C...la source
Lithp, 96 characters + extra swag
Line split in 2 for readability:
Thinking I need to upgrade my parser to require less spaces. Code size would be cut down nicely, especially in that
((/ (* (* (* (*
section.Usage:
Thanks to Rudolf for shaving a few bytes off.
la source
3.141592653589793
" to "3.1416
", saving 11 bytes and still fitting into the rules?CJam (27 bytes with extra credit)
Online test suite. This is an anonymous block (function) which takes arguments
d r
on the stack and leaves the result on the stack.Dissection
The general n-dimensional formula can be rewritten as
la source