Golfscript, 71 70 69 caractères
2\!:^2^..292^15.2/3]{(.)2/.9>+{\+.((}*;.}do;;]-1%{^0@{2$*+\}/"/"\n}/;
(Suppose que vous ne passez rien sur stdin)
Je ne veux plus entendre de gémissements de la part de personnes qui n'ont pas de constantes intégrées pour pi. Je n'ai même pas de nombres à virgule flottante!
Voir http://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations pour l'arrière-plan.
# No input, so the stack contains ""
2\!:^2^..292^15.2/3]
# ^ is used to store 1 because that saves a char by allowing the elimination of whitespace
# Otherwise straightforward: stack now contains [2 1 2 1 1 1 292 1 15 7 3]
# Pi as a continued fraction is 3+1/(7+1/(15+1/(...)))
# If you reverse the array now on the stack you get the first 10 continuants followed by 2
# (rather than 3)
# That's a little hack to avoid passing the denominator 1000000
{
# Stack holds: ... [c_n c_{n-1} ... c_0]
(.)2/.9>+
# Stack holds ... [c_{n-1} ... c_0] c_n (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
# (1+c_n)/2 > 9 is an ad-hoc approximation of the "half rule"
# which works in this case but not in general
# Let k = (1+c_n)/2+((1+c_n)/2 > 9 ? 1 : 0)
# We execute the next block k times
{
# ... [c_{n-1} ... c_0] z
\+.((
# ... [z c_{n-1} ... c_0] [c_{n-1} ... c_0] z-1
}*
# So we now have ... [c_n c_{n-1} ... c_0] [(c_n)-1 c_{n-1} ... c_0] ...
# [(c_n)-k+1 c_{n-1} ... c_0] [c_{n-1} ... c_0] c_n-k
;
# Go round the loop until the array runs out
.
}do
# Stack now contains all the solutions as CFs in reverse order, plus two surplus:
# [2 1 2 1 1 1 292 1 15 7 3] [1 2 1 1 1 292 1 15 7 3] ... [6 3] [5 3] [4 3] [3] [2] []
# Ditch the two surplus ones, bundle everything up in an array, and reverse it
;;]-1%
# For each CF...
{
# Stack holds ... [(c_n)-j c_{n-1} ... c_0]
# We now need to convert the CF into a rational in canonical form
# We unwind from the inside out starting with (c_n)-j + 1/infinity,
# representing infinity as 1/0
^0@
# ... 1 0 [c_n-j c_{n-1} ... c_0]
# Loop over the terms of the CF
{
# ... numerator denominator term-of-CF
2$*+\
# ... (term-of-CF * numerator + denominator) numerator
}/
# Presentation
"/"\n
# ... numerator "/" denominator newline
}/
# Pop that final newline to avoid a trailing blank line which isn't in the spec
;
"#{Math.PI}"
.2\!:^2^..292^15.2/3]
m'a déjà époustouflé.Mathematica,
6763Cela ne va pas être rapide, mais je pense que c'est techniquement correct.
Round[π, x]
donne la fraction la plus proche de π par pas dex
. Ceci est "listable", il enRound[π,1/Range@1*^6]
va de même pour toutes les fractions1/10^6
dans l'ordre. La liste résultante avec de nombreuses "mauvaises" approximations rationnelles est ensuite//.
traitée à plusieurs reprises ( ) en supprimant tous les éléments qui sont plus éloignés de π que le précédent.la source
Round[Pi, x]
donne la fraction la plus proche dePi
par pas dex
. Ceci est "listable", il enRound[Pi,1/Range@1*^6]
va de même pour toutes les fractions jusqu'à 1/10 ^ 6 dans l'ordre. La liste résultante avec de nombreuses "mauvaises" approximations rationnelles est ensuite répétée (//.
) en supprimant tous les éléments qui sont plus éloignés de pi que le précédent.Select[Round[f=Pi,1/Range@1*^6],If[#<f,f=#;True]&@Abs[#-Pi]&]
... mais inutile étant donné le biais dominantPerl, 77 caractères
Un défi mineur est que Perl n'a pas de constante π intégrée disponible, donc j'ai d'abord dû la calculer comme
atan2(0,-1)
. Je suis sûr que cela sera battu par des langues plus adaptées à l'emploi, mais ce n'est pas mauvais pour une langue principalement conçue pour le traitement de texte.la source
999999
pour1e6
et sauver 3 caractères.String found where operator expected at prog.pl line 1, near "say"$=/$_""
-M5.01
commutateur (et Perl 5.10.0 ou version ultérieure) pour lasay
commande. Désolé de ne pas l'avoir mentionné.Python,
969389 caractèresPython,
9593 caractères, algorithme différentnote: Il y avait moins de caractères à écrire
p=3.14159265359;
quefrom math import*
. Darn ces importations verbeuses!la source
1.0
->1.
,10**6
->1e6
JS (95 caractères)
Il imprime 167 lignes.
la source
Ruby 1.9, 84 caractères
la source
C99, 113 caractères
Besoin de compiler avec
-lm
, et probablement plein de comportements non définis, mais cela fonctionne pour moi.la source
Scala - 180 caractères
// non golfé: 457
L'annotation tailrec n'est qu'une vérification, pour vérifier, qu'elle est récursive, ce qui est souvent une amélioration des performances.
la source
pi.scala:1 error: not found: value math
math
parMath
peut être suffisant. J'ai mentionné simplyscala sur ce métathread, s'il vous arrive de le rechercher à nouveau: meta.codegolf.stackexchange.com/a/401/373Mathematica
1817 caractèresJ'ai choisi d'utiliser, comme mesure du «meilleur», le nombre de termes dans une représentation de fraction continue de π. Selon ce critère, les meilleures approximations rationnelles de π sont ses convergentes.
Il existe 10 convergents de π avec un dénominateur inférieur à un million. C'est moins que les 167 conditions demandées, mais je l'inclus ici car cela peut intéresser les autres.
Si vous voulez vraiment voir le dénominateur du premier convergent, il vous en coûtera 11 caractères supplémentaires:
Pour ceux qui sont intéressés, ce qui suit montre les relations entre les convergents, les quotients partiels et l'expression continue des fractions des convergents de π:
Veuillez excuser la mise en forme incohérente des fractions continues.
la source
C #
140129 caractèresCode non compressé
la source
var
n'est pas toujours ton ami. En le supprimant en votre faveur,double
vous avez la possibilité de fusionner des déclarations, vous n'avez plus besoin d'utiliser des doubles littéraux et vous pouvez enregistrer 16 caractères. OTOH, la question demande un programme, vous en perdrez donc quelques uns en ajoutant une déclaration de classe et uneMain
méthode.J,
6965Nouveau
Toujours une approche brutale mais beaucoup plus rapide et un peu plus courte.
Vieux
Une simple "force brute":
faire une liste de
a/b
s puis éliminer ceux qui sont plus éloignés de π pour certainsb'<b
.Remarque: passez
1e3
à1e6
pour la liste complète. Allez faire autre chose et revenez plus tard.la source