愚かな制限と砂漠


18

だから、あなたは机に座って、円周率の最初の20桁を計算するプログラムをゴルフしていました。そして上司が来て、リンゴIIeを窓から投げ出しました。現在、新しいプロジェクトに取り組んでおり、このコンピューターにはまだテキスト機能がありません。なし。フォントなし。なし。

それでは、そのプログラムを終了しましょう。プログラムの一部ではないフォントを使用せずに、piの最初の20文字を計算して表示します。出力は、イメージファイル(jpeg、png、gif、svg(文字を使用しない限り)、bmp、xpm)として表示または標準出力に書き込むことができます。任意の言語を使用できますが、言語のフォント機能、テキスト表示などを使用することはできません。

小さなボーナス(10文字)リサで動作する場合。

編集:それを理解しなかった人のために、私のインスピレーションは最初のMacであり、タイトルはしゃれです。アニメーションGIFがクールな@Sukminderへの大きな称賛。より良い答えが出れば、コンテストは終了しません。


私はこのチャレンジが好きですが、技術的にはそのようなシステムでもソースコードを表示できないでしょうか?もちろん、Pietを除きます。
ApproachingDarknessFish 14年

2
@ValekHalfHeart別のマシンからソースコードを読み込むことができます
ジョンドヴォルザーク14年

1
そして、人間が読める形式をどのように定義しますか?たとえば、筆跡は一部の人間(少なくとも1人)には読めるが、他の人には読めない。(ところで、2 ^(2x2)= 16、11桁すべてに十分なグリフ。;))
ケンドールフレイ14年

4
タイトルがまったくわかりません。テキスト表示を使用できない場合にASCIIアートを使用する方法がわかりません。また、質問には「PIの計算」の定義が必要です。
ピーターテイラー14年

2
「piの計算」とはどういう意味ですか?最初の20桁のビットマップをハードコードできますか?(組み込みのPI定数などを使用しません)
FireFly 14年

回答:


6

Python、222文字

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)

最初の行は、近似を使用してpiの桁を計算しますpi-3 ~= 277991633/1963319607。次の3行は、ASCIIアートのNemeth Brailleを使用して20文字のpiを出力します

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

ここでは、「Piを計算する」という意味と「人間が読み取れる」という意味の両方で、境界線を2つの方向に押し進めています。


3
一体何?テキスト出力を使用することは想定されていなかったと思います。あなたのコンピューター*はフォントなしでスペースとスペースをどのようにレンダリングしますか?
ブースビー14年

@boothby:それはASCIIアートです。*1 x 1の黒いピクセルと ``を1 x 1の白いピクセルと考えてください。
キースランドール14年

1
彼はポイントを持っています。*フォントを使用せずにレンダリングすることはできません、あなたは失格だと思う
サイレン14

18

Python、217バイト

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

バイト数は、エスケープされた文字\177がそれに相当するリテラル(char 127)に置き換えられることを前提としています。

出力は次のように表示されます(デフォルトの* .bmpビューアーで開きます)。

これを簡単にパラメーター化して、任意の桁数を印刷できることに注意してください。以下は、stdinからの整数入力を受け入れ、その桁数を表示します。

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の出力:


パイ計算

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

うん、それだけです。使用される式は、オイラーの変換ライプニッツ系列に適用し、合計の残りから各項を除外した結果です。式は線形に収束します。各桁にはlog 2(10)≈3.32の反復が必要です。派生に興味がある人は、付録Aを参照してください。

表示

PILは私が知っている最も便利なライブラリであるため、画像生成に使用されます。空白の141×11白黒のビットマップが作成され、その上に一度に1ピクセルずつ、7セグメント形式で白い線が描画されます。各セグメントの描画に必要な位置はビットマスク文字列に格納され、ビットは次の位置に対応します。

 000
3   5
3   5
 111
4   6
4   6
 222

