aptal kısıtlamalar ve çöl


18

Yani, masanızda oturuyordunuz, pi'nin ilk 20 hanesini hesaplamak için bir program golf oynuyordunuz ve birlikte patronunuz geliyor ve elma IIe'yi pencereden dışarı atıyor. Şu anda yeni bir proje üzerinde çalışıyorsunuz ve bu bilgisayarın henüz metin özelliği yok. Yok. Yazı tipi yok. Hiçbir şey değil.

Şimdi bu programı bitirelim. Programınızın parçası olmayan yazı tiplerini kullanmadan pi'nin ilk 20 karakterini hesaplayın ve görüntüleyin . Çıktınız bir görüntü dosyası (jpeg, png, gif, svg (herhangi bir karakter kullanmadığınız sürece), bmp, xpm olarak görüntülenebilir veya standart olarak yazılabilir. Herhangi bir dili kullanabilirsiniz, ancak dilinizin yazı tipi işlevlerini, metin ekranını veya benzerini kullanamazsınız.

küçük bonus (10 karakter) Bir Lisa üzerinde çalışacaksa.

Düzenleme: Anlamadım olanlar için benim ilham ilk mac, ve başlık bir pun olduğunu. @Sukminder için animasyonlu gif sadece harika bir kudos. Daha iyi bir cevap gelirse yarışma bitmez.


Ben meydan okumayı seviyorum, ancak teknik olarak böyle bir sistem kaynak kodunu görüntüleyemez mi? Elbette Piet hariç.
ApproachingDarknessFish

2
@ValekHalfHeart farklı bir makineden kaynak kodunu yükleyebilirsiniz
John Dvorak

1
İnsan tarafından okunabilirliği nasıl tanımlıyorsunuz? Örneğin, el yazım diğerlerine değil bazı insanlara (en az bir) okunabilir. (Bu arada, 2 ^ (2x2) = 16, 11 basamak için yeterli glif.;))
Kendall Frey

4
Başlığı hiç anlamıyorum, metin ekranını kullanamadığımızda ASCII sanatının nasıl iyi olabileceğini anlamıyorum ve sorunun çok fazla "PI hesapla" tanımına ihtiyacı var.
Peter Taylor

2
"Pi hesapla" gerçekten ne anlama geliyor? İlk 20 ondalık sayının bir bitmap'ini kodlayabilir miyim? (Herhangi bir yerleşik PI sabitini veya benzerini kullanmaz)
FireFly

Yanıtlar:


6

Python, 222 karakter

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)

İlk satır, yaklaştırmayı kullanarak pi basamaklarını hesaplar pi-3 ~= 277991633/1963319607. Sonraki üç satır, ASCII sanatı Nemeth Braille'i kullanarak pi karakterinin 20 karakterini çıktı .

 *     *
 * **    *  ** *  *   * *  ** *  ** *  *   * **  * ** *  ** * 
**     *     *     * *  *  *   *     * ** *  ** *     *     **

Burada "Pi hesaplanıyor" ve "insan tarafından okunabilir" duyularında iki yönde sınırları zorluyorum.


3
Bu da ne? Herhangi bir metin çıktısı kullanmamamız gerektiğini düşündüm. Bilgisayarınız *'s ve boşlukları yazı tipi olmadan nasıl oluşturacak ?
boothby

@boothby: Bu ASCII sanatı. *1x1 siyah piksel ve `` 1x1 beyaz piksel olarak düşünün .
Keith Randall

1
Bir anlamı var. *Yazı tiplerini kullanmadan oluşturamazsınız , bence diskalifiye oldunuz
Sirenler

18

Python, 217 bayt

Python Görüntüleme Kütüphanesi gerektirir

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

Bayt sayısı, kaçan karakterin \177yerine değişmez eşdeğeri bulunduğunu varsayar (karakter 127 ).

Çıktı aşağıdaki gibi görünecektir (varsayılan * .bmp görüntüleyicinizde açılacaktır):

Bunun, istediğiniz sayıda rakamı basmak için kolayca parametrelendirilebileceğini unutmayın. Aşağıdaki, stdin'den bir tamsayı girişini kabul edecek ve bu kadar basamak görüntüleyecektir:

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

