dumme Einschränkungen und Wüste


18

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.


Ich mag die Herausforderung, aber wäre ein solches System technisch nicht auch in der Lage, Quellcode anzuzeigen? Außer Piet natürlich.
ApproachingDarknessFish

2
@ValekHalfHeart Sie können den Quellcode von einem anderen Computer laden
John Dvorak

1
Und wie definieren Sie menschlich lesbar? Zum Beispiel ist meine Handschrift für einige Menschen (mindestens eine) und nicht für andere Menschen lesbar. (Übrigens 2 ^ (2x2) = 16, genug Glyphen für alle 11 Ziffern.))
Kendall Frey

4
Ich verstehe den Titel überhaupt nicht, ich verstehe nicht, wie ASCII-Kunst in Ordnung sein kann, wenn wir keine Textanzeige verwenden können, und die Frage muss unbedingt mit "PI berechnen" definiert werden.
Peter Taylor

2
Was bedeutet "pi berechnen" wirklich? Könnte ich eine Bitmap der ersten 20 Dezimalstellen fest codieren? (Verwendet keine eingebaute PI-Konstante oder ähnliches)
FireFly

Antworten:


6

Python, 222 Zeichen

n=[10**20*277991633/1963319607/10**i%10 for i in range(19,1,-1)]
print' *     *'
print' * **    '+' '.join(' ** * ***** *****  *'[2*d:2*d+2]for d in n)
print'**     * '+' '.join('**  *    * ** ***** '[2*d:2*d+2]for d in n)

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".


3
Was zum Teufel? Ich dachte, wir sollten keine Textausgabe verwenden. Wie rendert Ihr Computer die Zeichen *und Leerzeichen ohne Schriftart?
Stand

@boothby: Es ist ASCII-Kunst. Stellen Sie sich *ein 1x1 schwarzes Pixel und ein 1x1 weißes Pixel vor.
Keith Randall

1
Er hat Recht. Sie können nicht *ohne die Verwendung von Schriftarten rendern , ich denke, Sie sind disqualifiziert
Sirenen

18

Python, 217 Bytes

Benötigt die Python Imaging Library

import Image
x=p=141
i=Image.new('1',(x,11))
while~-p:x=p/2*x/p+2*10**19;p-=2
for c in str(x):[i.putpixel((j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2),1&ord('}`7gjO_a\177o'[int(c)])>>j%7)for j in range(17)];p+=7
i.show()

Die Anzahl der Bytes setzt voraus, dass das maskierte Zeichen \177durch 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:

import Image
n=input()
x=p=n*7|1
i=Image.new('1',(x,11))
while~-p:x=p/2*x/p+2*10**(n-1);p-=2
for c in str(x):[i.putpixel((j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2),1&ord('}`7gjO_a\177o'[int(c)])>>j%7)for j in range(17)];p+=7
i.show()

Ausgabe für n = 80 :


Pi-Berechnung

while~-p:x=p/2*x/p+2*10**19;p-=2

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:

 000
3   5
3   5
 111
4   6
4   6
 222

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):

(2, 2), (2, 5), (2, 8), (1, 3), (1, 6), (5, 3), (5, 6),
(3, 2), (3, 5), (3, 8), (1, 4), (1, 7), (5, 4), (5, 7),
(4, 2), (4, 5), (4, 8)

 07e
3   5
a   c
 18f
4   6
b   d
 29g

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.


1
Sehr schön, danke für die Lektion! Was ich nicht bekommen , ist es, was die pin p/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 diejenigen ps Angelegenheit und nicht zunichte machen wie ich mir vorstellen , sie zu ... was fehle ich hier?
FireFly

@FireFly wurde pungerade initialisiert, sodass p/2/pdies - unter ganzzahliger Division - äquivalent zu ist ((p-1)/2)/p. Dadurch ergibt sich die 1/3, 2/5, 3/7usw. Begriffe oben abgeleitet.
Primo

12

#C - 777 Zeichen

C - 731 Zeichen

Druckt GIF nach stdout.

  • Eigenheit: Kein Komma nach dem ersten 3.

Zusammenfügen von GIF aus vorkonfiguriertem Header + jeder Ziffer, die durch hausgemachte (eingebettete) Schrift mit 5 x 5 Pixeln dargestellt wird.

Ergebnis

