三角形カウントのバイナリイメージ


18

私の挑戦は少し難しくて魅力的ではない傾向があります。簡単で楽しいものがあります。

アルクインの配列

アルクインのシーケンス A(n)は、三角形を数えることによって定義されます。A(n)は、整数の辺と周囲を持つ三角形の数ですn。このシーケンスは、ヨークのアルクインにちなんで呼ばれます。

このシーケンスの最初のいくつかの要素は、次のn = 0とおりです。

0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...

例えばA(9) = 3、整数の辺と周囲を持つ唯一の三角形91 - 4 - 43 - 3 - 3あり、2 - 3 - 4。下に3つの有効な三角形があります。

整数の辺と境界線を持つ三角形9

このシーケンスには、非常に興味深いパターンがいくつかあります。例えばA(2*k) = A(2*k - 3)

詳細については、OEISのA005044を参照してください。

チャレンジ

しかし、あなたの課題は、これらの数値のバイナリ表現についてです。各シーケンス番号をバイナリ表現に変換し、列ベクトルに入れて整列させると、非常に興味深いバイナリ画像が作成されます。

次の図では、シーケンス番号のバイナリ表現を見ることができますA(0), A(1), ..., A(149)。最初の列にはのバイナリ表現がありA(1)、2番目の列にはの表現がA(1)あります。

n = 0から149までのAlcuinのシーケンスのバイナリ表現

この写真では、ある種の繰り返しパターンを見ることができます。シーケンス番号のある画像を見ると、フラクタルのようにも見えますA(600), A(601), ..., A(899)

n = 600から899までのAlcuinのシーケンスのバイナリ表現

あなたの仕事は、そのような画像を生成することです。関数、スクリプトは2つの整数を受け取り0 <= m < n、Alcuinのシーケンスのバイナリイメージを生成する必要がありますA(m), A(m+1), A(m+2), ..., A(n-2), A(n-1)。したがって、入力0, 150は最初の画像を生成し、入力600, 900は2番目の画像を生成します。

任意の一般的なグラフィック形式を使用できます。image.online-convert.comを使用してpngに変換できるすべての形式を考えてみましょう。または、画面に画像を表示することもできます。先行する白い行は許可されません!

これはコードゴルフです。したがって、最短のコード(バイト単位)が優先されます。


3
ええ、私はバイナリイメージの作成に関する部分に到達するまで、この挑戦​​をすることに興味がありました。それは無関係なステップのようです。Pythonで画像を作成するためのライブラリを学習する気はありません。そうすれば、ゴルフをすることはあまりないでしょう。
XNOR

1
@xnor:PBMのようなシンプルな画像フォーマットを使用します。
ジャクベ

それであるwhite=1 and black=0か、他の方法で回避?
マルティセン

@Maltysen white=0 and black=1。だから他の方法。A(0)白い列をA(9)=3生成し、下部に2つの黒いピクセルを持つ白い列を生成します。
ジャクベ

1
最初の画像は正しいですか?0,0,0,1,0,2質問の冒頭のリストが述べている間、それは持っています0,0,0,1,0,1
マルティセン

回答:


2

J(52 45(コードページ437))

これは許可されます(私は思う)