N = 80 için çıkış :


Pi Hesaplama

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

Evet, hepsi bu. Kullanılan formül uygulanması sonucu Euler Transform için Leibniz Serisi toplamının geri kalan her dönem ve ardından Faktoring. Formül doğrusal olarak birleşir; her basamak log 2 (10) ≈ 3,32 gerektirir tekrarını gerektirir. Türev ile ilgilenenler için Ek A'ya bakınız.

Görüntüle

PIL görüntü üretimi için kullanılır, çünkü bildiğim en uygun kütüphane. Boş bir 141 × 11 siyah beyaz bitmap oluşturulur ve daha sonra, her seferinde bir piksel olmak üzere yedi segmentli bir şekilde beyaz çizgiler çizilir. Her segmenti çizmek için gereken konumlar, bitler aşağıdaki konumlara karşılık gelecek şekilde bir bitmask dizesinde saklanır:

 000
3   5
3   5
 111
4   6
4   6
 222

Büyü biraz (j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)her pikseli aşağıdaki sırayla üretir (taban-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

Ek A

Euler Dönüşümü, mutlak monotonik yakınsama gösteren herhangi bir seri için çalışan bir yakınsama hızlandırma tekniğidir. Ortaya çıkan seri doğrusal olarak, tipik olarak terim başına bir bit hızında birleşecektir (orijinal seri zaten süper doğrusal ise, ortaya çıkan seri aslında daha yavaş birleşecektir). Tamamen matematiksel açıklama bir prosedürel yaklaşım atacağız yüzden takip etmek biraz zordur.

Leibniz Serisi ile başlayacağız:

Ardından, komşu terimleri birleştirerek her terimi ikiye bölün:

Basitleştirilmiş:

genelleştirilmiş:

Önde gelen a'nin ortak bir terimi olmadığına ve bu nedenle toplamın geri kalanından hariç tutulduğuna dikkat edin. Bu, dönüştürülmüş serinin ilk terimidir. Bir sonraki terimi bulmak için işlemi tekrar ediyoruz:

Ve yeniden:

Ve yeniden:

Ve iyi önlem için bir kez daha:

Bu noktada ilk beş terime sahibiz ve altıncı terim açıktır. Bu genelleme için yeterli olmalı, bu yüzden burada duracağız. Payları ve paydaları çarpanlarına ayırarak başlayacağız:

Paydalar açıkça 2n + 1 olan bir Çift Faktöriyel içerirler , bu yüzden bunu

Paydada 2 için hesaplanmamış ilk iki terim hariç her şey uyuyor . Tüm ifadeyi 2 ile çarparak bunu düzeltebiliriz :

2 3 = 2 · 4 , yani:

Pay artık kolayca n olarak tanımlanabilir ! .

Her ardışık terime eklenen faktörün n / (2n + 1) , ½ n büyüdükçe yaklaşımlarının , her terim için bir bit oranında doğrusal bir yakınsama anlamına geldiğine dikkat edin - bu aslında tasarım gereğidir. Güzel bir sonuç, ama orada faktöriyelere sahip olmadan daha da güzel olurdu. Burada yapabileceğimiz, birbirini izleyen her terimi, iç içe bir ifade oluşturacak olan toplamın geri kalanından ayırmaktır:



Bu bir yineleme ilişkisi olarak yeniden yazılabilir:

Burada n, geriye doğru sayar gelen ⌈ log 2 (10), • D ⌉ .. 0 , burada d gerekli basamak sayısı.

Bu nüksün kararlı noktasının tam olarak 2 (veya yukarıdaki uygulamada olduğu gibi ikiye katladıysanız 4) olduğunu belirtmek ilginç olabilir , böylece düzgün bir şekilde başlatarak bir dizi iterasyon kaydedebilirsiniz. Yine de, başka bir yerde ihtiyacınız olan rastgele bir değere başlamak ve üstüne birkaç ekstra yineleme atmak genellikle daha ucuz byte-bilge.


1
Çok güzel, ders için teşekkürler! Ne alamadım ne pde p/2 * x/p + ...bir hassasiyet şey olmamalı bu yüzden, AIUI Python bir BigInteger-imsi veri türüne otomatik promosyon destekler .. yapıyor, ama nedense o pan meselesi ve hayal gibi dışarı iptal etmeyin onları ... burada neyi özlüyorum?
FireFly

@FireFly ptek tek başlattı, yani bu p/2/p- tamsayı bölümü altında - ile eşdeğerdir ((p-1)/2)/p. Bu üretir 1/3, 2/5, 3/7vb terimleri, yukarıda elde edilen.
primo

12

#C - 777 Karakter

C - 731 Karakter

GIF öğesini yazdırır stdout.

  • Quirk: Önce virgül yok 3.

Önceden yapılandırılmış başlıktan + 5x5 piksellik ev yapımı (gömülü) yazı tipi ile temsil edilen her basamaktan GIF'i birleştirmek.

Sonuç

resim açıklamasını buraya girin

Orada --- ^

GIF'in bazen bir çalıştırmadan sonra Chrome'da kaybolduğunu unutmayın.

#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);}

Kısa tanıtım:

PI hesaplaması

Pi, Dik Winter'ın biraz değiştirilmiş bir versiyonu ve Achim Flammenkamp'ın in rakamlarını hesaplamak için Rabinowitz ve Wagon algoritmasını uygulamasıyla hesaplanır.

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 oluşturma

GIF görüntülerinin canvasbaşlıkta bir özelliği var. Bunu, lefther bir basamağın kendi içinde bir (gömülü) görüntü olduğu şekilde her basamak için özellik ayarlayarak birden fazla görüntü göstermeyle birlikte kullanabiliriz .

Belgeler.

Misal:

Header: Canvas Width  100 pixels
        Canvas Height   5 pixels

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

Genişletilmiş kod (çok sayıda yorum içeren)

Dağınık, ancak bu minimizasyonun bir parçası :

#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);
}