Bildbeschreibung hier eingeben

Es ist da --- ^

Beachten Sie, dass GIF manchmal nach einem Lauf in Chrome verschwindet.

#include <stdio.h>
#define G 68,30
#define F(e,i)for(i=0;i<e;++i)
#define B w[++k]
unsigned char r[][10]={{4,18,150,199,188,159,10,0},{4,18,102,169,188,122,64,1},{G,160,166,104,217,80,1},{G,160,166,184,140,66,1},{68,96,153,193,135,138,66,1},{G,6,107,199,155,80,40},{68,128,150,22,173,218,90,1},{G,160,182,169,254,84,1},{G,6,138,153,140,10,0},{G,6,138,185,250,66,1},{0,0,0,5,0,5,0,0,2,8}},w[440]={71,73,70,56,57,97,100,0,5,0,144,0,0,255,255,255,0,0,0};int main(){int a=10000,b=0,c=70,d,e=0,f[71],g;int i,j,k=18,s=0;char m[5];for(;b<c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,e=d%a){for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);sprintf(m,"%d",e+d/a);F(4,i){B=44;B=s++*5;F(10,j)B=r[10][j];F(8,j)B=r[m[i]-'0'][j];B=0;}}B=59;fwrite(w,1,k,stdout);}

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.

int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c
-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}

GIF-Erzeugung

GIF-Bilder haben eine canvasEigenschaft in der Kopfzeile. Wir können dies in Kombination mit der Anzeige mehrerer Bilder verwenden, indem wir die leftEigenschaften für jede Ziffer entsprechend festlegen - wobei jede Ziffer ein (eingebettetes) Bild für sich ist.

Dokumentation.

Beispiel:

Header: Canvas Width  100 pixels
        Canvas Height   5 pixels

3 : left  0 pixels
1 : left  5 pixels
4 : left 10 pixels
… and so on.

Erweiterter Code (mit vielen Kommentaren)

Chaotisch, aber das ist Teil der Minimierung :

#include <stdio.h>
#define G 68,30
#define F(e,i)for(i=0;i<e;++i)
#define B w[++k]

/* Font + Image Descriptor + Start of Image Data. 
 *
 * Font glyphs are black and white pixels making a 5x5 picture.
 * Each glyph has its own entry in array.
 * Pixels (White,White,Black,Black ...) are further compressed using LZW
 * compression.
 *
 * Next entry in array is Image Descriptor which is added before each glyph.
 * Last entry is start of Image Data.
 *
 * - "0" and comma are 7 and 5 bytes, but hacked to fill 8 bytes to make it 
 * easier to handle in minified code.
 * */
unsigned char r[][10]={
        /* Images representing glyphs. */
        { 4,   18, 150, 199, 188, 159, 10,  0}, /* 0 */
        { 4,   18, 102, 169, 188, 122, 64,  1}, /* 1 */
        { 68,  30, 160, 166, 104, 217, 80,  1}, /* 2 */
        { 68,  30, 160, 166, 184, 140, 66,  1}, /* 3 */
        { 68,  96, 153, 193, 135, 138, 66,  1}, /* 4 */
        { 68,  30,   6, 107, 199, 155, 80, 40}, /* 5 */
        { 68, 128, 150,  22, 173, 218, 90,  1}, /* 6 */
        { 68,  30, 160, 182, 169, 254, 84,  1}, /* 7 */
        { 68,  30,   6, 138, 153, 140, 10,  0}, /* 8 */
        { 68,  30,   6, 138, 185, 250, 66,  1}, /* 9 */
        {132, 143, 121, 177,  92,   0,  0,  0}, /* , (removed as not used) */
        {
        /* Image Descriptor */
        /* 0x2C    Image separator (Embedded in code)   */
           0,   /* Image Left   (LSB embedded in code.  */
        0, 0,   /* Image top    (16-bit Little endian)  */
        5, 0,   /* Image Width  (16-bit Little endian)  */
        5, 0,   /* Image Height (16-bit Little endian)  */
        0,      /* Packed byte  (Local color table (not used, etc.)) */
        /* Start of Image Data */
        2,      /* Starting size of LZW 2 + 1 = 3 */
        8       /* Number of bytes in data */
        }
};
/* GIF Header + Global Color table. 
 *
 * GIF's has a standard header.
 * Canvas size is the are on which to paint.
 * Usually this is size of whole image, but in this code I've spanned it out
 * and paint glyphs by rendering pictures on a canvas of size:
 * 20 * width_of_1_image (5 * 20 = 100)
 *
 * Each image can have an optional color table, but if not present the global
 * color table is used. In this code only global color table is used. It
 * consist of only black and white. (Though very easy to change if wanted.)
 * */
