Les sommes de Riemann gauche et droite sont des approximations d' intégrales définies . Bien sûr, en mathématiques, nous devons être très précis, nous visons donc à les calculer avec un certain nombre de subdivisions qui approchent de l'infini, mais ce n'est pas nécessaire aux fins de ce défi. Vous devriez plutôt essayer d'écrire le programme le plus court, en prenant l'entrée et en fournissant la sortie par l'une des méthodes par défaut , dans n'importe quel langage de programmation , ce qui fait ce qui suit:
Tâche
Étant donné deux nombres rationnels et (les limites de l'intégrale définie), un entier positif , un booléen représentant gauche / droite et une fonction boîte noire , calculez la somme de Riemann gauche ou droite (en fonction de ) de , en utilisant subdivisions égales .
Spécifications d'E / S
et peuvent être des nombres ou des fractions rationnelles / à virgule flottante.
peut être représenté par deux valeurs distinctes et cohérentes, mais gardez à l'esprit quevous n'êtes pas autoriséà prendre des fonctions complètes ou partielles en entrée.
est une fonction de boîte noire. En citant la méta-réponse liée ci-dessus,le contenu (c'est-à-dire le code) des fonctions de boîte noire n'est pas accessible, vous pouvez seulement les appeler (en passant des arguments le cas échéant) et observer leur sortie. Si nécessaire, veuillez inclure les informations nécessaires sur la syntaxe utilisée par votre langue afin que nous puissions tester votre soumission.
En sortie, vous devez fournir une fraction rationnelle / virgule flottante / représentant la somme de Riemann qui vous est demandée. Comme discuté dans le passé , l'imprécision en virgule flottante peut être ignorée, tant que votre sortie est précise à au moins trois décimales lorsqu'elle est arrondie au multiple le plus proche de 1/1000 (par exemple, 1.4529999
c'est bien au lieu de 1.453
).
Spécifications mathématiques
est garanti d'être continu entre et (pas de sauts, pas de trous, pas d'asymptotes verticales).
Vous devez gérer trois cas: (le résultat doit être ou ses équivalents), ou .
Si , l'intégrale change de signe. En outre, le bon sens de l'intégrale dans ce cas est vers .
Les zones sous le graphique sont négatives et celles au-dessus du graphique sont positives.
Exemples / cas de test
La résolution n'est pas optimale, car j'ai dû les réduire un peu, mais elles sont toujours lisibles.
, k = droite:
Le résultat doit être , car la largeur de chaque rectangle est et les hauteurs correspondantes sont .
, k = gauche:
La sortie doit être .
, k = droite:
La valeur de sortie attendue est , car l'intégrale change de signe lors du retournement des limites ( ) .
, k = gauche:
En calculant notre somme de Riemann, nous obtenons .
, k = droite - Sortie: .
, k = gauche - Sortie: .
, k = droite - Sortie: . Notez que le sinus utilise des radians ici, mais n'hésitez pas à utiliser des degrés à la place.
f(x) = x * sin(1 / x); a = 0; b = 1; n = 50; k = right — Output: 0.385723952885505. Note that sine uses radians here, but feel free to use degrees instead.
Maintenant que f (x) est une boîte noire, pourquoi est-ce important?Réponses:
R ,
69656357 octetsEssayez-le en ligne!
Prend
k=FALSE
pour les sommes de droite, bien que le lien TIO comprenne maintenant des alias pour "gauche" et "droite" pour une facilité d'utilisation.a+w*(1:n-k)
génère des points appropriés à gauche ou à droite.sapply
S'applique ensuitef
à chaque élément du résultat, que noussum
augmentons ensuite et multiplions par la largeur(b-a)/n
de l'intervalle pour donner le résultat. Ce dernier prend également parfaitement en charge tous les problèmes de signalisation que nous pourrions avoir.la source
SNOBOL4 (CSNOBOL4) , 127 octets
Essayez-le en ligne!
En supposant que la fonction
p
est définie quelque part, cela prenda,b,n,k,(name of p)
, aveck=0
pour droite etl=1
pour gauche.catspaw
SNOBOL4+
prend en chargeREAL
s mais n'a pas de fonctions trig intégrées. Cependant, je suppose que l'on pourrait trouver unesin
fonction raisonnable en utilisant une série taylor.Je ne suis pas sûr à 100% que c'est la "bonne" façon de passer une fonction de boîte noire dans SNOBOL (qui, à ma connaissance, n'a pas de fonctions de première classe), mais cela me semble raisonnable.
Je suppose que si la fonction est définie comme
f
étant plus courte, la lignel
pourrait êtremais alors ce n'est pas passé comme argument, ce qui ressemble un peu à de la "tricherie".
Notez que le lien TIO a un
:(e)
après l'DEFINE
instruction, ce qui permet au code de s'exécuter correctement.la source
Julia 0,6 , 50 octets
Essayez-le en ligne!
Une plage normalisée est construite, collectée dans un vecteur puis mise à l'échelle. La collecte de la plage dans un vecteur à l'aide
[X...]
est nécessaire pour éviter leinexact error
lors de la multiplication directe de la plage par 0 lorsquea=b
. De même, construire une plage directement avec:
ourange()
n'est pas possible quanda=b
.L'utilisation de k est très similaire à la solution de Guiseppe , avec
k=1
pourright
etk=0
pourleft
.la source
f.
vectorisef
sur ses arguments?f.
est une application élémentaire def
.Haskell ,
7367 octetsMerci à H.PWiz et Bruce Forte pour les conseils!
Essayez-le en ligne!
Solution assez simple.
k
est0
pour la gauche et1
pour la droite.la source
b
Python 2 ,
9994 octetsUn peu d'une solution naïve.
Essayez-le en ligne!
la source
JavaScript (Node.js) ,
737159 octetsEssayez-le en ligne!
la source
Gelée , 21 octets
Essayez-le en ligne!
Prendre
a,b
des arguments, etde stdin.
Si vous n'êtes pas familier avec Jelly, vous pouvez utiliser Python pour écrire la fonction de boîte noire
f
:f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = droite
f (x) = √x ; a = 1; b = 2,5; n = 3; k = gauche
f (x) = -3x + 4 + 1/5 * x 2 ; a = 12,5; b = 2,5; n = 10; k = droite
f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = gauche
f (x) = 6 ; a = 1; b = 4; n = 2; k = droite
f (x) = x * sin (1 / x) ; a = 0; b = 1; n = 50; k = droite
Explication:
la source
Perl 6 , 65 octets
Essayez-le en ligne!
Relativement simple. La seule complication est de gérer le
a > b
cas, ce que je fais en xorant le drapeau d'entrée$^k
avec0 > d
, ce qui l'inverse quanda > b
.la source
APL (Dyalog Classic) , 37 octets
Essayez-le en ligne!
APL NARS, 37 caractères
La fonction a l'argument dans la fonction gauche, dans l'argument numérique droit abn k. Dans la question k = laissé ici, cela signifie k = ¯1; k = ici, cela signifie k = 0. Tester:
la source