Π hesaplamak için daha kısa / başka bir algoritma kullanmak ister.


2
Resimdeki ilk 3'ten sonra noktayı göremiyorum.
Victor Stafusa

1
Pi ondalık sayı oluşturma algoritması hakkında bilgi bağlantınız var mı? Kodunuzla biraz oynadım (GIF öğelerini çıkardıktan sonra), ancak neden pi rakamlarıyla sonuçlandığını gerçekten anlamıyorum ...
FireFly

7

JavaScript, 680 karakter

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

Bu bir web tarayıcısında görüntülenebilir; sayılar SVG yolları olarak çıkar.

Bir web tarayıcısında SVG çıktısının ekran görüntüsü

  • Pi'yi ilginç bir şekilde hesaplamaz ve JS, 20 basamak görüntülemek için hassas bir sayı türünden yoksundur.

  • Karakterleri kaydetmek için, sırayla görünmediği için "0" yol verisini atladım.


Ooh, vektör tabanlı bir yaklaşım. Yazı tipinde de çok güzel, iyi iş.
FireFly

5

Java - 866 860 857 853 karakter, artı 574 karakter ile hile sürümü

1996'dan Simon Plouffe formülünü kullanarak, x.pngsiyah arka planda beyaz dijital saat benzeri sayılar içeren bir dosya çıkarır :

pi sayısı

Bu sıkıştırılmış kod:

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);}}

Tanımlama ve bazı boşluklar ile bu olurdu:

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);
    }
}

Kuralları kopyalamak ve PI hesaplamasının "String 3.1415926535897934384'ün sayısal temsili" olarak yapılabileceğini göz önünde bulundurarak, bu 574 karaktere indirilebilir:

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 - 642622 karakter

1996'dan Simon Plouffe formülünü kullanarak önceki cevabımdan kopyalama. Ama bunun yerine ASCII-art çıktı:

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));}}

Tüm bunlar, bazı tanımlama ve boşluklar ve okuyucuya biraz yardım ile sihirli sayıların anlamını anlıyor:

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));
    }
}

Çıktı:

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

4

C 253 250 karakter