unsigned char buf[440] = {
        71, 73, 70,     /* Signature     "GIF" */
        56, 57, 97,     /* Version       "89a" */
        100, 0,         /* Canvas width  (16-bit Little endian) 5 * 20 = 100*/
          5, 0,         /* Canvas height (16-bit Little endian) 5 pixels.   */
        144,            /* Packed byte: 1 001 0 000
                                  1 : Has global color table.
                                001 : Color resolution.
                                  0 : Sorted Color Table (No)
                                000 : Size of Global Color table (2^(value+1))
                                        or 2 << value ...
                        */
        0,              /* Background Color index. */
        0,              /* Pixel aspect ratio. */
        /* Global color table. */
        255, 255, 255,  /* Index 0: White */
          0,   0,   0   /* Index 1: Black */
};

int main(void){
        /* PI generation variables. */
        int a = 10000, 
            b = 0,
            c = 70,
            d,
            e = 0,
            f[71],
            g;
        /* General purpose variables */
        int i,
            j,
            k = 18,     /* Current Index in out buffer. */
            s = 0;      /* Image counter:
                           (Tells us what "left/x" value should be). */
        char m[5];      /* Print next 4 digits of PI to this buffer. */
        /* Prepare / pre-fill for PI math. */
        for(;b < c;)
                f[b++] = a/5;
        /* Calculate 4 and 4 digits of PI and push onto out buffer. */
        for(; d = 0, g = c * 2; c -= 14 , e = d % a) { 
                for (b = c; d += f[b] * a, f[b] = d % --g, d /= g--, --b; d *= b);
                /* sprintf next 4 digits to temprary buffer.     */
                sprintf(m, "%d", e + d/a);
                /* We are served 4 and 4 digits. 
                 * Here we transalte them to glyphs and push onto out buffer*/
                for (i = 0; i < 4; ++i) {  
                        buf[++k] = 0x2C;     /* 0x2C : Image separator.        */
                        buf[++k] = s++ * 5;  /* xx   : Image left (x) on canvas.*/
                        for (j = 0; j < 10; ++j) {
                                /* Push "Start of Image Data" onto buffer      */
                                buf[++k] = r[11][j];
                        }
                        for (j = 0; j < 8; ++j) {
                                /* Push data of glyph (LZW-compressed) onto buffer. */
                                buf[++k] = r[m[i]-'0'][j];
                        }
                        /* Start of image data informs how big the image data 
                         * is. End with zero to mark that this is EOI. */
                        buf[++k] = 0;       
                }
        }
        /* 0x3b is Trailer, marking end of file. */
        buf[k] = 0x3b;
        /* Write buffer to standard output. 
         * 'k' holds length of data, though as we know this image is 
         * 100x5 etc. we can pre-define it as well.
         * */
        fwrite(buf, 1, k, stdout);
}

Suche nach einem kürzeren / anderen Algorithmus zur Berechnung von π.


2
Ich sehe den Punkt nach den ersten 3 im Bild nicht.
Victor Stafusa

1
Haben Sie einen Link zu Informationen über den Algorithmus zur Erzeugung von Pi-Dezimalstellen? Ich habe ein bisschen mit Ihrem Code herumgespielt (nachdem ich das GIF-Material entfernt hatte), aber ich verstehe nicht wirklich, warum es zu Ziffern von pi führt ...
FireFly

7

JavaScript, 680 Zeichen

<html><body></body><script>v=["","41L70L7e","24C223060Ca0b587C592b2eLae","30L90L55L65C95a7a9Cac9e6eC5e3e2c","aaL2aL80L8e","90L40L36C455565C95a7a9Cac9e6eC5e3e2c","70C52272aC2c3e6eC9eacaaCa89666C36282a","20La0C745a5e","60C202435C465666C96a8aaCac9e6eC3e2c2aC283666C768695Ca4a060","a4Ca69868C382624C223060C90a2a4Ca77c5e","6dC7d7e6eC5e5d6d"];v["."]=v[10];a=(""+(4*Math.atan(1))).split("");s="";for(i in a)s+="<path d='M "+v[a[i]].split("").map(function(c){return+-c||c>"Z"?parseInt(c,16):c;}).join(" ")+"'transform='translate("+i*33+".5,10.5)scale(3,3)'fill='none'stroke='#333'stroke-linecap='round'stroke-linejoin='round'/>";document.body.innerHTML="<svg>"+s+"</svg>";</script></html>

