フラクタル大聖堂


22

正の整数を指定すると、次の構造のn >= 1最初のn行が出力されます。

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

n目1インデックス付き列は、バイナリ表現であるnと最後の文字、コピーせずにミラーリング、#1の代わりに、および<space>すべての行を中心と0の代わりにします。

ASCIIアートとして出力する必要がありますが#、この例で使用する場所の代わりに非空白文字を使用できます。末尾の空白は許可され、末尾の改行は許可されます。出力は例のように見える必要があり、余分な先行空白や先行改行はありません。

ここでは、フラクタル大聖堂の最初の1023行を表示できます。

より大きなテストケースを生成するために、Pythonでの無制限のリファレンス実装を次に示します。


良いアイデア。2進数がこのようなかなりのアスキーアートを生み出したとは思いませんでした。
ジョナ

@Jonahありがとう:)気に入ってくれて嬉しいです
-HyperNeutrino

7
両方のリンクは、生成された大聖堂を指しています。
オタビオ

@Otávio:修正します、ありがとう
-HyperNeutrino

回答:


6

MATL、10バイト

:B2&Zv35*c

オンラインでお試しください!

説明

:      % Implicitly input n. Push range [1 2 ... n]
B      % Convert to binary. Gives a matrix where each row corresponds to
       % a number. Rows have left-padding zeros if needed
2      % Push 2
&Zv    % Symmetrize along sepecified dimension (2nd means horizontally),
       % without repeating the last element
35*    % Multiply by 35 (ASCII code for '#')
c      % Convert to char. Char 0 is shown as space. Implicitly display

1
35を掛けてからcharに変換することに対応する、ある種の組み込み関数を追加することが役立つのではないかと思います。頻繁に使用されるようです
コナーオブライエン

@ ConorO'Brienよく使われます、はい。しかし、それは2文字の組み込みであるため、ゲインはありません
ルイスメンドー

ゲインがありませんか?35*c4文字です
コナーオブライエン

@ ConorO'Brien Ah、あなたは35修正したという意味ですか?それは少し具体的なようです。一方、いくつかの課題では任意のcharが許可されるため、良いアイデアかもしれません。#最も一般的だと思いますか?
ルイスメンドー