@ Sukminder kodundaki algoritmayı kullanarak pi'ye yaklaşır (utanmadan ödünç alıp kodlarını biraz yeniden düzenler). Bir Çıkışlar ikili PBM görüntüsü daha sonra örneğin Imagemagick ile dönüştürülmüş olabilir.

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);}

Braille tabanlı PPM oluşturucumla çıktı şöyle görünür:

Çıktının ekran görüntüsü

Ondalık ayırıcıdan yoksun olması nedeniyle @ Sukminder'ın cevabı ile aynı tuhaflığa sahiptir. Buna ek olarak, benim ürünüm dikey ve insan tarafından okunabilir olup olmadığı tartışmalı ...

Düzenleme: uygulanmış @ ugoren önerileri.


Küçük gelişmeler: hareket putsiçine for başlatma tanımlamak L[5]ve omit ,0. (Virgül kaydedin) diçin bir parametre yapın main.
ugoren

4

PHP 380

görüntü çıkışı için gd etkinleştirilmiş gerektirir

<? 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);

resim açıklamasını buraya girin

pi hesaplama: temel php 14 varsayılan bir hassasiyete sahip olduğundan ve sunucuyu keyfi hassas uzantılar etkinleştirildiğinde yeniden derlemek istemediğimden, gerekli ondalık sayılarla PI'yı yaklaşık olarak hesaplayamadım, bu yüzden bunun yerine tau / 2'yi hesaplar ve sonra ondalık sayıların geri kalanı

grafik 0 ve 1 yapılmış olduğundan, ben gd kaldırmak olup olmadığını görmek için daha sonra biçim olarak WBMP kullanmayı deneyebilirsiniz


bu görüntü siyah üzerine kırmızı ve gerçekten küçük, ancak yakından bakarsanız% 500'de okuyabilirsiniz. (ve renk körleri değildir.)
Hildred

@hildred her karakter 3x5 with 1 px between chars. renk sadece 4 karakter azaltmak için kırmızı, ancak kazanamayacağımı
düşünürsem

Benim yorumum bir eleştiri olarak değil, açıklama olarak oyları teşvik etmekti.
Hildred

İmagecreateindex herhangi bir karakteri kaydeder mi? böyle bir işlev var mı?
Hildred

Bir palet görüntüsü ( imagecreate) ile çalışırken @hildred ,imagecolorallocate arka plan rengini ayarlar ve ikincisi yazma rengini ayarlamak için gereklidir. böylece daha uzun bitiyor
Einacio

4

C + LaserWriter yazıcı 599-10 = 589

Çıkışı LaserWriter'ınıza bağlayın! :) Bu bir Lisa (C derleyicisi ile) üzerinde çalışması gerekir.

Bu hesaplar piçapı tarafından bölünen bir yarım daire yaklaşan Bezier eğrisi dizisini yaklaşık hattı segmentleri, kere 2 uzunluklarının toplamını hesaplayarak yazıcı.

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

Çıktı:

ps_pi


Sanırım bir yazı tipi de yapmam gerekiyor.
luser droog

Hmm. Asla bu şekilde yeterli rakam alamayacaksın. PS'de sadece 32-bit float var.
luser droog

harika bir fikir, golf için postscript'i seviyorum.
Hildred

Rakamlar için bir bitmap yazı tipim var ama golf sadece mahvedecek!
luser droog

2

Java, 1574 2643 1934 karakter

Sıkıştırılmış 1934 karakter:

    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;}}

Expanded 2643 karakter:

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;
}

Pi yöntemi toplandı: /programming/8343977/calculate-pi-on-an-android-phone?rq=1


PI hesaplamak yerine sabit kullandığınız anlaşılıyor.
14'te

Güzel bir bükülme. Şimdi üzerinde çalışıyorum.
Clayton

Sen ekleyerek biraz daha sıkıştırıp olabilir throws Exceptioniçinde mainve try-catch bloğu kaldırma. Dahası, yeniden adlandırmak olabilir pive sqrtyöntem ve loc, args, SCALE, x0ve x11 karakter tanımlayıcılar değişkenleri. Bu arada , tüm sınıfı eklemelisiniz, bu class Foo{beyanı ve ithalatı içerir.
Victor Stafusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.