Dies kann in einem Webbrowser angezeigt werden. Die Zahlen werden als SVG-Pfade ausgegeben.

Screenshot der SVG-Ausgabe in einem Webbrowser

  • 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.


Ooh, ein vektorbasierter Ansatz. Sehr schön, gute Arbeit auch in der Schrift.
FireFly

5

Java - 866 860 857 853 Zeichen plus eine betrügerische Version mit 574 Zeichen

Mit der Simon Plouffe-Formel von 1996 wird eine x.pngDatei mit weißen , digitaluhrähnlichen Zahlen auf schwarzem Hintergrund ausgegeben:

Pi

Dies ist der komprimierte Code:

import java.math.BigDecimal;class E{static java.awt.Graphics g;public static void main(String[]h)throws Exception{java.awt.image.BufferedImage i=new java.awt.image.BufferedImage(213,17,1);g=i.getGraphics();BigDecimal y=v(-3);for(int n=1;n<99;n++)y=y.add(v(n).multiply(v(2).pow(n)).multiply(f(n).pow(2)).divide(f(2*n),42,0));int j=2;for(char c:y.toPlainString().substring(0,21).toCharArray()){if(j!=12){c-=48;boolean b=c!=1&c!=4;t(b,j,2,8,3);t(c<1|c>3&c!=7,j,2,3,8);t(c<5|c>6,j+5,2,3,8);t(c>1&c!=7,j,7,8,3);t(c%2==0&b,j,7,3,8);t(c!=2,j+5,7,3,8);t(b&c!=7,j,12,8,3);}j+=10;}t(true,17,12,3,3);javax.imageio.ImageIO.write(i,"png",new java.io.File("x.png"));}static BigDecimal v(int k){return BigDecimal.valueOf(k);}static BigDecimal f(int k){return k<2?v(1):f(k-1).multiply(v(k));}static void t(boolean x,int a,int b,int c,int d){if(x)g.fillRect(a,b,c,d);}}

Das wäre mit Identifizieren und einigen Leerzeichen:

import java.math.BigDecimal;

class E {

    static java.awt.Graphics g;

    public static void main(String[] h) throws Exception {
        java.awt.image.BufferedImage i = new java.awt.image.BufferedImage(213, 17, 1);
        g = i.getGraphics();
        BigDecimal y = v(-3);

        // Calculate PI using the Simon Plouffe formula, 1996.
        for (int n = 1; n < 99; n++)
            y = y.add(v(n).multiply(v(2).pow(n)).multiply(f(n).pow(2)).divide(f(2 * n), 42, 0));

        int j = 2;
        for (char c : y.toPlainString().substring(0, 21).toCharArray()) {
            if (j != 12) {
                c -= 48;
                boolean b = c != 1 & c != 4;
                t(b, j, 2, 8, 3);
                t(c < 1 | c > 3 & c != 7, j, 2, 3, 8);
                t(c < 5 | c > 6, j + 5, 2, 3, 8);
                t(c > 1 & c != 7, j, 7, 8, 3);
                t(c % 2 == 0 & b, j, 7, 3, 8);
                t(c != 2, j + 5, 7, 3, 8);
                t(b & c != 7, j, 12, 8, 3);
            }
            j += 10;
        }
        t(true, 17, 12, 3, 3);
        javax.imageio.ImageIO.write(i, "png", new java.io.File("x.png"));
    }

    static BigDecimal v(int k) {
        return BigDecimal.valueOf(k);
    }

    static BigDecimal f(int k) {
        return k < 2 ? v(1) : f(k - 1).multiply(v(k));
    }

    static void t(boolean x, int a, int b, int c, int d) {
        if (x) g.fillRect(a, b, c, d);
    }
}

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:

