Katedra Fraktalna

22

Biorąc pod uwagę dodatnią liczbę całkowitą n >= 1, wyślij pierwsze nrzędy następującej struktury:

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

n-Ty 1-indeksowany wiersz jest binarna reprezentacja n, dublowane bez kopiowania ostatni znak, ze #zamiast 1 i <space>zamiast 0. Wszystkie wiersze są skupione.

Musisz wyprowadzać jako ASCII-art, ale możesz użyć dowolnego znaku spacji zamiast tego, którego używam #w tym przykładzie. Końcowe białe znaki są dozwolone, a końcowy znak nowej linii jest dozwolony. Dane wyjściowe muszą wyglądać jak w przykładzie i nie mogą zawierać żadnych dodatkowych białych znaków ani nowych linii.

Można zobaczyć pierwsze 1023 wierszy fraktalnej katedry tutaj .

Aby wygenerować większe przypadki testowe, oto implementacja nieznanego odniesienia w Pythonie

HyperNeutrino
źródło
Dobry pomysł. Nie odgadłabym liczb binarnych, aby stworzyć tak ładną sztukę ascii.
Jonasz
@Jonah Dzięki :) Cieszę się, że ci się podoba
HyperNeutrino
7
Oba linki wskazują na wygenerowaną katedrę.
Otávio
@ Otávio: Naprawię, dzięki
HyperNeutrino

Odpowiedzi:

6

MATL , 10 bajtów

:B2&Zv35*c

Wypróbuj online!

Wyjaśnienie

:      % 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
Luis Mendo
źródło
1
Zastanawiam się, czy przydałoby się dodać jakieś wbudowane narzędzie, które odpowiada pomnożeniu przez 35, a następnie konwersji na char. Wydaje się, że jest często używany
Conor O'Brien
@ ConorO'Brien Jest używany często, tak. Byłoby to jednak wbudowane w dwa znaki, więc nie byłoby zysku
Luis Mendo
Brak zysku? 35*cma 4 znaki
Conor O'Brien
@ ConorO'Brien Ah, masz na myśli ze 35stałym? To wydaje się trochę specyficzne. Z drugiej strony niektóre wyzwania pozwalają na dowolne zwęglenie, więc może to być dobry pomysł. Czy uważasz, że #jest najczęstszy?
Luis Mendo
2
Dla porównania, ta funkcja została zaimplementowana (funkcja Zc, z charakterem 35, tj #.). Dzięki, @ ConorO'Brien!
Luis Mendo
5

05AB1E , 9 bajtów

Kod:

Lb€û.c0ð:

Wykorzystuje kodowanie 05AB1E .Wypróbuj online!

Wyjaśnienie:

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
Adnan
źródło
4

Galaretka , 12 bajtów

RBUz0ZUŒBo⁶Y

Wypróbuj online!

Leaky Nun
źródło
1
Też muszę iść, więc będę czytać komentarze, kiedy wrócę. Zapraszam do gry w golfa.
Leaky Nun
+1 za „możesz mnie ogłuszyć” i za dobrą odpowiedź.
Magic Octopus Urn
3

Python 2 , 92 bajty

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

Wypróbuj online!

W Pythonie 3 s=f'{x+1:0{len(bin(n))-2}b}'.replace(*'0 ')jest krótszy, ale int(input())i wokół printargumentu pchamy go do 95 bajtów.

Lynn
źródło
To moja kopia :) (ale i tak sprytne użycie 2**len(bin(n))/4)
Erik the Outgolfer
3

JavaScript (ES6), 106 bajtów

Używa 1jako znaku spacji.

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

Próbny

Alternatywna wersja (ten sam rozmiar)

Bez 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):''
Arnauld
źródło
1
Bardzo dobrze! Pierwszy raz widziałem Math.clz32- nawet nie wiedziałem, że istnieje!
Birjolaxew
@Birjolaxew Tak, to jest dodatek do ES6. Od czasu do czasu przydaje się.
Arnauld
3

Łuska , 21 20 18 bajtów

Dzięki @Zgarb za grę w golfa z 2 bajtów!

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

Wypróbuj online!

Niegolfowane / Wyjaśnienie

Aby uniknąć długiego wypełniania, określa to szerokość fraktala podanego jako 2*len(bin(N))-1i generuje wszystkie sekwencje tej długości za pomocą symboli #,_(„_” oznacza spację).

Ponieważ moc kartezjańska jest generowana w kolejności, a liczby binarne też są, to jest w porządku. Wszystko, co musimy zrobić, aby uzyskać fraktal w tym momencie, to odfiltrowanie wszystkich palindromów i to w zasadzie:

                    -- 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)
ბიმო
źródło
1
Ṙ;może być sprawiedliwy Ri ȯjest niepotrzebny. Niezły pomysł na odpowiedź!
Zgarb
2

Mathematica, 94 bajty

