Donc, vous étiez assis à votre bureau, jouant à un programme pour calculer les 20 premiers chiffres de pi, et votre patron arrive et jette votre pomme IIe par la fenêtre. Vous travaillez maintenant sur un nouveau projet et cet ordinateur n'a pas encore de capacité de texte. Aucun. Pas de polices. Rien.
Maintenant, terminons ce programme. Calculez et affichez les 20 premiers caractères de pi sans utiliser de polices qui ne font pas partie de votre programme. Votre sortie peut être affichée ou écrite en sortie standard sous forme de fichier image (jpeg, png, gif, svg (tant que vous n'utilisez aucun caractère), bmp, xpm). Vous pouvez utiliser n'importe quelle langue, mais vous ne pouvez pas utiliser les fonctions de police, l'affichage de texte ou similaire de votre langue.
petit bonus (10 caractères) Si cela fonctionnera sur une Lisa.
Edit: pour ceux qui ne l'ont pas compris, mon inspiration était le premier mac, et le titre est un jeu de mots. Un grand bravo à @Sukminder dont le gif animé est juste cool. Le concours n'est pas terminé si une meilleure réponse arrive.
la source
Réponses:
Python, 222 caractères
La première ligne calcule les chiffres de pi en utilisant l'approximation
pi-3 ~= 277991633/1963319607
. Les trois lignes suivantes produisent 20 caractères de pi en utilisant l'art ASCII Nemeth Braille.Je repousse les limites dans deux directions ici, à la fois dans les sens "calculant Pi" et "lisible par l'homme".
la source
*
espaces et les espaces sans police?*
comme un pixel noir 1x1 et `` comme un pixel blanc 1x1.*
sans utiliser de polices, je pense que vous êtes disqualifiéPython, 217 octets
Nécessite la bibliothèque d'imagerie Python
Le nombre d'octets suppose que le caractère échappé
\177
est remplacé par son équivalent littéral (caractère 127 ).La sortie apparaîtra comme suit (elle s'ouvrira dans votre visionneuse * .bmp par défaut):
Notez que cela pourrait facilement être paramétré pour imprimer autant de chiffres que vous le souhaitez. Ce qui suit acceptera une entrée entière de stdin et affichera autant de chiffres:
Sortie pour n = 80 :
Calcul Pi
Ouais, c'est tout. La formule utilisée est le résultat de l'application de la transformation d' Euler à la série Leibniz , puis de la factorisation de chaque terme du reste de la somme. La formule converge linéairement; chaque chiffre nécessite log 2 (10) ≈ 3,32 itérations. Pour ceux qui s'intéressent à la dérivation, voir l'annexe A.
Afficher
PIL est utilisé pour la génération d'images, car c'est la bibliothèque la plus pratique que je connaisse. Une image bitmap noir et blanc 141 × 11 vierge est créée, puis des lignes blanches sont dessinées dessus en sept segments, un pixel à la fois. Les positions requises pour dessiner chaque segment sont stockées dans une chaîne de masque de bits, avec des bits correspondant aux positions suivantes:
Le peu de magie
(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)
produit chaque pixel dans l'ordre suivant (base-18):Annexe A
La transformation d'Euler est une technique d'accélération de convergence qui fonctionne pour n'importe quelle série qui affiche une convergence monotone absolue. La série résultante convergera linéairement, généralement à la vitesse d'un bit par terme (notez que si la série d'origine était déjà super-linéaire, la série résultante convergera en fait plus lentement). La description purement mathématique est un peu difficile à suivre, je vais donc adopter une approche procédurale.
Commençons par la série Leibniz:
Divisez ensuite chaque terme en deux en combinant les termes voisins:
Simplifié:
Généralisé:
Notez que le premier ½ n'avait pas de terme partenaire et était donc exclu du reste de la somme. Il s'agit du premier terme de la série transformée. Pour trouver le terme suivant, nous répétons le processus à nouveau:
Et encore:
Et encore:
Et encore une fois pour faire bonne mesure:
À ce stade, nous avons les cinq premiers termes, et le sixième terme est évident. Cela devrait être suffisant pour généraliser, alors nous nous arrêterons ici. Nous commencerons par factoriser les numérateurs et les dénominateurs:
Les dénominateurs contiennent évidemment un double factoriel de 2n + 1 , nous allons donc corriger cela dans:
Tout va bien, sauf pour les deux premiers termes qui ont un inexpliqué pour 2 dans le dénominateur. Nous pouvons résoudre ce problème en multipliant l'expression entière par 2 :
2 3 = 2 · 4 , donc:
Le numérateur peut maintenant être facilement identifié comme n! .
Notez que le facteur ajouté à chaque terme successif, n / (2n + 1) , approche ½ lorsque n devient grand, ce qui implique une convergence linéaire au rythme d'un bit par terme - c'est en fait par conception. Un bon résultat, mais ce serait encore plus agréable sans les factoriels. Ce que nous pouvons faire ici est de factoriser chaque terme successif du reste de la somme, ce qui générera une expression imbriquée:
Cela peut être réécrit comme une relation de récurrence:
Où n compte à rebours à partir de ⌈ log 2 (10) · d ⌉ .. 0 , où d est le nombre de chiffres requis.
Il peut être intéressant de noter que le point stable de cette récurrence est exactement 2 (ou 4 si vous l'avez doublé, comme je l'ai fait dans l'implémentation ci-dessus), vous pouvez donc enregistrer un certain nombre d'itérations en l'initialisant correctement. Cependant, initialiser à une valeur aléatoire dont vous avez besoin ailleurs, et lancer quelques itérations supplémentaires sur le dessus est généralement moins cher en octets.
la source
p
inp/2 * x/p + ...
. AIUI Python prend en charge la promotion automatique vers un type de données de grande taille, donc cela ne devrait pas être une chose de précision, mais d'une manière ou d'une autre, cesp
questions sont importantes et ne s'annulent pas comme j'imagine eux à ... que me manque-t-il ici?p
initialisé impair, ce quip/2/p
équivaut - sous division entière - à((p-1)/2)/p
. Cela produit le1/3
,2/5
,3/7
, etc. termes dérivés ci - dessus.#C - 777 caractèresC - 731 caractères
Imprime GIF sur
stdout
.3
.Assemblage de GIF à partir de l'en-tête préconfiguré + chaque chiffre représenté par une police (intégrée) de 5 x 5 pixels.
Notez que GIF disparaît, parfois, dans Chrome après une exécution.
Brève introduction:
Calcul de PI
Pi est calculé en utilisant une version légèrement modifiée de l'implémentation de Dik Winter et Achim Flammenkamp de l'algorithme de Rabinowitz et Wagon pour calculer les chiffres de π.
Génération GIF
Les images GIF ont une
canvas
propriété dans l'en-tête. Nous pouvons l'utiliser en combinaison avec l'affichage de plusieurs images en définissant laleft
propriété pour chaque chiffre en conséquence - où chaque chiffre est une image (intégrée) en soi.Documentation.
Exemple:
Code étendu (avec beaucoup de commentaires)
Désordonné, mais cela fait partie de la minimisation :
Vous cherchez à utiliser un algorithme plus court / autre pour calculer π.
la source
JavaScript, 680 caractères
Cela peut être consulté dans un navigateur Web; les nombres sont sortis sous forme de chemins SVG.
Il ne calcule pas pi de manière intéressante, et JS n'a pas de type numérique avec précision pour afficher 20 chiffres.
Pour enregistrer des caractères, j'ai omis les données de chemin pour "0", car elles n'apparaissent pas dans la séquence.
la source
Java -
866860857853 caractères, plus une version de triche avec 574 caractèresEn utilisant la formule de Simon Plouffe de 1996, génère un
x.png
fichier avec des nombres blancs ressemblant à une horloge numérique sur fond noir:Voici le code compressé:
Cela, avec l'identification et certains espaces blancs serait le suivant:
En trichant les règles et en considérant que le calcul de PI peut être fait comme "la représentation numérique de la chaîne 3.1415926535897934384", cela peut être réduit à 574 caractères:
la source
Java -
642622 caractèresCopie de ma réponse précédente, en utilisant la formule de Simon Plouffe de 1996. Mais produit de l'art ASCII à la place:
Tout cela, avec quelques identifiants et espaces, et un peu d'aide au lecteur pour comprendre la signification des nombres magiques:
Production:
la source
C,
253250caractèresApproximation de pi en utilisant l'algorithme du code de @ Sukminder (empruntant et refactorisant sans vergogne un peu leur code) Sort une image PBM binaire , qui pourrait ensuite par exemple être convertie avec ImageMagick.
Voici à quoi ressemble la sortie avec mon moteur de rendu PPM en braille:
A la même bizarrerie que la réponse de @ Sukminder en ce qu'il manque un séparateur décimal. De plus, la sortie de la mienne est verticale, et si elle est lisible par l'homme est discutable ...
Edit: appliqué les suggestions de @ ugoren.
la source
puts
à l'for
initialisation, définissezL[5]
et omettez,0
. Créezd
un paramètre pourmain
(enregistrer une virgule).PHP 380
nécessite gd activé pour la sortie d'image
calcul pi: étant donné que la base php a une précision par défaut de 14 et que je ne voulais pas recompiler le serveur avec les extensions de précision arbitraires activées, je ne pouvais même pas approximer PI avec les décimales requises, donc à la place il calcule tau / 2 puis le reste des décimales
puisque le graphique est fait de 0 et de 1, je peux essayer d'utiliser WBMP comme format plus tard pour voir si je peux supprimer gd
la source
3x5 with 1 px between chars
. la couleur est rouge juste pour réduire 4 caractères, mais étant donné que je ne gagnerai pas, je vais le changer en blanc pour plus de lisibilitéimagecreate
), la première invocation deimagecolorallocate
définit la couleur d'arrière-plan et une seconde est nécessaire pour définir la couleur d'écriture. donc ça se termine plus longtempsImprimante C + LaserWriter 599 - 10 = 589
Dirigez la sortie vers votre LaserWriter! :) Cela devrait fonctionner sur une Lisa (avec un compilateur C).
Il calcule
pi
dans l'imprimante en calculant la somme des longueurs des segments de ligne qui se rapprochent d'une séquence de courbes de Bézier qui se rapproche d'un demi-cercle, divisé par le diamètre, multiplié par 2.PostScript non-niveau 1 (compatible 1985):
Production:
la source
Java,
157426431934 caractères1934 caractères compressés :
Expansés 2643 caractères:
Méthode Pi collectée sur: /programming/8343977/calculate-pi-on-an-android-phone?rq=1
la source
throws Exception
dansmain
et le retrait du bloc try-catch. De plus, vous pouvez renommerpi
et lessqrt
méthodes et lesloc
,args
,SCALE
,x0
et lesx1
variables à 1 identificateurs char. Et au fait, vous devez ajouter la classe complète, cela inclut laclass Foo{
déclaration et les importations.