class F{static java.awt.Graphics g;public static void main(String[]h)throws Exception{java.awt.image.BufferedImage i=new java.awt.image.BufferedImage(213,17,1);g=i.getGraphics();int j=2;for(char c:"3.1415926535897932384".toCharArray()){if(j!=12){c-=48;boolean b=c!=1&c!=4;t(b,j,2,8,3);t(c<1|c>3&c!=7,j,2,3,8);t(c<5|c>6,j+5,2,3,8);t(c>1&c!=7,j,7,8,3);t(c%2==0&b,j,7,3,8);t(c!=2,j+5,7,3,8);t(b&c!=7,j,12,8,3);}j+=10;}t(true,17,12,3,3);javax.imageio.ImageIO.write(i,"png",new java.io.File("x.png"));}static void t(boolean x,int a,int b,int c,int d){if(x)g.fillRect(a,b,c,d);}}

4

Java - 642 622 Zeichen

Kopie meiner vorherigen Antwort mit der Simon-Plouffe-Formel von 1996. Gibt stattdessen ASCII-Kunst aus:

import java.math.BigDecimal;class H{public static void main(String[]h)throws Exception{int[]t={31599,4681,31183,29647,5101,29671,31719,4687,31727,29679,8192};BigDecimal y=v(-3);for(int n=1;n<99;n++)y=y.add(v(n).multiply(v(2).pow(n)).multiply(f(n).pow(2)).divide(f(2*n),42,0));for(int z=0;z<5;z++){for(char c:y.toPlainString().substring(0,21).toCharArray()){if(c<48)c=58;int a=(t[c-48]>>>z*3)&7;e(a/4);e(a/2&1);e(a&1);e(0);e(0);}e(10);}}static void e(int c){System.out.print((char)(c<2?c*3+32:c));}static BigDecimal v(int k){return BigDecimal.valueOf(k);}static BigDecimal f(int k){return k<2?v(1):f(k-1).multiply(v(k));}}

All dies, mit einigen Angaben und Leerzeichen und ein wenig Hilfe für den Leser, um die Bedeutung der magischen Zahlen zu verstehen:

import java.math.BigDecimal;

class H {

    public static void main(String[] h) throws Exception {
        // Each block corresponds to a line. Each char has 5 lines with a 3-char width.
        int[] t = {
            0b111_101_101_101_111,
            0b001_001_001_001_001,
            0b111_100_111_001_111,
            0b111_001_111_001_111,
            0b001_001_111_101_101,
            0b111_001_111_100_111,
            0b111_101_111_100_111,
            0b001_001_001_001_111,
            0b111_101_111_101_111,
            0b111_001_111_101_111,
            0b010_000_000_000_000
        };

        // Calculate PI using the Simon Plouffe formula, 1996.
        BigDecimal y = v(-3);
        for (int n = 1; n < 99; n++)
            y = y.add(v(n).multiply(v(2).pow(n)).multiply(f(n).pow(2)).divide(f(2 * n), 42, 0));

        for (int z = 0; z < 5; z++) {
            for (char c : y.toPlainString().substring(0, 21).toCharArray()) {
                if (c < 48) c = 58;
                int a = (t[c - 48] >>> z * 3) & 7;
                e(a / 4);
                e(a / 2 & 2);
                e(a & 1);
                e(0);
                e(0); // Not needed, but makes a better art with the cost of 5 chars.
            }
            e(10);
        }
    }

    static void e(int c) {
        System.out.print((char) (c < 2 ? c * 3 + 32 : c));
    }

    static BigDecimal v(int k) {
        return BigDecimal.valueOf(k);
    }

    static BigDecimal f(int k) {
        return k < 2 ? v(1) : f(k - 1).multiply(v(k));
    }
}

Ausgabe:

###         #  # #    #  ###  ###  ###  ###  ###  ###  ###  ###  ###  ###  ###  ###  ###  ###  ###  # #  
  #         #  # #    #  #    # #    #  #    #      #  #    # #  # #    #  # #    #    #    #  # #  # #  
###         #  ###    #  ###  ###  ###  ###  ###  ###  ###  ###  ###    #  ###  ###  ###  ###  ###  ###  
  #         #    #    #    #    #  #    # #    #    #    #  # #    #    #    #    #  #      #  # #    #  
###   #     #    #    #  ###  ###  ###  ###  ###  ###  ###  ###  ###    #  ###  ###  ###  ###  ###    # 