Column[Row/@Table[s=IntegerDigits[i,2];Join[s,Reverse@Most@s]/.{0->" ",1->"#"},{i,#}],Center]&
J42161217
źródło
2
Ja też muszę iść ...
J42161217,
2

Mathematica, 98 bajtów

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

Wypróbuj w piaskownicy Wolfram ! I są trzy bajty każda.

Jest to inne podejście niż inne dotychczasowe odpowiedzi, wykorzystujące fraktalną naturę wzoru. Kluczowym krokiem jest ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&zrobienie części fraktalnych, najlepiej wyjaśnione w formie obrazka:

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

Kod powtarza ten krok wystarczająco długo, aby uzyskać co najmniej n wierszy, a następnie przycina dodatkowe wiersze i ładnie je wyświetla.

Nie drzewo
źródło
2

Gaia , 11 bajtów

 #”B¦ₔṫ¦€|ṣ

Wypróbuj online!

Wyjaśnienie

    ¦ₔ       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
Business Cat
źródło
2

Python 2 , 120 118 107 bajtów

dzięki @luismendo, @officialaimm, @ halvard-hummel

def f(l):
 for a in range(1,l+1):print(bin(a)[2:]+bin(a)[-2:1:-1]).replace(*'0 ').center(len(bin(l+1))*2-4)

Wypróbuj online!

wrymug
źródło
2
replace(*'0 ')za 2 bajty
officialaimm
2
107 bajtów
Halvard Hummel
2

C # (.NET Core) , 192 178 bajtów 168 + 23

dziękuję TheLethalCoder za pomoc.

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

Wypróbuj online!

całkiem pewne, że można to znacznie zredukować, najprawdopodobniej podczas wypełniania i cofania sznurka.

Dennis.Verweij
źródło
Witamy w PPCG! W tej chwili ta odpowiedź to tylko fragment kodu. Można to naprawić, dodając x=>do liczby bajtów i zauważ, że nie musisz dołączać średnika końcowego. Enumerable.Range(1,x).Select(zjest krótszy, ponieważ new int[x].Select((_,z)(myślę, że to prawda). Podczas korzystania z Linq należy uwzględnić using System.Linq;w swojej liczbie bajtów. Używasz również, Mathwięc powinieneś go uwzględnić using System;lub w pełni go zakwalifikować. Zauważ, że jest to krótsze, ponieważnamespace System.Linq{}
TheLethalCoder
Nie musisz uwzględniać ,' 'w PadLeftrozmowie, ponieważ spacja jest domyślna.
TheLethalCoder
@TheLethalCoder przepraszam za niedogodności, jest już naprawiony.
Dennis.Verweij,
Nie martw się +1 ode mnie to ładna odpowiedź :)
TheLethalCoder
1

Węgiel drzewny , 28 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

A…·¹Nθ

Utwórz listę pierwszych nliczb naturalnych.

W⌈θ«

Powtarzaj, aż wszystkie elementy będą równe zero.

Eθ§ #κ

Wydrukuj ostatnią cyfrę binarną każdego elementu listy jako a lub #.

↓⸿

Przejdź do poprzedniej kolumny.

AEθ÷κ²θ

Podziel wszystkie elementy listy przez dwa.

»‖O

Po narysowaniu lewej połowy, odzwierciedl ją.

Neil
źródło
Obecne wersje węgla drzewnego mają MapAssignRight(IntDivide, 2, q);oszczędność 3 bajtów.
Neil,
1

J, 29 bajtów

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

Wypróbuj online!

wyjaśnienie

  • i. liczby całkowite do n, wejście
  • (#.^:_1) przekonwertowane na bazę 2
  • (],}.@|.)rząd po rzędzie ( "1czy ta część), weź liczbę binarną ( ]to tożsamość fn) i cat it ( ,) za pomocą jej reverse ( |.), gdzie odwrotna strona jest ścięta ( }.).
  • ' #'{~konwertuje 1si 0si na hasze i spacje.
Jonasz
źródło
You can use #.inv instead of #.^:_1.
Conor O'Brien
@ConorO'Brien, thanks, wasn't aware of that.
Jonah
Isn't this off by one? For n = 1, you print nothing. Anyways, you can shave off a few bytes with a few changes like so ' #'{~(,|.@}:)"1@#:@:>:@i. (if you're allowed to be off by one you can remove 4 more bytes). Basically, use a hook because it performs just like a fork when the left tine is ] and use the built-in #: which AFAIK is about the same as #.inv. EDIT: I figure my answer is similar enough to warrant being a comment, let me know if you think it should be an answer of its own.
cole
@cole, thanks! i'll update it a bit later. i thought i'd tried #: and it didn't work, but i must be remembering wrong because you're right that it does.
Jonah
@Jonah you may have tried 2 #: which will only get the right-most digit. Monadic #: functions just like #.inv (or #.&:_1). This differs from dyadic #:, which only gives as many digits as there are atoms in its left argument.
cole
1

Proton, 95 bytes

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

Try it online!

There are too many bugs to not have too many brackets... I need to fix up the parser...

HyperNeutrino
źródło
1

PHP, 98 97 95 94+1 bytes

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

Run as pipe with -nR or try it online. Uses 1 as non-whitespace.

Titus
źródło
sorry to spoil it, but something is wrong here. output for $argn=1 and $argn=3 is not correct, and $argn is 0-based (specified was 1-based)
Felix Palmen
1
@FelixPalmen fixed. The incorrectness was caused by the wrong base. Thanks for noticing.
Titus
0

Python 2, 93 bytes

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

Try it online!

Erik the Outgolfer
źródło
0

C (gcc), 146 108 105 bytes

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

Try it online!

This is a function f(n) called with the number of rows n, using an exclamation mark (!) as non-whitespace character.

Explanation:

#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]));
}
Felix Palmen
źródło
Suggest --n&&o+p(n);o; instead of --n?o,p(n),o:o; and for(;c++<n;puts(""))p(b); instead of while(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.

Birjolaxew
źródło
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.

Xcali
źródło