프랙탈 대성당


22

양의 integer가 주어지면 다음 구조 n >= 1의 첫 번째 n행을 출력하십시오 .

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

n번째의 1 행 인덱스의 이진 표현 n으로 마지막 문자를 복사하지 않고, 미러, #(1)의 위치와 <space>중심이되는 0 전체 행 대신에.

ASCII 아트로 출력해야하지만 #예제에서 사용하는 위치에 공백이 아닌 문자를 사용할 수 있습니다 . 후행 공백이 허용되고 후행 줄 바꿈이 허용됩니다. 출력은 예제와 같아야하며 추가 공백이나 선행 줄 바꿈이 없어야합니다.

프랙탈 대성당의 첫 1023 행을 여기서 볼 수 있습니다 .

더 큰 테스트 사례를 생성하기 위해 파이썬 에서 ungolfed 참조 구현이 있습니다.


좋은 생각. 나는 그런 아스키 아트를 만들어내는 이진수를 추측하지 않았을 것입니다.
요나

@Jonah 감사합니다 :) 당신이 그것을 기쁘게 생각합니다
HyperNeutrino

7
두 링크 모두 생성 된 성당을 가리키고 있습니다.
Otávio

@ 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로 변환하는 일종의 내장을 추가하는 것이 도움이 될지 궁금합니다. 자주 사용되는 것 같습니다
Conor O'Brien

@ ConorO'Brien 자주 사용됩니다. 예. 그러나 그것은 2 문자 내장이 될 것이므로 이득이 없을 것입니다.
Luis Mendo

이득이 없습니까? 35*c4 자
Conor O'Brien

@ ConorO'Brien 아, 당신은 35고정 된 의미 입니까? 좀 구체적으로 보입니다. 반면에 어떤 도전은 어떤 문자라도 허용하므로 좋은 생각 일 수 있습니다. #가장 일반적 이라고 생각하십니까 ?
Luis Mendo

2
참고로이 기능은 구현되었습니다 (function Zc, character 35, 즉 #). 감사합니다, @ ConorO'Brien!
Luis Mendo

5

05AB1E , 9 바이트

암호:

Lb€û.c0ð:

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!

설명:

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

파이썬 2 , 92 바이트

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

온라인으로 사용해보십시오!

파이썬 3에서는 s=f'{x+1:0{len(bin(n))-2}b}'.replace(*'0 ')더 짧지 만 int(input()), print인수를 둘러싼 parens는 그것을 95 바이트까지 밀어 넣습니다.


그것은 나의 사본이다 :) (그러나 2**len(bin(n))/4어쨌든 현명한 사용 )
Erik the Outgolfer

3

자바 스크립트 (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

@Birjolaxew Yup, 이것은 ES6 추가입니다. 가끔씩 편리하게 제공됩니다.
Arnauld

3

껍질 , 21 20 18 바이트

2 바이트를 골라 낸 @Zgarb에게 감사드립니다!

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

온라인으로 사용해보십시오!

언 골프 / 설명

긴 패딩을 피하기 위해, 이것은 주어진 프랙탈의 너비를 결정 2*len(bin(N))-1하고 기호로 해당 길이의 모든 시퀀스를 생성합니다 #,_( '_'는 공백을 나타냄).

데카르트 제곱이 순서대로 생성되고 이진수도 생성되기 때문에 이것은 좋습니다. 이 시점에서 프랙탈을 얻기 위해해야 ​​할 일은 모든 회문을 걸러내는 것입니다.

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

수학, 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 샌드 박스 에서 사용해보십시오 ! 세 개의 각 바이트.

패턴의 프랙탈 특성을 사용하여 지금까지 다른 답변과 다른 접근 방식입니다. 핵심 단계는 다음 ArrayFlatten@{{0,#,0},{1,0,1},{1,#,1}}&과 같습니다. 프랙탈 방식으로 그림 형식으로 가장 잘 설명됩니다.

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

코드는이 단계를 반복하여 적어도 n 행 을 얻은 다음 여분의 행을 잘라 내고 멋지게 표시합니다.




2

C # (.NET 코어) , 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⌈θ«

모든 요소가 0이 될 때까지 반복하십시오.

Eθ§ #κ

목록의 각 요소의 마지막 이진수를 a 또는 로 인쇄하십시오 #.

↓⸿

이전 열로 이동하십시오.

AEθ÷κ²θ

목록의 모든 요소를 ​​2로 나눕니다.

»‖O

왼쪽 절반이 그려지면 그것을 반영하십시오.


현재 Charcoal 버전은 MapAssignRight(IntDivide, 2, q);3 바이트를 절약합니다.

1

J, 29 바이트

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

온라인으로 사용해보십시오!

설명

  • i. n까지의 정수, 입력
  • (#.^:_1) 기본 2로 변환
  • (],}.@|.)행 단위로 ( "1그 부분을 수행) 이진 숫자 ( ]ID는 fn 임)를 가져오고 ,반대쪽 ( |.)으로 뒤집습니다 ( }.).
  • ' #'{~1s와 0s를 해시와 공백으로 변환합니다 .

#.inv대신 사용할 수 있습니다 #.^:_1.
코너 오브라이언

@ ConorO'Brien은 고마워하지 않았습니다.
요나

이거 하나도 안그래? 의 경우 n = 1아무 것도 인쇄하지 않습니다. 어쨌든, 약간의 변경으로 몇 바이트를 깎을 수 있습니다 (1 바이트를 ' #'{~(,|.@}:)"1@#:@:>:@i.허용하지 않으면 4 바이트를 더 제거 할 수 있습니다). 기본적으로 왼쪽 타인이 포크처럼 작동하므로 AFAIK와 거의 같은 ]내장 기능을 사용 하기 때문에 후크를 사용하십시오 . 편집 : 내 대답은 의견이 될만큼 충분히 비슷하다고 생각합니다. 자신의 대답이어야한다고 생각하면 알려주십시오. #:#.inv

@cole, 감사합니다! 나중에 업데이트하겠습니다. 나는 시도했지만 #:작동하지 않는다고 생각했지만 그것이 잘못되었다는 것을 기억하기 때문에 잘못 기억하고 있어야합니다.
Jonah

@Jonah 당신은 2 #:가장 오른쪽 숫자 만 얻을 려고 시도했을 수도 있습니다 . 수도원 #:함수는 #.inv(또는 #.&:_1) 와 같은 기능을 합니다. 이것은 #:왼쪽 인수에 원자가있는 수만큼만 제공하는 dyadic과 다릅니다 .
cole



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이 수정되었습니다. 잘못된베이스로 인해 잘못되었습니다. 알아 주셔서 감사합니다.
Titus




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

자바 스크립트 (Node.js를) , 156 (149) 바이트

@ ConorO'Brien에 의해 -7 바이트

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"
Conor O'Brien


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.