Sie saßen also an Ihrem Schreibtisch und spielten ein Programm zur Berechnung der ersten 20 Stellen von pi. Dann kommt Ihr Chef und wirft Ihren Apfel IIe aus dem Fenster. Sie arbeiten gerade an einem neuen Projekt und dieser Computer verfügt noch nicht über Textfunktionen. Keiner. Keine Schriften. Nichts.
Beenden wir nun das Programm. Berechnen und Anzeigen der ersten 20 Zeichen pi ohne Schriftarten zu verwenden , die nicht Teil des Programms sind. Ihre Ausgabe kann als Bilddatei (JPEG, PNG, GIF, SVG (solange Sie keine Zeichen verwenden), BMP, XPM) angezeigt oder als Standardausgabe geschrieben werden. Sie können eine beliebige Sprache verwenden, jedoch nicht die Schriftfunktionen, die Textanzeige oder ähnliches Ihrer Sprache.
kleiner Bonus (10 Zeichen) Wenn es bei einer Lisa klappt.
Bearbeiten: Für diejenigen, die es nicht herausgefunden haben, war meine Inspiration der erste Mac, und der Titel ist ein Wortspiel. Ein großes Lob an @Sukminder, dessen animiertes GIF einfach cool ist. Der Wettbewerb ist nicht vorbei, wenn eine bessere Antwort kommt.
quelle
Antworten:
Python, 222 Zeichen
Die erste Zeile berechnet die Stellen von pi unter Verwendung der Näherung
pi-3 ~= 277991633/1963319607
. Die nächsten drei Zeilen geben 20 Zeichen pi mit ASCII-Art- Nemeth-Braille aus.Ich verschiebe hier die Grenzen in zwei Richtungen, sowohl im Sinne des "berechnenden Pi" als auch des "vom Menschen lesbaren".
quelle
*
und Leerzeichen ohne Schriftart?*
ein 1x1 schwarzes Pixel und ein 1x1 weißes Pixel vor.*
ohne die Verwendung von Schriftarten rendern , ich denke, Sie sind disqualifiziertPython, 217 Bytes
Benötigt die Python Imaging Library
Die Anzahl der Bytes setzt voraus, dass das maskierte Zeichen
\177
durch das entsprechende Literal (char 127 ) ersetzt wird.Die Ausgabe sieht folgendermaßen aus (wird in Ihrem Standard-BMP-Viewer geöffnet):
Beachten Sie, dass dies leicht parametrisiert werden kann, um eine beliebige Anzahl von Stellen zu drucken, die Sie möchten. Der folgende Befehl akzeptiert eine Ganzzahleingabe von stdin und zeigt so viele Ziffern an:
Ausgabe für n = 80 :
Pi-Berechnung
Ja, das ist es. Die verwendete Formel ist das Ergebnis der Anwendung von Eulers Transformation auf die Leibniz-Reihe und der anschließenden Ausklammerung jedes Terms aus dem Rest der Summe. Die Formel konvergiert linear; Jede Ziffer erfordert log 2 (10) ≈ 3.32 Iterationen. Für diejenigen, die an der Ableitung interessiert sind, siehe Anhang A.
Anzeige
PIL wird zur Bilderzeugung verwendet, da es die bequemste Bibliothek ist, die ich kenne. Es wird eine leere 141 × 11- Schwarzweiß-Bitmap erstellt, auf der dann pixelweise weiße Linien in sieben Segmenten gezeichnet werden. Die Positionen, die zum Zeichnen jedes Segments erforderlich sind, werden in einer Bitmaskenzeichenfolge gespeichert, wobei die Bits den folgenden Positionen entsprechen:
Das bisschen Magie
(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)
erzeugt jedes Pixel in der folgenden Reihenfolge (Basis-18):Anhang A
Euler's Transform ist eine Konvergenzbeschleunigungstechnik, die für alle Serien mit absoluter monotoner Konvergenz funktioniert. Die resultierende Serie konvergiert linear, normalerweise mit einer Rate von einem Bit pro Term (beachten Sie, dass die resultierende Serie tatsächlich langsamer konvergiert, wenn die ursprüngliche Serie bereits superlinear war). Die rein mathematische Beschreibung ist etwas schwer zu befolgen, daher werde ich einen prozeduralen Ansatz verfolgen.
Wir beginnen mit der Leibniz-Reihe:
Teilen Sie dann jeden Begriff in zwei Hälften, indem Sie benachbarte Begriffe kombinieren:
Vereinfacht:
Verallgemeinert:
Beachten Sie, dass die führende Hälfte keine Partnerlaufzeit hatte und daher vom Rest der Summe ausgeschlossen war. Dies ist der erste Term der transformierten Reihe. Um den nächsten Begriff zu finden, wiederholen wir den Vorgang erneut:
Und wieder:
Und wieder:
Und noch einmal zum Guten:
Zu diesem Zeitpunkt haben wir die ersten fünf Terme, und der sechste Term ist offensichtlich. Dies sollte zur Verallgemeinerung ausreichen, daher hören wir hier auf. Wir beginnen mit der Faktorisierung der Zähler und Nenner:
Die Nenner enthalten offenbar eine Doppel Factorial von 2n + 1 , so dass wir das in Patch werden:
Alles passt zusammen, bis auf die ersten beiden Terme, die im Nenner eine nicht berücksichtigte 2 haben . Wir können das beheben, indem wir den gesamten Ausdruck mit 2 multiplizieren :
2 3 = 2 · 4 , also:
Der Zähler kann nun leicht als n identifiziert werden ! .
Beachten Sie, dass sich der zu jedem aufeinanderfolgenden Term n / (2n + 1) hinzugefügte Faktor ½ nähert, wenn n groß wird, was eine lineare Konvergenz mit einer Rate von einem Bit pro Term impliziert - dies ist tatsächlich beabsichtigt. Ein schönes Ergebnis, aber ohne die Fakultäten wäre es noch schöner. Was wir hier tun können, ist, jeden aufeinanderfolgenden Ausdruck aus dem Rest der Summe herauszurechnen, wodurch ein verschachtelter Ausdruck erzeugt wird:
Dies kann als wiederkehrende Beziehung umgeschrieben werden:
Wobei n von ⌈ log 2 (10) · d ⌉ .. 0 rückwärts zählt , wobei d die Anzahl der erforderlichen Stellen ist.
Es könnte interessant sein, festzustellen, dass der stabile Punkt dieser Wiederholung genau 2 ist (oder 4, wenn Sie ihn verdoppelt haben, wie ich es in der obigen Implementierung getan habe), sodass Sie eine Reihe von Iterationen speichern können, indem Sie ihn ordnungsgemäß initialisieren. Das Initialisieren auf einen zufälligen Wert, den Sie an anderer Stelle benötigen, und das Platzieren einiger zusätzlicher Iterationen am Anfang ist im Allgemeinen byteweise günstiger.
quelle
p
inp/2 * x/p + ...
tut .. AIUI Python automatische Beförderung in eine BigInteger-ish - Datentyp unterstützt, so dass es keine Präzision , was sein sollte, aber irgendwie diejenigenp
s Angelegenheit und nicht zunichte machen wie ich mir vorstellen , sie zu ... was fehle ich hier?p
ungerade initialisiert, sodassp/2/p
dies - unter ganzzahliger Division - äquivalent zu ist((p-1)/2)/p
. Dadurch ergibt sich die1/3
,2/5
,3/7
usw. Begriffe oben abgeleitet.#C - 777 ZeichenC - 731 Zeichen
Druckt GIF nach
stdout
.3
.Zusammenfügen von GIF aus vorkonfiguriertem Header + jeder Ziffer, die durch hausgemachte (eingebettete) Schrift mit 5 x 5 Pixeln dargestellt wird.
Beachten Sie, dass GIF manchmal nach einem Lauf in Chrome verschwindet.
Kurze Einführung:
Berechnung des PI
Pi wird unter Verwendung einer leicht modifizierten Version von Dik Winter und Achim Flammenkamps Implementierung des Rabinowitz- und Wagon-Algorithmus zur Berechnung von π-Ziffern berechnet.
GIF-Erzeugung
GIF-Bilder haben eine
canvas
Eigenschaft in der Kopfzeile. Wir können dies in Kombination mit der Anzeige mehrerer Bilder verwenden, indem wir dieleft
Eigenschaften für jede Ziffer entsprechend festlegen - wobei jede Ziffer ein (eingebettetes) Bild für sich ist.Dokumentation.
Beispiel:
Erweiterter Code (mit vielen Kommentaren)
Chaotisch, aber das ist Teil der Minimierung :
Suche nach einem kürzeren / anderen Algorithmus zur Berechnung von π.
quelle
JavaScript, 680 Zeichen
Dies kann in einem Webbrowser angezeigt werden. Die Zahlen werden als SVG-Pfade ausgegeben.
Pi wird nicht auf interessante Weise berechnet, und JS verfügt nicht über einen Zahlentyp mit einer Genauigkeit von 20 Stellen.
Um Zeichen zu speichern, habe ich die Pfaddaten für "0" weggelassen, da sie in der Sequenz nicht angezeigt werden.
quelle
Java -
866860857853 Zeichen plus eine betrügerische Version mit 574 ZeichenMit der Simon Plouffe-Formel von 1996 wird eine
x.png
Datei mit weißen , digitaluhrähnlichen Zahlen auf schwarzem Hintergrund ausgegeben:Dies ist der komprimierte Code:
Das wäre mit Identifizieren und einigen Leerzeichen:
Das Betrügen der Regeln und die Berücksichtigung, dass die Berechnung von PI als "numerische Darstellung des Strings 3.1415926535897934384" erfolgen kann, kann auf 574 Zeichen reduziert werden:
quelle
Java -
642622 ZeichenKopie meiner vorherigen Antwort mit der Simon-Plouffe-Formel von 1996. Gibt stattdessen ASCII-Kunst aus:
All dies, mit einigen Angaben und Leerzeichen und ein wenig Hilfe für den Leser, um die Bedeutung der magischen Zahlen zu verstehen:
Ausgabe:
quelle
C
253.250ZeichenApproximiert pi mithilfe des Algorithmus in @ Sukminders Code (schamloses Ausleihen und ein wenig Umgestalten des Codes). Gibt ein binäres PBM-Bild aus , das dann zB mit ImageMagick konvertiert werden könnte.
So sieht die Ausgabe mit meinem PPM-Renderer auf Braille-Basis aus:
Hat die gleiche Eigenart wie @ Sukminders Antwort, dass es kein Dezimaltrennzeichen gibt. Darüber hinaus ist die Ausgabe von mir vertikal, und ob es für Menschen lesbar ist, ist fraglich ...
Edit: @ ugorens Vorschläge angewendet.
quelle
puts
In diefor
Initialisierung wechseln , definierenL[5]
und weglassen,0
. Machen Sied
einen Parameter zumain
(speichern Sie ein Komma).PHP 380
Für die Bildausgabe muss gd aktiviert sein
pi-berechnung: da base php eine standardgenauigkeit von 14 hat und ich den server nicht mit den aktivierten erweiterungen für die willkürliche genauigkeit neu kompilieren wollte, konnte ich PI nicht einmal mit den erforderlichen dezimalstellen approximieren, sondern berechnet stattdessen tau / 2 und dann der Rest der Dezimalstellen
Da die Grafik aus Nullen und Einsen besteht, kann ich später versuchen, WBMP als Format zu verwenden, um zu sehen, ob ich gd entfernen kann
quelle
3x5 with 1 px between chars
. Die Farbe ist rot, nur um 4 Zeichen zu reduzieren, aber da ich nicht gewinne, werde ich sie ausimagecreate
) arbeiten, wird durch den ersten Aufruf vonimagecolorallocate
die Hintergrundfarbe und durch einen zweiten Aufruf die Schreibfarbe festgelegt. so endet es längerC + LaserWriter-Drucker 599 - 10 = 589
Leiten Sie die Ausgabe an Ihren LaserWriter weiter! :) Dies sollte auf einem Lisa (mit einem C-Compiler) funktionieren.
Sie berechnet
pi
im Drucker die Summe der Längen der Liniensegmente, die sich einer Bezier-Kurvenfolge annähern, die sich einem Halbkreis, geteilt durch den Durchmesser, mal 2 annähert.Ungolfed Level-1 (1985-kompatibel) PostScript:
Ausgabe:
quelle
Java,
157426431934 ZeichenKomprimierte 1934 Zeichen:
Erweiterte 2643 Zeichen:
Die Pi-Methode wurde abgerufen unter: /programming/8343977/calculate-pi-on-android-phone?rq=1
quelle
throws Exception
inmain
den Try-Catch - Block und zu entfernen. Ferner können Sie umbenennenpi
undsqrt
Methoden und dieloc
,args
,SCALE
,x0
undx1
Variablen auf 1 char Identifikatoren. Übrigens müssen Sie die gesamte Klasse hinzufügen, einschließlich derclass Foo{
Deklaration und der Importe.