Fraktal Katedrali


22

Olumlu bir tamsayı verildiğinde , aşağıdaki yapının n >= 1ilk nsatırlarını verin:

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

nİnci 1-endeksli sıra ikili temsilidir nile son karakteri kopyalamadan yansıtılmış, #1 yerine ve <space>ortalanır 0 bütün satırların bir yer.

ASCII-art olarak çıktı almalısınız ancak #örnekte kullandığım yerin yerine herhangi bir boşluk olmayan karakter kullanabilirsiniz . Sondaki boşluk boşluğa izin verilir ve sondaki yeni satıra izin verilir. Çıktı, örnek gibi görünmeli ve fazladan satır aralığı veya satırsonu hattı içermemelidir.

Burada fraktal katedralin ilk 1023 sırasını görebilirsiniz .

Daha büyük test senaryoları oluşturmak için, Python'da temelsiz referans uygulaması


İyi fikir. Böylesine güzel bir sanat sanatı üretecek ikili sayıları tahmin edemezdim.
Jonah

@Jonah Teşekkürler :) Beğendiğine sevindim
HyperNeutrino

7
Her iki bağlantı da oluşturulan katedrale işaret ediyor.
Otávio

@ Otávio:
Düzelteceğim

Yanıtlar:


6

MATL , 10 bayt

:B2&Zv35*c

Çevrimiçi deneyin!

açıklama

:      % 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
Acaba daha sonra 35 ile çarpmaya karşılık gelen bir char yapısına eklemenin yararlı olup olmadığını merak ediyorum. Sıklıkla kullanılıyor gibi görünüyor
Conor O'Brien,

@ ConorO'Brien Sık kullanılır, evet. Fakat bu iki karakterli bir dahili olurdu, bu yüzden kazanç olmazdı
Luis Mendo

Kazanç yok mu? 35*c4 karakterdir
Conor O'Brien,

@ ConorO'Brien Ah, 35sabit ile demek istiyorsun ? Bu biraz spesifik görünüyor. Öte yandan, bazı zorluklar herhangi bir karaktere izin verir, bu yüzden iyi bir fikir olabilir. #En yaygın olduğunu düşünüyor musunuz ?
Luis Mendo,

2
Başvuru için, bu özellik uygulandı (işlev Zc, karakter 35, yani #). Teşekkürler, @ ConorO'Brien!
Luis Mendo,

5

05AB1E , 9 bayt

Kod:

Lb€û.c0ð:

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

L              # List [1, .., input]
 b             # Convert each to binary
  €û           # Palindromize each binary number
    .c         # Join the array by newlines and centralize
      0ð:      # Replace zeroes by spaces


3

Python 2 , 92 bayt

n=input()
for x in range(n):s=bin(2**len(bin(n))/4+x+1)[3:].replace(*'0 ');print s+s[-2::-1]

Çevrimiçi deneyin!

Python 3'te, s=f'{x+1:0{len(bin(n))-2}b}'.replace(*'0 ')daha kısadır, ancak argümanın int(input())etrafındaki parens print95 byte'a çıkar.


Bu benim bir kopyasını :) (ama yine de akıllıca kullanımı 2**len(bin(n))/4)
Outgolfer Erik

3

JavaScript (ES6), 106 bayt

1Boşluk olmayan karakter olarak kullanır .

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

gösteri

Alternatif sürüm (aynı boyutta)

Olmadan 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
Çok hoş! İlk gördüğümde Math.clz32- var olduğunu bile bilmiyordum!
Birjolaxew

@Birjolaxew Yup, bu bir ES6 ekidir. Arada bir her seferinde kullanışlı oluyor.
Arnauld,

3

Kabuğu , 21 20 18 bayt

2 bayt kapalı golf için teşekkürler @ Zgarb!

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

Çevrimiçi deneyin!

Ungolfed / Açıklama

Uzun dolguyu önlemek için, bu şekilde verilen fraktalın genişliğini belirler ve 2*len(bin(N))-1bu uzunluktaki tüm dizileri sembollerle oluşturur #,_('_' bir boşluk gösterir).

Kartezyen gücü sırayla üretildiğinden ve ikili sayılar da olduğundan, bu iyidir. Bu noktada fraktal almak için tek yapmamız gereken, tüm palindromları filtrelemek ve işte temelde bu:

                    -- 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
Ṙ;sadece olabilir Rve ȯgereksizdir. Güzel cevap fikri!
Zgarb

2

Mathematica, 94 bayt

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

2
Ben de gerçekten gitmeliyim ...
J42161217

2

Mathematica, 98 bayt

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

Wolfram kum havuzunda deneyin ! Ve üç her bayt.

Desenin fraktal doğasını kullanarak, şimdiye kadar diğer cevaplardan farklı bir yaklaşım. Anahtar adım, ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&fraktal şeyleri yapan, resim biçiminde en iyi şekilde açıklanmıştır:

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

Kod, en az n satır almak için bu adımı yeterince tekrarlar , sonra ilave satırları keser ve güzel görüntüler.


2

Gaia , 11 bayt

 #”B¦ₔṫ¦€|ṣ

Çevrimiçi deneyin!

açıklama

    ¦ₔ       For each number 1..input:
 #”B          Convert it to base 2 and use space as 0 and # as 1
      ṫ¦     Palindromize each
        €|   Centre the lines
          ṣ  Join with newlines


2

C # (.NET Core) , 192 178 bayt 168 + 23

Yardımlarınız için teşekkürler 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()))

Çevrimiçi deneyin!

bu büyük olasılıkla dize dolgu ve ters büyük olasılıkla, azaltılabilir emin olabilirsiniz.