4

C 253.250 Zeichen

Approximiert 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.

b,c=70,e,f[71],g;v[71],j,k;L[5]={1072684944,792425072,492082832,256581624};
main(d){for(puts("P4\n8 100");b<c;)f[b++]=2;for(;d=0,g=--c*2;e=d%10){
for(b=c;d+=f[b]*10,f[b]=d%--g,d/=g--,--b;d*=b);v[j++]=e+d/10;}
for(;k<100;k++)putchar(L[k%5]>>3*v[k/5]&7);}

So sieht die Ausgabe mit meinem PPM-Renderer auf Braille-Basis aus:

Screenshot der Ausgabe

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.


Winzige Verbesserungen: putsIn die for Initialisierung wechseln , definieren L[5]und weglassen ,0. Machen Sie deinen Parameter zu main(speichern Sie ein Komma).
Ugoren

4

PHP 380

Für die Bildausgabe muss gd aktiviert sein

<? header('Content-Type: image/png');$i=imagecreatetruecolor(84,5);$n=['71775777770','51115441550','51777771770','51411151510','71771771712'];$c=imagecolorallocate($i,255,255,255);$m=(6.28318/2).(5307*5).(28060387*32);$k=5;while($k--)for($j=0;$j<21;$j++){$p=str_pad(decbin($n[$k][($m[$j]!='.')?$m[$j]:10]),3,'0',0);$l=3;while($l--)$p[$l]&&imagesetpixel($i,$l+$j*4,$k,$c);}imagepng($i);

Bildbeschreibung hier eingeben

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


Dieses Bild ist rot auf schwarz und wirklich klein, aber bei 500% können Sie es lesen, wenn Sie genau hinsehen. (Und sind nicht farbenblind.)
Hildred

Jedes Zeichen ist @hildred 3x5 with 1 px between chars. Die Farbe ist rot, nur um 4 Zeichen zu reduzieren, aber da ich nicht gewinne, werde ich sie aus
Gründen der

Mein Kommentar war nicht als Kritik gedacht, sondern als Erklärung, um die Stimmabgabe zu fördern.
Hildred

Würde imagecreateindex Zeichen speichern? Gibt es eine solche Funktion?
Hildred

@hildred Wenn Sie mit einem Palettenbild ( imagecreate) arbeiten, wird durch den ersten Aufruf von imagecolorallocatedie Hintergrundfarbe und durch einen zweiten Aufruf die Schreibfarbe festgelegt. so endet es länger
Einacio

4

C + 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 piim 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.

main(){
printf("/dist{dtransform dup mul exch dup mul add sqrt}def");
printf("/len{3 2 roll sub 3 1 roll exch sub dist}def");
printf("/pi{0 0 2 index 0 180 arc closepath flattenpath");
printf("[{2 copy}{2 copy 6 2 roll len 3 1 roll}{}{counttomark -2 roll len\n");
printf("counttomark 2 add 1 roll counttomark 1 sub{add}repeat\n");
printf("exch pop exch pop exch div 2 mul}pathforall}def\n");
printf("matrix setmatrix 100 dup scale 10 setflat 100 pi 10 string cvs\n");
printf("matrix defaultmatrix setmatrix/Palatino-Roman findfont 10 scalefont setfont\n");
printf("100 700 moveto show showpage");
}

Ungolfed Level-1 (1985-kompatibel) PostScript:

%!
/dist { % dx dy  .  dz  
    dtransform
    dup mul exch dup mul add sqrt
} def 

/len { % x1 y1 x2 y2  .  dist(y2-y1,x2-x1)
    3 2 roll % x1 x2 y2 y1
    sub 3 1 roll exch sub % y2-y1 x2-x1
    dist
} def 