[:|:' █'{~[:#:[:([:<.48%~*:+24+6*]*2|])(}.i.)

六角ダンプ

(特別なことは何もありません。黒い四角はコードページ437のDB 16または219 10です。)

0000: 5b 3a 7c 3a 27 20 db 27 7b 7e 5b 3a 23 3a 5b 3a   [:|:' .'{~[:#:[:
0010: 28 5b 3a 3c 2e 34 38 25 7e 2a 3a 2b 32 34 2b 36   ([:<.48%~*:+24+6
0020: 2a 5d 2a 32 7c 5d 29 28 7d 2e 69 2e 29            *]*2|])(}.i.)

使用法

これは次のように出力します(コードタグは、行間にスペースを追加することで混乱させます)。

   A=:[:|:' █'{~[:#:[:([:<.48%~*:+24+6*]*2|])(}.i.)
   0 A 100
                                                                             █ █████████████████████                                          
                                                     █ ██████████████████████ █              █ █████                          
                                     █ ██████████████ █          █ ██████████ █      █ ██████ █                   
                         █ ██████████ █      █ ██████ █    █ ████ █    █ ████ █  █ ██ █  █ ██ █  █ █  
                 █ ██████ █    █ ████ █  █ ██ █  █ ██ █  █  █  █  █  █  ██ ██ ██  ██  ██  ██  ██  ██
           █ ████ █  █ ██ █  █  █  █  ██  ██  ██  ██  ██  █  █  █  █ ██ █  █ ████ █                               
       █ ██ █  █  ██  ██  ██  █  █ ██ █                █ ██ █  █  ██  ██  ██  █  █ ██ █                                   
   █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █    
   2000 A 2100
████████████████████████████████████████████████████████████████████████████████████████████████████

████████████████████████████████████████████████████████████████████████████████████████████████████
                                                                             █ █████████████████████
                             █ ██████████████████████████████████████████████ █
     █ ██████████████████████ █                      █ ██████████████████████ █
█████ █          █ ██████████ █          █ ██████████ █          █ ██████████ █          █ █████████
 ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ████ █    █ ███
█  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █
██  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █ ██ ██ █
 █ ██ ██ ██ ██ ██ █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  █  ██ ██ ██ ██ ██  █  █
  ██ ██ ██  █  █  ██ ██ ██  █  █  █  █  █  █  █  █  █  █  █  █  █  █ ██ ██ ██ █  █  █  █ ██ █  █ ██
 █ ██ █  █ ██ █  █ ██ █  █ ██ █  █  █  █  █  █  █  █  █  █  ██ ██ ██  █  █  ██  ██ ██ ██  ██  ██  ██
  ██  ██  ██  ██  ██  ██  ██  ██ ██ ██  █  █  █  █  █  █ ██ █  █ ██ █  █ ████ █    █ ██████ █
█ █                        █ ████ █  █ ██ █  █  █  █  ██  ██  ██  ██  ██  █  █  █  █ ██ █  █ ████ █
 █ ██ █                █ ██ █  █  ██  ██  ██  █  █ ██ █                █ ██ █  █  ██  ██  ██  █  █ █
██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██  ██ ██ █        █ ██ ██

標準のJコンソールでは、行間にスペースがないため、「代替として、画面に画像を表示する」というルールを呼び出します。(この画像を理にかなった画像形式として内部的に表現する必要があるとはどこにも言わなかった)

編集:(JQTとは対照的に)Jconsoleはデフォルトとしてコードページ437を使用し、文字列から長方形を使用する場合、長方形を正しくレンダリングします。


9

Mathematica、126 122 121 89バイト

Image[1-Thread@IntegerDigits[l=Round[(#+3#~Mod~2)^2/48]&/@Range@##,2,⌈2~Log~Max@l⌉]]&

これは、パラメータとして2つの整数を取り、画面に画像を表示する名前のない関数を定義します。各正方形を1つのピクセルとしてプロットしますが、必要に応じて実際にズームインできます。

私は現在、OEISの記事(Mathematicaセクションの最初の式、それを指摘してくれたDavid Carraherに感謝します)で与えられている明示的な式を使用しています。また、非常に高速になりました。

インデントされたコードといくつかのコメントを次に示します。

Image[1-Thread@IntegerDigits[   (* 3. Convert each number to padded binary, transpose
                                      invert colours, and render as Image. *)
    l = Round[
      (#+3#~Mod~2)^2/48
    ] & /@ Range@##,            (* 1. Turn input into a range and get the Alcuin
                                      number for each element. *)
    2,
    ⌈2~Log~Max@l⌉               (* 2. Determine the maximum number of binary digits. *)
]] &

の出力は0, 600次のとおりです。

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


ほぼ同じサイズです(左と右の天井をImage[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
正確に

@DavidCarraherありがとう、もう少しゴルフをしました。:)(OEISの記事を確認する必要があります。)
マーティンエンダー

8

CJam(56 55 53文字)/ GolfScript(64文字)

CJam:

"P1"q~,>{_1&3*+_*24+48/}%_:e>2b,\2_$#f+2fbz(,@@:~~]N*

GolfScript:

"P1"\~,>{.1&3*+.*24+48/}%.$-1=2base,\{2.$?+2base}%zip(,@@{~}/]n*

どちらもNetPBM形式で出力を生成し、本質的に互いのポートです。

解剖

CJam                 GolfScript           Explanation

"P1"                 "P1"\                NetPBM header
q~,>                 ~,>                  Create array [m .. n-1]
{_1&3*+_*24+48/}%    {.1&3*+.*24+48/}%    Map the sequence calculation
_:e>2b,\             .$-1=2base,\         Compute image height H as highest bit
                                          in largest number in sequence
2_$#f+2fb            {2.$?+2base}%        Map sequence to bits, ensuring that
                                          each gives H bits by adding 2^H
z(,@@                zip(,@@              Transpose and pull off dummy row to use
                                          its length as the "width" in the header
:~~                  {~}/                 Flatten double array and dump on stack
]N*                  ]n*                  Separate everything with whitespace

Optimizer for CJam 56-> 53に感謝します。


1
何らかの理由で、先頭に「P1」がないため、「?
オプティマイザー

@ Optimizer、GSでの思考にも慣れています。
ピーターテイラー

完全ではありません:出力に高さが必要です。ただし、マップの短縮にはまだ節約が必要です。
ピーターテイラー

51:'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
オプティマイザー

5

パイス-101 60 59

aを出力し.pbmます。おそらくもっとゴルフができます。

Km.B/++24*dd**6%d2d48rvzQJCm+*\0-eSmlkKlddK"P1"lhJlJjbmjbdJ

私がPythに翻訳するので、非常に手放しました。

次に説明します。今、同等のPythonコードを見てください。

OEISアルゴリズムを使用してシーケンスを計算し、バイナリに変換し、数値を埋め込み、マトリックス回転を行い、pbm画像にフォーマットします。私はブルートフォースを使用していないため、非常に高速です。

         K=
 m          rvzQ      Map from eval input to eval input
  .B                  Binary rep
   /      48          Divided by 48
    ++                Triple sum      
     24               Of 24,
     *dd              Square of d
     **               Triple product
      6               6
      %d2             Modulo d%2
      d               Var d
J                     Set J=
 C                    Matrix rotation from columns of row to rows of columns
  m           K       Map K (This does padding)
   +                  String concat
    *                 String repeat
     \0               "0"
     -     ld         Subtract the length of the column from
      eS              The max
       mlkK           Of all the column lengths
    d                 The column
"P1"                  Print header "P1"
l                     Length of
 hJ                   First row
lJ                    Number of columns
jb                    Join by linebreaks
 m  J                 Map on to J
  jb                  Joined columns by linb
   d

以下に600,900例を示します。

600〜900

こちらからオンラインでお試しください


4

R - 127 125

これがルールに完全に準拠しているかどうかはわかりません。画像をファイルに出力しませんが、ラスタを作成して出力デバイスにプロットします。

Martinと同じ式を見つけましたが、ここにあります

名前のない関数を使用します。

require(raster);function(m,n)plot(raster(mapply(function(n)rev(as.integer(intToBits(round((n+n%%2*3)^2/48)))),m:n),0,n,0,32))

次のように実行します

require(raster);(function(m,n)plot(raster(mapply(function(n)rev(as.integer(intToBits(round((n+n%%2*3)^2/48)))),m:n),0,n,0,32)))(0,600)

次のプロットを作成します

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


raster名前空間にアタッチしないことで7バイトをドロップできます。これraster()は、そのパッケージに固有の唯一のものであるためです。代わりにただraster::raster(...)
アレックスA.

@AlexA。ありがとう、編集してくれます
-MickyT

@AlexA。残念なことに、私はそれを試してみましたが、エラーが出ました。ラスターにもspが必要なためだと思います。追跡できるかどうかを確認します。
MickyT

残念。道に迷ってごめんなさい。
アレックスA.

3

Python 2 + PIL255 184

私の最初のバージョンは、画像を表示するためにPILを使用しました:

i,R,B=input,range,lambda x:bin((x*x+6*x*(x%2)+24)/48)[2:]
def F(k,v):i.load()[k]=v
a,b=i(),i();h=len(B(b));from PIL import Image;i=Image.new('P',(b-a,h))
[F((x-a,y),int(B(x).zfill(h)[y])) for x in R(a,b) for y in R(h)]
i.putpalette([255]*3+[0]*3)
i.show()

新しいバージョンでは、stdoutでb&w PPMイメージが生成されます。

i,R,B=input,range,lambda x:bin((x*x+6*x*(x%2)+24)/48)[2:]
def p(s):print s
a,b=i(),i();h=len(B(b));p('P1 %i %i'%(b-a,h))
[p(' '.join([B(x).zfill(h)[y] for x in R(a,b)])) for y in R(h)]

PPMバージョンの一部のキャラクターの保存:の前にスペースは必要ありませんforx%2順序をに変更することにより、周りの括弧を回避できx%2*...ます。関数としてprintを定義せず、2つのネストされたforループを使用print ...,して、改行を避けるために使用しprint、新しい行を開始するために空白を使用する方が短いです。バイナリ展開を強制的に長さをh持たないトリックzfillは、を追加して2**hから最後のh桁を抽出することです。
xnor

2

ジャバスクリプト-291

コード:

(function(a,b,c){c.width=b;t=c.getContext('2d');t.strokeStyle='black';for(i=a;i<=b;i++){g=(Math.floor(((i*i)+6*i*(i%2)+24)/48)>>>0).toString(2);l=g.length;for(j=0;j<l;j++){if(g[l-1-j]=='1'){t.rect(i-a,j,1,1);t.fill();}}}document.body.appendChild(c);})(0,300,document.createElement('canvas'))

説明:

(function (a, b, c) {
    //setting canvas width
    c.width = b;
    //get context 2d of canvas
    t = c.getContext('2d');
    //setting storke style.
    t.strokeStyle = 'black';
    //looping from a to b
    for (i = a; i <= b; i++) {
        //calculating A(i) and converting it to a binary string
        g = (Math.floor(((i * i) + 6 * i * (i % 2) + 24) / 48) >>> 0).toString(2);
        //looping through that string
        for (j = 0; j < g.length; j++) {
            //since canvas is upside down and the first digit is actually the last digit:
            if (g[g.length - 1 - j] == '1') {
                //we create the 1 by 1 rect
                t.rect(i - a, j, 1, 1);
                //we draw the rect
                t.fill();
            }
        }
    }
    //we append everything to the body
    document.body.appendChild(c);
    //parameters are put here
})(0, 300, document.createElement('canvas'))

結果:

はい、結果は逆さまですが、それは0,0a js canvasが左上だからです。:3 アルキンのシーケンス

デモ:

jsfiddleのデモ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.