직사각형 의사 프랙탈


13

프로그램의 목표는 가로 및 세로로 번갈아 반복되는 두 배 크기의 ASCII 아트 사각형을 그리는 것입니다. 사각형의 크기가 두 배가 될 때마다 추가 영역이 다른 문자로 표시되고 이전 영역은 변경되지 않습니다. 가장 작은 두 섹션은 각각 하나의 문자를 포함하며 구석에있을 수 있습니다.

프로그램은 단일 정수를 입력으로 받아 들여 전체 사각형에 포함 된 섹션 수를 정의합니다.

다른 외부 리소스 나 입력은 허용되지 않습니다.

샘플 입력 및 출력

10

ABDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
CCDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ

선택 기준

일주일에 가장 짧은 코드가 점수를 얻습니다.


4의 비 전력에 대한 출력은 무엇이어야합니까?
marinus

출력이 시퀀스 A, B, C 등이어야합니까?
Kendall Frey

2
@marinus 4의 거듭 제곱에 대한 특별한 점은 무엇입니까? 어쩌면 당신은 예제를 오해했을까요?
Kendall Frey

@KendallFrey, 아니요 . n 개의 인쇄 가능한 문자 만 있으면 됩니다.
Hand-E-Food

왼쪽 상단에서 정확하게 반복해야합니까
mniip

답변:


10

APL, 25 자 / 바이트 *

{⍉⍣⍵⊃{a,⍺⍴⍨⍴a←⍉⍪⍵}/⌽⍵↑⎕A}

분해도

{                   ⍵↑⎕A}   ⍝ take the first ⍵ letters
    ⊃{           }/⌽        ⍝ fold over them, using the first one as initial accum. value
            a←⍉⍪⍵           ⍝    ensure the accum. is a table, transpose it and call it 'a'
        ⍺⍴⍨⍴                ⍝    make a table as large as 'a' filled with the next letter
      a,                    ⍝    append it to the right of 'a' and loop as new accumulator
 ⍉⍣⍵                        ⍝ transpose the result as many times as the original ⍵ number

      {⍉⍣⍵⊃{a,⍺⍴⍨⍴a←⍉⍪⍵}/⌽⍵↑⎕A}¨⍳8
A AB  AB  ABDD  ABDD  ABDDFFFF  ABDDFFFF  ABDDFFFFHHHHHHHH
      CC  CCDD  CCDD  CCDDFFFF  CCDDFFFF  CCDDFFFFHHHHHHHH
                EEEE  EEEEFFFF  EEEEFFFF  EEEEFFFFHHHHHHHH
                EEEE  EEEEFFFF  EEEEFFFF  EEEEFFFFHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH
                                GGGGGGGG  GGGGGGGGHHHHHHHH

* : APL 기호를 상위 128 바이트 값에 매핑하는 자체 (레거시) 단일 바이트 문자 집합으로
APL을 작성할 수 있습니다. 따라서 스코어링을 위해 ASCII 문자와 APL 기호 만 사용하는 N 문자 프로그램은 N 바이트 길이로 간주 될 수 있습니다.


9

GolfScript, 30 자