/pi { % rad 
    0 0 2 index 0 180 arc closepath % rad 
    flattenpath
    [   
    { % rad [ x(0) y(0)     (m)print
        2 copy 
    } %moveto proc
    { % rad [ ... x(n-1) y(n-1) x(n) y(n)     (l)print
        2 copy 6 2 roll len % rad [ ... x(n) y(n) dist
        3 1 roll % rad [ ... dist x(n) y(n)
    } %lineto proc
    {} %curveto proc % n.b. flattenpath leaves no curve segments
    { % rad [ x(0) y(0) dist(1) dist(2) ... dist(n-1) x(n) y(n)     (c)print
        counttomark -2 roll len % rad [ dist(1) dist(2) ... dist(n)
        counttomark 2 add 1 roll % dist(n) rad [ dist...
        counttomark 1 sub { add } repeat % dist(n) rad [ sum_dist
        exch pop % dist(n) rad sum_dist
        exch pop % dist(n) sum_dist
        exch % sum_dist dist(n)
        div  % length_of_half_circle/diameter
        2 mul % C/d 
    } %closepath proc
    pathforall
} def 

matrix setmatrix
100 dup scale
10 setflat
100 pi 10 string cvs 
matrix defaultmatrix setmatrix
/Palatino-Roman findfont 10 scalefont setfont
100 700 moveto show

Ausgabe:

ps_pi


Ich muss wohl auch eine Schrift machen.
Luser Droog

Hmm. Niemals genug Ziffern auf diese Weise bekommen. PS hat nur 32-Bit-Floats.
Luser Droog

coole Idee, ich mag Postscript zum Golfen.
Hildred

Ich habe zwar eine Bitmap-Schriftart für die Ziffern, aber das Golfen wird sie nur ruinieren!
Luser Droog

2

Java, 1574 2643 1934 Zeichen

Komprimierte 1934 Zeichen:

    public static void main(String[] args){int[][][]num={{{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}},{{0,0,1},{0,0,1},{0,0,1},{0,0,1},{0,0,1}},{{1,1,1},{0,0,1},{1,1,1},{1,0,0},{1,1,1}},{{1,1,1},{0,0,1},{1,1,1},{0,0,1},{1,1,1}},{{1,0,1},{1,0,1},{1,1,1},{0,0,1},{0,0,1}},{{1,1,1},{1,0,0},{1,1,1},{0,0,1},{1,1,1}},{{1,1,1},{1,0,0},{1,1,1},{1,0,1},{1,1,1}},{{1,1,1},{0,0,1},{0,0,1},{0,0,1},{0,0,1}},{{1,1,1},{1,0,1},{1,1,1},{1,0,1},{1,1,1}},{{1,1,1},{1,0,1},{1,1,1},{0,0,1},{0,0,1}},{{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,1}}};BufferedImage image=new BufferedImage(103,5,BufferedImage.TYPE_3BYTE_BGR);for(int q=0;q<103;q++){for(int w=0;w<5;w++){image.setRGB(q,w,0xFFFFFF);}}int loc = 0;String g=String.valueOf(pi(20));for(int w=0;w<g.length()-1;w++){Integer n=0;if(g.charAt(w)=='.'){n=10;}else{n=Integer.parseInt(String.valueOf(g.charAt(w)));}for(int t=0;t<5;t++){for(int q=0;q<3;q++){int c=num[n][t][q]==1?0x000000:0xFFFFFF;image.setRGB(loc+q,t,c);}}loc+=5;}try{BufferedImage bi=image;File f=new File("o.png");ImageIO.write(bi,"png",f);}catch(IOException e){}}public static BigDecimal pi(final int SCALE){BigDecimal a=BigDecimal.ONE;BigDecimal b=BigDecimal.ONE.divide(sqrt(new BigDecimal(2),SCALE),SCALE,BigDecimal.ROUND_HALF_UP);BigDecimal t=new BigDecimal(0.25);BigDecimal x=BigDecimal.ONE;BigDecimal y;while(!a.equals(b)){y=a;a=a.add(b).divide(new BigDecimal(2),SCALE,BigDecimal.ROUND_HALF_UP);b=sqrt(b.multiply(y),SCALE);t=t.subtract(x.multiply(y.subtract(a).multiply(y.subtract(a))));x=x.multiply(new BigDecimal(2));}return a.add(b).multiply(a.add(b)).divide(t.multiply(new BigDecimal(4)),SCALE,BigDecimal.ROUND_HALF_UP);}public static BigDecimal sqrt(BigDecimal A,final int SCALE){BigDecimal x0=new BigDecimal("0");BigDecimal x1=new BigDecimal(Math.sqrt(A.doubleValue()));while(!x0.equals(x1)){x0=x1;x1=A.divide(x0,SCALE,BigDecimal.ROUND_HALF_UP);x1=x1.add(x0);x1=x1.divide(new BigDecimal(2),SCALE,BigDecimal.ROUND_HALF_UP);}return x1;}}

Erweiterte 2643 Zeichen:

public static void main(String[] args) {
    int[][][] num = { { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 } },
            { { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 } },
            { { 1, 1, 1 }, { 0, 0, 1 }, { 1, 1, 1 }, { 1, 0, 0 }, { 1, 1, 1 } },
            { { 1, 1, 1 }, { 0, 0, 1 }, { 1, 1, 1 }, { 0, 0, 1 }, { 1, 1, 1 } },
            { { 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, { 0, 0, 1 }, { 0, 0, 1 } },
            { { 1, 1, 1 }, { 1, 0, 0 }, { 1, 1, 1 }, { 0, 0, 1 }, { 1, 1, 1 } },
            { { 1, 1, 1 }, { 1, 0, 0 }, { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } },
            { { 1, 1, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 }, { 0, 0, 1 } },
            { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } },
            { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, { 0, 0, 1 }, { 0, 0, 1 } },
            { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 1 } } };

    BufferedImage image = new BufferedImage(103, 5, BufferedImage.TYPE_3BYTE_BGR);

    for (int q = 0; q < 103; q++) {
        for (int w = 0; w < 5; w++) {
            image.setRGB(q, w, 0xFFFFFF);
        }
    }

    int loc = 0;

    String g = String.valueOf(pi(20));
    for (int w = 0; w < g.length()-1; w++) {
        Integer n = 0;
        if (g.charAt(w) == '.') {
            n = 10;
        } else {
            n = Integer.parseInt(String.valueOf(g.charAt(w)));
        }
        for (int t = 0; t < 5; t++) {
            for (int q = 0; q < 3; q++) {
                int c = num[n][t][q] == 1 ? 0x000000 : 0xFFFFFF;
                image.setRGB(loc + q, t, c);
            }
        }
        loc += 5;
    }
    try {
        BufferedImage bi = image;
        File outputfile = new File("out2.png");
        ImageIO.write(bi, "png", outputfile);
    } catch (IOException e) {

    }
}

public static BigDecimal pi(final int SCALE) {
    BigDecimal a = BigDecimal.ONE;
    BigDecimal b = BigDecimal.ONE.divide(sqrt(new BigDecimal(2), SCALE), SCALE, BigDecimal.ROUND_HALF_UP);
    BigDecimal t = new BigDecimal(0.25);
    BigDecimal x = BigDecimal.ONE;
    BigDecimal y;

    while (!a.equals(b)) {
        y = a;
        a = a.add(b).divide(new BigDecimal(2), SCALE, BigDecimal.ROUND_HALF_UP);
        b = sqrt(b.multiply(y), SCALE);
        t = t.subtract(x.multiply(y.subtract(a).multiply(y.subtract(a))));
        x = x.multiply(new BigDecimal(2));
    }
    return a.add(b).multiply(a.add(b)).divide(t.multiply(new BigDecimal(4)), SCALE, BigDecimal.ROUND_HALF_UP);

}

public static BigDecimal sqrt(BigDecimal A, final int SCALE) {
    BigDecimal x0 = new BigDecimal("0");
    BigDecimal x1 = new BigDecimal(Math.sqrt(A.doubleValue()));
    while (!x0.equals(x1)) {
        x0 = x1;
        x1 = A.divide(x0, SCALE, BigDecimal.ROUND_HALF_UP);
        x1 = x1.add(x0);
        x1 = x1.divide(new BigDecimal(2), SCALE, BigDecimal.ROUND_HALF_UP);
    }
    return x1;
}

Die Pi-Methode wurde abgerufen unter: /programming/8343977/calculate-pi-on-android-phone?rq=1


Anscheinend haben Sie eine Konstante verwendet, anstatt den PI zu berechnen.
Hildred

Das ist eine schöne Wendung. Arbeite jetzt daran.
Clayton

Sie können es ein bisschen mehr durch Zugabe komprimieren throws Exceptionin mainden Try-Catch - Block und zu entfernen. Ferner können Sie umbenennen piund sqrtMethoden und die loc, args, SCALE, x0und x1Variablen auf 1 char Identifikatoren. Übrigens müssen Sie die gesamte Klasse hinzufügen, einschließlich derclass Foo{ Deklaration und der Importe.
Victor Stafusa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.