2
参考のために、この機能が実装されています(機能Zc、文字35、つまり#)。ありがとう、@ ConorO'Brien!
ルイスメンドー




3

JavaScript(ES6)、106バイト

1非空白文字として使用します。

f=(n,k=0)=>k++<n?[...Array(32-Math.clz32(n))].reduce((s,_,i)=>(c=k>>i&1||' ')+s+(i?c:''),'')+`
`+f(n,k):''

デモ

代替バージョン(同じサイズ)

なしMath.clz32()

f=(n,a=[k=i=0])=>n>>i+1?f(n,a,a[++i]=i):k++<n?a.reduce((s,i)=>(c=k>>i&1||' ')+s+(i?c:''),'')+`
`+f(n,a):''

1
非常に素晴らしい!初めて見たMath.clz32-存在すら知らなかった!
ビルジョラクセ

@Birjolaxewうん、これはES6の追加です。たまに便利です。
アーナルド

3

21 20 18バイト

@ Zgarb、2バイトのゴルフをありがとう!

S↑(tfS=↔ΠR" #"←DLḋ

オンラインでお試しください!

非ゴルフ/説明

長いパディングを避けるために、これは次のように与えられるフラクタルの幅を決定します 2*len(bin(N))-1その長さのすべてのシーケンスをシンボルで生成します#,_(「_」はスペースを示します)。

デカルトの累乗は順番に生成され、2進数も生成されるため、これで問題ありません。この時点でフラクタルを取得するために必要なことは、すべての回文を除外することです。

                    -- implicit input N
S↑(                 -- take N from the following list
        ΠR" #"      --   Cartesian power of [" #"] to
                Lḋ  --     number of bits in bin(N)
               D    --     2*
              ←     --     -1
    fS=↔            --   filter out palindromes
   t                --   drop the first line (all spaces)

1
Ṙ;だけRにすることができ、ȯ不要です。いい答えのアイデア!
-Zgarb

2

Mathematica、94バイト

Column[Row/@Table[s=IntegerDigits[i,2];Join[s,Reverse@Most@s]/.{0->" ",1->"#"},{i,#}],Center]&

2
私も本当に行かなければならない
...-J42161217

2

Mathematica、98バイト

Riffle[Nest[ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&,{1},⌊Log2@#⌋]~Take~#"#"/. 0->" ","
"]<>""&

Wolframサンドボックスで試してみてください!、各バイト3です。

これは、パターンのフラクタル性を使用して、これまでの他の回答とは異なるアプローチです。重要なステップはでArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&、これはフラクタルな処理を行い、画像形式で最もよく説明されています。

                 [    ]
                 [grid]
[    ]           [    ]
[grid]   --->   #      #
[    ]          #[    ]#
                #[grid]#
                #[    ]#

コードは、少なくともn行を取得するのに十分な回数このステップを繰り返し、余分な行を削除して適切に表示します。




2

C#(.NET Core)192 178バイト 168 + 23

TheLethalCoderに助けてくれてありがとう。

x=>new int[x].Select((_,z)=>Convert.ToString(z+1,2).PadLeft((int)Math.Log(x,2)+2).Replace('0',' ')).Aggregate((y,z)=>y+"\n"+z+new string(z.Reverse().Skip(1).ToArray()))

オンラインでお試しください!

これは、文字列のパディングと反転の可能性が高いため、大幅に削減できると確信しています。


PPCGへようこそ!現時点では、この答えは単なるコードスニペットです。x=>バイトカウントにを追加することで修正でき、末尾のセミコロンを含める必要がないことに注意してください。Enumerable.Range(1,x).Select(zとして短いですnew int[x].Select((_,z)(私はそれが正しいと思います)。Linqを使用している場合using System.Linq;、バイトカウントに含める必要があります。また、使用しているMathので、それを含めるusing System;か完全に修飾する必要があります。これはその後短くなることに注意してくださいnamespace System.Linq{}
TheLethalCoder

スペースがデフォルト,' 'であるため、PadLeftコールに含める必要はありません。
-TheLethalCoder


@TheLethalCoderはご不便をおかけして申し訳ありませんが、現在修正されています。
-Dennis.Verweij

私からの心配+1はありません:それはいい答えです:)
TheLethalCoder

1

、28バイト

A…·¹NθW⌈θ«Eθ§ #κ↓⸿AEθ÷κ²θ»‖O

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

A…·¹Nθ

最初のn自然数のリストを作成します。

W⌈θ«

すべての要素がゼロになるまで繰り返します。

Eθ§ #κ

リストの各要素の最後の2進数をor として出力し#ます。

↓⸿

前の列に移動します。

AEθ÷κ²θ

リストのすべての要素を2で割ります。

»‖O

左半分を描いたら、それを反映します。


チャコールの現在のバージョンでは、MapAssignRight(IntDivide, 2, q);3バイトを節約できます。
ニール

1

J、29バイト

' #'{~(],}.@|.)"1@(#.^:_1)@i.

オンラインでお試しください!

説明

  • i. nまでの整数、入力
  • (#.^:_1) 基数2に変換
  • (],}.@|.)行ごとに("1その部分を行います)、2進数(]アイデンティティfn)を取得し、,その逆(|.)でそれをcat (}.)します。
  • ' #'{~1sと0sをハッシュとスペースに変換します。

#.inv代わりに使用できます#.^:_1
コナーオブライエン

@ ConorO'Brien、ありがとう、それを知らなかった。
ジョナ

これは1つずれていませんか?n = 1あなたは何を印刷しません。とにかく、あなたはそのようないくつかの変更で数バイトを削ることができます' #'{~(,|.@}:)"1@#:@:>:@i.(あなたが1つであることが許されるなら、あなたはさらに4バイトを削除することができます)。基本的には、フック]を使用#:#.invます。これは、左脚がフォークのように機能し、組み込みがAFAIKとほぼ同じである場合に使用されるためです。編集:私の答えはコメントであることを保証するのに十分似ていると思います。それがそれ自身の答えであると思うかどうか教えてください。
コール

@コール、ありがとう!少し後で更新します。試し#:たがうまくいかなかったと思ったが、間違っていることを覚えているに違いない。
ジョナ

@Jonahは2 #:、右端の数字だけを取得しようとしました。モナド#:関数は#.inv(または#.&:_1)と同様です。これは#:、左側の引数にあるアトムの数だけ桁を与えるdyadicとは異なります。
コール



1

PHP、98 97 95 94 + 1バイト

while($r++<$argn)echo$s=strtr(sprintf("%".-~log($argn,2).b,$r),0," "),substr(strrev("
$s"),1);

でパイプとして実行する-nR、オンラインで試してください1空白以外として使用します。


それを台無しにして申し訳ありませんが、ここで何かが間違っています。以下のための出力$argn=1とが$argn=3正しくない、及び$argn(1-基づいて指定された)0ベースである
フェリックスPalmen

1
@FelixPalmenが修正されました。不正確さは、間違ったベースが原因でした。気づいてくれてありがとう。
タイタス




0

C(GCC) 146の 108 105バイト

#define o putchar(33-!(c&(1<<n)))
b;c;p(n){--n?o,p(n),o:o;}f(n){while(n>>++b);while(c++<n)p(b),puts("");}

オンラインでお試しください!

これは、f(n)行数で呼び出される関数でn、感嘆符(!)を非空白文字として使用します。

説明

#define o putchar(33-!(c&(1<<n)))
b;c;
p(n)
{
    // least significant bit not yet reached?
    --n?
            // print bit twice with recursive step between
            o,
            p(n),
            o
        // for least significant, just print this bit
        :o;
}

// the main "cathedral function":
f(r)
{
    // determine max number of bits to shift
    while(r>>++b);

    // iterate over rows
    while(c++<r)

        // print row recursively
        p(b),

        // newline
        puts("");
}

/**
 * footer, just calling the function
 */
main(int argc, char **argv)
{
    f(atoi(argv[1]));
}

提案--n&&o+p(n);o;の代わり--n?o,p(n),o:o;for(;c++<n;puts(""))p(b);代わりにwhile(c++<n)p(b),puts("");
ceilingcat

0

JavaScript(Node.js)156 149バイト

-7バイト@ ConorO'Brienで

f=(n,w=n.toString(2).length,b=n.toString(2).replace(/0/g," "),s=" ".repeat(w-b.length))=>`${--n?f(n,w)+s+b+[...b].reverse().join``.substr(1):s+"1"}
`

オンラインでお試しください!

再帰関数。残念ながらJSは文字列の反転をサポートしていないため、配列に変換して戻すには19バイトが使用されます。


1
[...b]代わりに使用できますb.split("")。の.join``.substr(1)代わりに使用することもでき.join("").substr(1)ます。最後に、s+1代わりに使用できると思いますs+"1"
コナーオブライエン


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