PPCG'ye Hoşgeldiniz! Şu anda bu cevap sadece bir kod pasajı. x=>Bayt sayısına eklenir ve sondaki noktalı virgül eklemeniz gerekmediğine dikkat edin. Enumerable.Range(1,x).Select(zdaha kısadır new int[x].Select((_,z)(bence doğru). Linq'i kullanırken using System.Linq;bayt sayınıza eklemelisiniz . Ayrıca kullanıyorsunuz, Mathbu yüzden eklemeniz using System;veya tam olarak nitelemeniz gerekir. Bunun daha kısa olduğuna dikkat edinnamespace System.Linq{}
TheLethalCoder

Sen dahil etmek gerekmez ,' 'içinde PadLeftbir boşluk varsayılan olarak çağrı.
TheLethalCoder,


@TheLethalCoder rahatsızlıktan dolayı özür dileriz, düzeltildi.
Dennis.Verweij

Endişeye gerek yok +1 benden güzel bir cevap :)
TheLethalCoder

1

Kömür , 28 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

A…·¹Nθ

İlk ndoğal sayıların bir listesini oluşturun .

W⌈θ«

Tüm elemanlar sıfır olana kadar tekrarlayın.

Eθ§ #κ

Listedeki her bir öğenin son ikili basamağını a veya olarak yazdırın #.

↓⸿

Önceki sütuna git.

AEθ÷κ²θ

Listenin tüm öğelerini ikiye bölün.

»‖O

Sol yarı çizildikten sonra yansıtın.


Kömürün şu anki sürümleri MapAssignRight(IntDivide, 2, q);3 bayt kazandırıyor.
Neil

1

J, 29 bayt

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

Çevrimiçi deneyin!

açıklama

  • i. n'ye kadar tamsayılar, giriş
  • (#.^:_1) üs 2'ye dönüştürüldü
  • (],}.@|.)satır satır ( "1bu kısım yapar), ikili sayıyı alın ( ]fn kimliğidir) ve ,tersine ( |.) tersini ( ) tersten ( }.) ile işaretleyin.
  • ' #'{~dönüştürür 1S ve 0karma ve boşluklarına s.

Sen kullanabilirsiniz #.invyerine #.^:_1.
Conor O'Brien,

@ ConorO'Brien, teşekkürler, bunun farkında değildi.
Jonah

Bu tek tek değil mi? Çünkü n = 1hiçbir şey basmıyorsun. Her neyse, bir kaç değişiklikle birkaç bayt tıraş edebilirsiniz, bunun gibi birkaç değişiklik yapabilirsiniz ' #'{~(,|.@}:)"1@#:@:>:@i.(eğer bir tane tarafından izinli olursanız, 4 bayt daha kaldırabilirsiniz). Temel olarak, bir kanca kullanın, çünkü sol çatal olduğu zaman çatal gibi davranır ]ve #:AFAIK'in yaklaşık olarak aynı olduğu yerleşik malzemeyi kullanır #.inv. EDIT: Cevabımın yorum yapma emriyle aynı olduğunu düşünüyorum, kendi cevabı olduğunu düşünüyorsanız, bana bildirin.
cole,

@cole, teşekkürler! biraz sonra güncelleyeceğim. denedim #:ve işe yaramadığını sanıyordum , ama yanlış hatırlıyor olmalıyım, çünkü haklısın.
Jonah

@Jonah 2 #:, sadece en doğru rakamı alabilecek olanı denemiş olabilirsiniz . Monadic #:işlevleri tıpkı #.inv(veya #.&:_1) gibi . Bu #:, sadece argümanında atom olduğu kadar rakam veren iki didikten farklıdır .
cole,

1

Proton , 95 bayt

r=>{for i:range(1,r)print(((bin(i)[2to]).rjust(len(bin(r))-2)[to-1,to by-1]).replace('0',' '))}

Çevrimiçi deneyin!

Çok fazla brakete sahip olmayacak çok fazla böcek var ... Ayrıştırıcıyı düzeltmem gerekiyor ...



1

PHP, 98 97 95 94 + 1 bayt

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

Pipe ile çalıştırın -nRveya çevrimiçi deneyin . 1Boşluk olmayan olarak kullanır .


bozduğuma üzüldüm, ama burada bir şeyler yanlış. için çıktı $argn=1ve $argn=3doğru değil ve $argn0 tabanlıdır (belirtilen 1 tabanlıdır)
Felix Palmen

1
@FelixPalmen fixed. The incorrectness was caused by the wrong base. Thanks for noticing.
Titus




0

C (gcc) , 146 108 105 bayt

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

Çevrimiçi deneyin!

Bu, boşluk sayısı olmayan bir ünlem işareti ( ) kullanan f(n)satır sayısıyla adlandırılan bir işlevdir .n!

Açıklama :

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

Öner --n&&o+p(n);o;yerine --n?o,p(n),o:o;ve for(;c++<n;puts(""))p(b);yerinewhile(c++<n)p(b),puts("");
ceilingcat

0

JavaScript (Node.js), 156 149 bytes

-7 bytes by @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"}
`

Try it online!

Recursive function. Unfortunately JS does not support reversing a string, so 19 bytes are used on turning it into an array and back.


1
You can use [...b] instead of b.split(""); you can also use .join``.substr(1) instead of .join("").substr(1); finally, I think you can use s+1 instead of s+"1"
Conor O'Brien

0

Perl 5, 77 + 1 (-n) = 78 bytes

$x=1+(log$_)/log 2;map{$_=sprintf"%0${x}b",$_;y/0/ /;say$_.chop.reverse}1..$_

Try it online!

Using '1' instead of '#' because it saves a couple bytes.


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.