~(,[0`]{{[49+]1$,*+}+%zip}@/n*

예 ( 온라인으로 실행 ) :

> 7
01335555
22335555
44445555
44445555
66666666
66666666
66666666
66666666

이것은 질문에 나오는 것과 같은 짝수에 대해 잘못된 출력을 생성합니다.
Timwi

@Timwi 방금 테스트 해 보았습니다. 출력은 바뀌지 만 질문에 방향이 지정되지 않았습니다.
Howard

좋아, 내가 너무 엄격한 것 같아요 :)
Timwi

@Howard Hm, 이것이 "이전 영역은 변하지 않고"이해하는 방법입니다. 그는 처음 두 문자는 어느 구석 에나있을 수 있지만 방향이 바뀔 수 있다고 말하지 않습니다.
Martin Ender 2016 년

7

파이썬 2.7-85 103

이것은 zip(*s)구문을 사용하여 목록을 지속적으로 바꿉니다. 12 명의 인물을 면도 한 팁을 주신 Daniel에게 큰 감사를드립니다! 그런 다음 글자 대신 숫자를 사용하여 조금 더 면도하십시오.

s=[]
for i in range(input()):x=1<<i/2;s=zip(*s+[chr(65+i)*x]*x)
for i in s:print''.join(i)

또한 비트 시프트가 낮은 (?) 우선 순위를 가지기 때문에 1<<x대신 이 방법을 사용합니다 2**x. 관찰 :

>>> 1<<(2*3)
64
>>> 1<<2*3
64
>>> 2**2*3
12
>>> 2**(2*3)
64

그리고 일부 출력 :

10
01335555777777779999999999999999
22335555777777779999999999999999
44445555777777779999999999999999
44445555777777779999999999999999
66666666777777779999999999999999
66666666777777779999999999999999
66666666777777779999999999999999
66666666777777779999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999
88888888888888889999999999999999

1
좋은. 을 (를) 사용하여 조금 줄일 수 있습니다 for i in s:print''.join(i).
다니엘 Lubarov

5

루비, 88

표준 입력에서 N을 읽습니다.

s=[?A]
66.upto(64+gets.to_i){|i|x=i.chr*y=s.size;i%2<1?s.map!{|r|r+x}:s+=[x*2]*y}
puts s

N = 8의 사용 예 :

echo 8 | rectangular-pseudo-fractal.rb

산출:

ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

N = 10

echo 10 | rectangular-pseudo-fractal.rb

산출:

ABDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
CCDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ
IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ

이 결과는 어떻게 생겼습니까?

@LegoStormtroopr은 몇 가지 예를 추가했지만 질문과 정확히 같은 형식입니다.
Paul Prestidge

4

J, 57 43

(,`,.@.(=/@$@[)$${&a.@(66+2&^.@#@,)^:)1$'A'

예 :

5 (,`,.@.(=/@$@[)$${&a.@(66+2&^.@#@,)^:)1$'A'
ABDDFFFF
CCDDFFFF
EEEEFFFF
EEEEFFFF

7 (,`,.@.(=/@$@[)$${&a.@(66+2&^.@#@,)^:)1$'A'
ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

C와 D는 모두 가로로 확장됩니다. 수평과 수직으로 교대해야합니다.
Hand-E-Food 11

@ Hand-E-Food 당신이 맞아요. 지적 해 주셔서 감사합니다. 코드 (및 게시물)를 수정했습니다.
barbermot

4

MATLAB, 86 자

@flawr (두 번!)에 의해 포주 된 MATLAB에서의 최단 시도 :

function M=f(n)
M='';
if n
M=cat(mod(n,2)+1,f(n-1),64+n*ones(2.^fix(n/2-[.5,1])));
end

출력 예 :

>> disp(f(7))
ACEEGGGG
BCEEGGGG
DDEEGGGG
DDEEGGGG
FFFFGGGG
FFFFGGGG
FFFFGGGG
FFFFGGGG

이렇게하면 약간의 바이트가 절약됩니다.function M=f(n) M=''; if n M=cat(mod(n,2)+1,f(n-1),64+n*ones(2.^fix([n-1,n-2]/2))); end
flawr

@flawr : 아! 명백하게!
knedlsepp

의 인수 fixfix(n/2-[.5,1])PS 로 바꾸어 다른 바이트를 절약하십시오 : 정말 좋은 해결책은 cat을 (를) 선택할 수있는이 용도에 대해 몰랐습니다 =)
flawr

@ flawr : 나에게는 꽤 낭비 적 인 것 같습니다. ;-)
knedlsepp

방금 당신이 여기에 새로운 것을 알았으므로 codegolf.SE에 오신 것을 환영합니다.) a) matlab 중독자가 더 있습니다 .b) 독일 스피커가 여기에 있습니다 (나는 가정합니다)!
flawr

3

q [73 자]

{"c"$64+{n:x 0;m:x 1;if[2>n;m:(),m];(o;$[n-2*n div 2;,';,][m;(#m;#m 0)#o:n+1])}/[x-1;(1;1)]1}

10
"ABDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"CCDDFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"EEEEFFFFHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"GGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"
"IIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJ"

3
"AB"
"CC"

6
"ABDDFFFF"
"CCDDFFFF"
"EEEEFFFF"
"EEEEFFFF"

3

자르기 , 59 자

❶塊갠分감⓶左貶終辦감標가⓺貶⓹開上❶❶貶雙是不⒉갠乘⒉終가①上뀀❷②갠分小是增終❸⓷另要감右⓶갠加⓶終丟字⓶終丟겠終

(이 프로그램은 밑이 2 인 로그에 대한 지시 사항이있는 경우 약간 짧을 수 있지만, 그렇지 않은 경우 루프를 사용하여 수동으로 수행합니다.)

주석이 달린 코드

n 입력입니다.

❶ | n n

f = i => (1 << (i/2)) - 1;
塊갠分감⓶左貶終 | n n f

w = f(n);
辦 | n w f

d = 1;
감 | n w f d

s = "";
標 | n w f d M [s]

for (y in [0..f(n-1)])
가⓺貶⓹開上 | w d M [s] y

    if ((y & (y-1)) == 0) d *= 2;
    ❶❶貶雙是不⒉갠乘⒉終 | w d M [s] y

    for (x in [0..w])
    가①上 | w d M [s] y x

        c = 64; // '@'
        뀀 | w d M [s] y x c

        if (x < d/2) c++;
        ❷②갠分小是增終 | w d M [s] y x c

        a = x | y;
        ❸⓷另 | w d M [s] y c a

        while (a > 0) { a >>= 1; c += 2; }
        要감右⓶갠加⓶終丟 | w d M [s] y c

        s += (char) c;
        字⓶ | w d M [s] y
    終丟 | w d M [s]

    s += "\n"
    겠 | w d M [s]
終

산출

들어 n= 6 :

ABDDFFFF
CCDDFFFF
EEEEFFFF
EEEEFFFF

물론 뀀( @)를 다른 기본 문자로 변경할 수 있습니다 ( 예 : (space) 및 n= 7).

!"$$&&&&
##$$&&&&
%%%%&&&&
%%%%&&&&
''''''''
''''''''
''''''''
''''''''

프로그램을 더 길게 만들지 않는 가장 큰 숫자는 (= 255)이며, ( n= 이번에는 8) :

Āāăăąąąąćććććććć
ĂĂăăąąąąćććććććć
ĄĄĄĄąąąąćććććććć
ĄĄĄĄąąąąćććććććć
ĆĆĆĆĆĆĆĆćććććććć
ĆĆĆĆĆĆĆĆćććććććć
ĆĆĆĆĆĆĆĆćććććććć
ĆĆĆĆĆĆĆĆćććććććć

프로그램을 1 문자 더 길게 만들면 냟및( 예 : (= \u4DFF) 및 n= 9 사용 )

一丁七七丅丅丅丅万万万万万万万万
丂丂七七丅丅丅丅万万万万万万万万
丄丄丄丄丅丅丅丅万万万万万万万万
丄丄丄丄丅丅丅丅万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丆丆丆丆丆丆丆丆万万万万万万万万
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈
丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈丈

3

C #을 239 185 182 180 바이트

C #은 덜 장황한 언어에는 아무것도 없습니다.

using C=System.Console;
class P{
    static void Main(string[]a){
        for(int x,i,n=int.Parse(a[0]);n-->0;C.CursorTop=0)
            for(i=1<<n,x=1<<n/2+n%2;i-->0;)
                C.Write((char)(n+33)+(i%x<1?"\n":""));
    }
}

귀여움을 위해 선택된 문자, 출력 :

!"$$&&&&((((((((****************
##$$&&&&((((((((****************
%%%%&&&&((((((((****************
%%%%&&&&((((((((****************
''''''''((((((((****************
''''''''((((((((****************
''''''''((((((((****************
''''''''((((((((****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************
))))))))))))))))****************

1
당신이 어떻게 세 었는지 모르지만 나는 184를 세었다. 바깥 for루프 에서 괄호를 버리고 182 개를 만들어 두 문자를 절약 할 수있다.
Bob

감사합니다 @ 밥! 미세 최적화하는 동안 잘못 계산해야합니다.
Hand-E-Food

2

PERL, 122 자

$N=<>;$x=$r=1;do{$_=chr$a+++65;$s=$x;$o=$_ x$s;$o.=$_++x$s,$s*=2while$N+65>ord++$_;print"$o\n"x$r;$r=$x;$x*=2}while++$a<$N

공백이 추가 된 경우 :

$N=<>;
$x=$r=1;
do{
    $_=chr$a+++65;
    $s=$x;
    $o=$_ x$s;
    $o.=$_++x$s,$s*=2 
        while $N+65>ord++$_;
    print "$o\n"x$r;
    $r=$x;
    $x*=2
} while++$a<$N

산출:

$ echo 8 | perl pseudo-fractal.pl
ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

1

PERL,  94   81 자

$N=$_;$_=$:=A;$h=1;++$i%2?s/$/$:x$h/gem:($_.=($/.$:x2x$h)x$h,$h*=2)while++$:,--$N

그것은 새로운 행과 열과 행과 열을 추가하여 문자 단위로 프랙탈을 반복적으로 구성합니다 ... 간단한 문자열 연산을 사용하여 그렇게합니다. 구문 설탕을 허용하기 위해 문자 1 대신 표준 변수를 남용하고 있습니다 (공백 생략 $:x2등).

공백과 주석 추가 :

$N=$_;
$_=$:=A;                    # $: is current letter
$h=1;

++$i%2? 
s/$/$:x$h/gem:              # every odd run - add "columns"
($_.=($/.$:x2x$h)x$h,$h*=2) # every even run - add "rows"
while++$:,--$N              # iterate over letters

일부 출력 :

$ echo 8 | perl -p pseudo-fractal.fill.pl.5a5
ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

1

자르기 , 45 자

가⓶貶上倘감雙⓶壹長⓸講增字⓶復⓷是標⓷各①合終并不⓶梴❸⓶疊合終不뀐標뀐并終終⓶丟各겠終

이 솔루션은 다른 Sclipting 솔루션과 완전히 다르게 작동합니다. 훨씬 지루하지만 짧습니다 ...

주석이 달린

for i in [0..n-1]
가⓶貶上
    if (i != 0)
    倘
        i &= 1
        감雙
        e = list[0].Length
        ⓶壹長
        c = ((char) (c[0] + 1)).Repeat(e)
        ⓸講增字⓶復
        if (i)
        ⓷是
            concatenate c onto every element of list
            標⓷各①合終并
        else
        不
            concatenate c.Repeat(list.Length) onto list
            ⓶梴❸⓶疊合
        終
    else (i.e., i == 0)
    不
        c = "A"
        뀐
        list = ["A"]
        標뀐并
    終
終
concatenate "\n" to every element in list
⓶丟各겠終

1

델파이 348 || 들여 쓰기 449

들여 쓰기없이

var inp,j,i,x: integer;s:string;L:TStringlist;begin L:=TStringList.Create;readln(s);inp:=StrToIntDef(s,4);if inp<4then inp:=4;s:='';l.Add('AB');for I:=2to inp-1do begin j:=Length(L[0]);if i mod 2=0then for x:=0to L.Count-1do L.Add(s.PadLeft(j,Chr(65+i)))else for x:=0to L.Count-1do L[x]:=L[x]+s.PadLeft(j,Chr(65+i));end;Write(L.GetText);readln;end.

들여 쓰기

var
  inp,j,i,x: integer;
  s:string;
  L:TStringlist;
begin
  L:=TStringList.Create;
  readln(s);
  inp:=StrToIntDef(s,4);
  if inp<4then inp:=4;
  s:='';
  l.Add('AB');

  for I:=2to inp-1do
  begin
    j:=Length(L[0]);
    if i mod 2=0then
      for x:=0to L.Count-1do L.Add(s.PadLeft(j,Chr(65+i)))
    else
      for x:=0to L.Count-1do
        L[x]:=L[x]+s.PadLeft(j,Chr(65+i));
  end;
  Write(L.GetText);
  readln;
end.

1

CJam, 30 (23) 바이트

CJam은이 도전보다 몇 개월 어려서 녹색 확인 표시를받을 수 없습니다.

l~(Sa1${{_,I'!+*+}%z}fI\{z}*N*

여기에서 테스트하십시오.

OP는 주석에서 고유 한 인쇄 가능한 문자 집합이 허용된다고 설명 했으므로 인쇄 가능한 ASCII 문자를 처음부터 시작합니다 (모서리와 !다음에 공백 등 ).

방향이 짝수와 홀수 입력 사이에서 변경 될 수 있다면 (생각하지 않지만 GolfScript 제출이하는 것입니다) 25 바이트로 할 수 있습니다.

S]l~({{_,I'!+*+}%z}fIN*

아이디어는 정말 간단합니다. 공백이 포함 된 격자로 시작한 다음 N-1 번 바꾸고 다음 문자로 모든 줄을 두 배로 늘립니다.

긴 버전의 경우 마지막에 일관된 방향을 보장하기 위해 N-1 번 다시 바꿉니다.

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