魔法のビットは(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)、次の順序で各ピクセルを生成します(基数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

付録A

オイラーの変換は、絶対単調収束を表示する任意のシリーズで機能する収束加速技術です。結果の系列は、通常、用語ごとに1ビットのレートで線形に収束します(元の系列が既に超線形であった場合、結果の系列は実際にゆっくり収束します)。純粋に数学的な説明は、私が手続き的なアプローチを取ることになりますので、従うことが少し難しいです。

ライプニッツシリーズから始めます。

次に、隣接する用語を組み合わせて、各用語を半分に分割します。

簡略化:

一般化:

先頭の½にはパートナー用語がないため、残りの合計から除外されていることに注意してください。これは、変換されたシリーズの最初の項です。次の用語を見つけるために、プロセスを繰り返します。

そしてまた:

そしてまた:

そして、もう一度良い測定のために:

この時点で、最初の5つの用語があり、6番目の用語が明らかです。これで一般化するのに十分なはずなので、ここで停止します。分子と分母を因数分解することから始めます。

分母には​​明らかに2n + 1のDouble Factorialが含まれているため、次のパッチを適用します。

分母に2の勘定科目がない最初の2つの用語を除き、すべてが適合します。式全体に2を掛けることで修正できます。

2 3 = 2・4、したがって:

分子は、n!として簡単に識別できるようになりました

連続する各項に追加される係数n /(2n + 1)はnが大きくなると½に近づくことに注意してください。これは、項ごとに1ビットのレートで線形収束することを意味します。良い結果ですが、そこに階乗がなければさらに良くなります。ここでできることは、残りの合計から連続する各項を除外することです。これにより、ネストされた式が生成されます。



これは繰り返し関係として書き直すことができます:

ここで、nはカウント後方⌈からログ2(10)・D ⌉.. 0dは桁数が必要とされます。

この繰り返しの安定点は正確に2(上記の実装のように2倍にした場合は4)なので、適切に初期化することで多くの繰り返しを節約できることに注意してください。ただし、他の場所で必要なランダムな値に初期化し、上部にいくつかの余分な反復をスローすることは、一般的にバイト単位で安価です。


1
とてもいい、レッスンありがとう!私が手に入らないのは、pin。p/2 * x/p + ...がしていることです。AIUIPythonはbiginteger-ishデータ型への自動昇格をサポートしているので、それは正確なことではないはずですが、どういうわけかそれらはp重要であり、私が想像するようにキャンセルしないでくださいそれらに...私はここで何が欠けていますか?
ホタル14年

@FireFlyはp奇数に初期化されているため、p/2/p整数除算では-と同等((p-1)/2)/pです。これは、生産1/32/53/7、などの用語は上記の導出しました。
プリモ14年

12

#C – 777文字

C – 731文字

GIFをに印刷しstdoutます。

  • 癖:firstの後にカンマはありません3

事前に構成されたヘッダーからのGIFと、5x5ピクセルの自家製の(埋め込み)フォントで表される各数字をつなぎ合わせます。

結果

ここに画像の説明を入力してください

そこにあります--- ^

1回実行すると、ChromeでGIFが消えることがあります。

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

簡単な紹介:

PIの計算

Piは、Dik Winterのわずかに修正されたバージョンと、RabinowitzのAchim Flammenkampの実装と、πの数字を計算するためのWagonのアルゴリズムを使用して計算されます。

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

GIF画像のcanvasヘッダーにはプロパティがあります。left各数字のプロパティを設定することで、複数の画像を表示することと組み合わせて使用​​できます。各数字は、それ自体が(埋め込み)画像です。

ドキュメンテーション。

例:

Header: Canvas Width  100 pixels
        Canvas Height   5 pixels

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

拡張されたコード(大量のコメント付き)

乱雑ですが、それは最小化の一部です

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

πを計算するために、より短い/他のアルゴリズムを使用することを検討しています。


2
画像の最初の3の後にドットが表示されません。
ビクターStafusa 14年

1
pi decimals generation algorithmに関する情報へのリンクはありますか?私は(GIFのものを除去した後に)あなたのコードを少しいじったが、私は本当に見ていない理由 ...それはパイの桁につながる
ホタル

7

JavaScript、680文字

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

これはWebブラウザで表示できます。数値はSVGパスとして出力されます。

WebブラウザーでのSVG出力のスクリーンショット

  • 興味深い方法でpiを計算することはなく、JSには20桁を表示する精度の数値型がありません。

  • 文字を保存するために、シーケンスに表示されないため、「0」のパスデータを省略しました。


Ooh、ベクトルベースのアプローチ。フォントも非常に素晴らしく、良い仕事です。
FireFly

5

Java- 866 860 857 853文字、および574文字の不正バージョン

1996年のSimon Plouffe式を使用x.pngして、黒い背景に白いデジタル時計のような数字のファイルを出力します。

パイ

これは圧縮コードです:

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

それは、識別といくつかの空白を使用すると次のようになります。

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

規則をごまかし、PIの計算を「ストリング3.1415926535897934384の数値表現」として実行できることを考慮すると、これは574文字に削減できます。

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

1996年のSimon Plouffe式を使用して、以前の回答からコピーします。ただし、代わりにASCIIアートを出力します。

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

そのすべて、いくつかの識別とスペース、そして読者が魔法の数字の意味を理解するための少しの助けを借りて:

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

出力:

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

4

C、253 250文字

@Sukminderのコードのアルゴリズムを使用してpiを近似します(コードを恥知らずに借りて、リファクタリングします)。バイナリPBM画像を出力します。これは、たとえばImageMagickで変換できます。

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

点字ベースのPPMレンダラーでの出力は次のとおりです。

出力のスクリーンショット

@Sukminderの答えと同じ癖があり、小数点区切り記号がありません。さらに、私の出力は垂直であり、人間が読めるかどうかは議論の余地があります...

編集:@ugorenの提案を適用しました。


小さな改善:初期化に移行putsfor 、定義L[5]して省略し,0ます。dパラメーターを作成しますmain(コンマを保存します)。
ウゴレン14年

4

PHP 380

画像出力用にgdを有効にする必要があります

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

ここに画像の説明を入力してください

pi計算:基本phpのデフォルトの精度は14であり、任意の精度拡張を有効にしてサーバーを再コンパイルしたくないため、必要な小数でPIを近似することさえできなかったため、代わりにtau / 2を計算してから残りの小数

グラフィックは0と1で構成されているため、後でgdを削除できるかどうかを確認するために、WBMPをフォーマットとして使用してみます。


その画像は黒の上に赤で、非常に小さいですが、500%でよく見ると読むことができます。(と色盲されていません。)
hildred

@hildred各文字は3x5 with 1 px between charsです。色は4つの文字を軽減するだけで赤ですが、私は勝てないだろうことを考えると、私は読みやすくするために白に変更します
Einacio

私のコメントは、批評を意図したものではなく、説明を目的としたものであり、投票を奨励しました。
19:32に14年

imagecreateindexは文字を保存しますか?そのような機能は存在しますか?
19:33に14年

パレット画像(imagecreate)で作業する場合、@ hildred は最初の呼び出しでimagecolorallocate背景色を設定し、2番目の呼び出しで書き込み色を設定する必要があります。長く終了します
Einacio 14年

4

C + LaserWriterプリンター599-10 = 589

出力をLaserWriterにパイプします!:)これは、リサ(Cコンパイラ)で動作するはずです。

これは、計算pi直径で割った半円形に近似ベジェ曲線のシーケンスを近似直線セグメント、2倍の長さの和を計算することによってプリンタに。

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互換)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

出力:

ps_pi


フォントも作成する必要があると思います。
luserはドローグ

うーん。この方法で十分な数字を取得することはありません。PSには32ビットの浮動小数点のみがあります。
luserはドローグ

クールなアイデア、私はゴルフのポストスクリプトが好きです。
14

私は数字用のビットマップフォントを持っていますが、ゴルフはそれを台無しにするだけです!
luser droog 14年

2

Java、1574 2643 1934文字

圧縮された1934文字:

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

拡張された2643文字:

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メソッド:https : //stackoverflow.com/questions/8343977/calculate-pi-on-an-android-phone?rq=1


PIを計算する代わりに定数を使用したようです。
14年

それはいいひねりです。今作業中です。
クレイトン14年

try-catchブロックを追加throws Exceptionmainて削除することで、もう少し圧縮することができます。さらに、あなたが名前を変更可能pisqrtする方法とlocargsSCALEx0およびx11つの文字識別子に変数を。そして、完全なクラスを追加する必要がありますが、これにはclass Foo{宣言とインポートが含まれます。
ビクターStafusa 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.