Hình chữ nhật giả


13

Mục tiêu

Mục tiêu của chương trình là vẽ một hình chữ nhật nghệ thuật ASCII liên tục nhân đôi kích thước, xen kẽ theo chiều ngang và chiều dọc. Mỗi lần hình chữ nhật tăng gấp đôi kích thước, khu vực phụ được thể hiện bằng một ký tự khác nhau và các khu vực trước đó không thay đổi. Hai phần nhỏ nhất chứa một ký tự mỗi và có thể ở bất kỳ góc nào.

Chương trình chấp nhận một số nguyên duy nhất làm đầu vào, xác định số phần mà hình chữ nhật đầy đủ chứa.

Không có tài nguyên bên ngoài hoặc đầu vào được cho phép.

Đầu vào và đầu ra mẫu

10

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

Tiêu chí lựa chọn

Mã ngắn nhất trong một tuần sẽ giành được điểm.


Đầu ra không phải là gì cho 4 quyền hạn?
bến tàu

Là đầu ra bắt buộc phải thuộc dãy A, B, C, v.v.?
Kendall Frey

2
@marinus Điều gì đặc biệt về sức mạnh của 4? Có thể bạn hiểu nhầm ví dụ?
Kendall Frey

@KendallFrey, không, chỉ cần có n ký tự in duy nhất.
Thực phẩm điện tử

Nó có phải tái diễn chính xác ở góc trên cùng bên trái
mniip

Câu trả lời:


10

APL, 25 ký tự / byte *

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

Khung nhìn bùng nổ

{                   ⍵↑⎕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

Ví dụ

      {⍉⍣⍵⊃{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 có thể được viết bằng bộ ký tự byte đơn (di sản) riêng để ánh xạ các ký hiệu APL đến các giá trị 128 byte trên. Do đó, với mục đích ghi điểm, một chương trình gồm các ký tự N chỉ sử dụng các ký tự ASCII và các ký hiệu APL có thể được coi là N byte dài.


9

GolfScript, 30 ký tự

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

Ví dụ (chạy trực tuyến ):

> 7
01335555
22335555
44445555
44445555
66666666
66666666
66666666
66666666

Điều này tạo ra đầu ra sai cho các số chẵn, chẳng hạn như số trong câu hỏi ...
Timwi

@Timwi Tôi vừa thử nó, nó hoạt động với tôi. Đầu ra được hoán vị nhưng định hướng không được chỉ định trong câu hỏi.
Howard

Được rồi, tôi đoán tôi đã quá nghiêm khắc rồi :)
Timwi

@Howard Hừm, đó là cách tôi hiểu "và các khu vực trước đó vẫn không thay đổi". Anh ấy nói hai nhân vật đầu tiên có thể ở bất kỳ góc nào, nhưng anh ấy không nói định hướng có thể thay đổi.
Martin Ender

7

Con trăn 2.7 - 85 103

Điều này sử dụng zip(*s)cú pháp để liên tục chuyển đổi danh sách. Cảm ơn Daniel rất nhiều vì mẹo của anh ấy đã cạo 12 ký tự! Sau đó cạo thêm một vài cái bằng cách sử dụng số thay vì chữ cái.

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)

Ngoài ra, điều này sử dụng 1<<xchứ không phải 2**xlà thay đổi bit có độ ưu tiên thấp hơn (?). Quan sát:

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

Và một số đầu ra:

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

1
Đẹp. Bạn có thể rút ngắn nó một chút với for i in s:print''.join(i).
Daniel Lubarov

5

Ruby, 88

Đọc N từ đầu vào tiêu chuẩ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

Cách sử dụng ví dụ cho N = 8:

echo 8 | rectangular-pseudo-fractal.rb

Đầu ra:

ABDDFFFFHHHHHHHH
CCDDFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
EEEEFFFFHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH
GGGGGGGGHHHHHHHH

N = 10

echo 10 | rectangular-pseudo-fractal.rb

Đầu ra:

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

Đầu ra của cái này trông như thế nào?

@LegoStormtroopr đã thêm một số ví dụ, đó là định dạng chính xác giống như câu hỏi.
Paul Prestidge

4

J, 57 43

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

Ví dụ:

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 và D đều mở rộng theo chiều ngang. Chúng nên xen kẽ theo chiều ngang và chiều dọc.
Thực phẩm điện tử cầm tay

@ Hand-E-Food bạn nói đúng. Cảm ơn đã chỉ ra rằng. Tôi đã sửa mã (và bài).
barbermot

4

MATLAB, 86 ký tự

Lần thử ngắn nhất của tôi trong MATLAB, được viết bởi @flawr (hai lần!):

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

Ví dụ đầu ra:

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

Điều này sẽ giúp bạn tiết kiệm một số byte: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: Ồ! Chắc chắn!
knedlsepp

Lưu một byte khác bằng cách thay thế đối số fixbằng fix(n/2-[.5,1])PS: Giải pháp thực sự tốt với cat, không biết về cách sử dụng này khi bạn có thể chọn thứ nguyên =)
flawr

@flawr: Dường như với tôi, tôi khá lãng phí. ;-)
knedlsepp

Tôi chỉ nhận thấy bạn là người mới ở đây, vì vậy hãy chào mừng bạn với codegolf.SE, thật tuyệt khi có một.) Một số người nghiện ma túy khác, b.) Người nói tiếng Đức ở đây (tôi giả sử)!
flawr

3

q [73 ký tự]

{"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}

thí dụ

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

Sclipting , 59 ký tự

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

(Chương trình này có thể ngắn hơn một chút nếu tôi có hướng dẫn về logarit cơ sở 2, nhưng tôi không có, vì vậy tôi thực hiện thủ công với một vòng lặp.)

Mã chú thích

n là đầu vào.

❶ | 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]
終

Đầu ra

Cho n= 6:

ABDDFFFF
CCDDFFFF
EEEEFFFF
EEEEFFFF

Tất nhiên, bạn có thể thay đổi 뀀( @) thành bất kỳ ký tự cơ sở nào khác, ví dụ với (dấu cách) và n= 7:

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

Số cao nhất không làm cho chương trình dài hơn là (= 255), cung cấp cho chúng tôi ( n= 8 lần này):

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

Nếu chúng tôi làm cho chương trình 1 ký tự dài hơn, ví dụ: sử dụng 냟및(= \u4DFF) và n= 9, chúng tôi nhận được:

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

3

C #, 239 185 182 180 byte

C # không có gì trên các ngôn ngữ ít dài dòng.

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

Đầu ra, các ký tự được chọn cho prettiness:

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

1
Không chắc bạn đã đếm như thế nào, nhưng tôi đã đếm 184. Bạn có thể lưu hai ký tự bằng cách bỏ các dấu ngoặc từ forvòng ngoài , tạo 182.
Bob

Cảm ơn @Bob! Tôi đã bị nhầm lẫn trong khi tối ưu hóa vi mô.
Thực phẩm điện tử cầm tay

2

PERL, 122 ký tự

$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

có thêm khoảng trắng:

$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

Đầu ra:

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

1

PERL,  94   81 ký tự

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

Nó xây dựng fractal lặp đi lặp lại từng chữ, thêm hàng và cột mới và hàng và cột ... Sử dụng các thao tác chuỗi đơn giản để làm điều đó. Lưu ý rằng tôi đang lạm dụng biến tiêu chuẩn thay vì chữ cái để cho phép cú pháp đường (như bỏ qua khoảng trắng -$:x2 v.v.)

Với thêm khoảng trắng và bình luận:

$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

Một số đầu ra:

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

1

Sclipting , 45 ký tự

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

Giải pháp này hoạt động hoàn toàn khác với các giải pháp Sclipting khác. Nó nhàm chán hơn nhiều, nhưng nó ngắn hơn ...

Chú thích

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

Delphi 348 || 449 với thụt lề

Không có thụt lề

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.

Với thụt lề

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

CJam trẻ hơn thử thách này vài tháng nên không đủ điều kiện cho dấu kiểm màu xanh lá cây.

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

Kiểm tra nó ở đây.

OP đã làm rõ trong một nhận xét rằng bất kỳ tập hợp các ký tự có thể in duy nhất nào đều được phép, vì vậy tôi chỉ lấy các ký tự ASCII có thể in từ đầu (có một khoảng trắng ở góc, ! tiếp theo, v.v.).

Nếu định hướng có thể thay đổi giữa các đầu vào chẵn và lẻ (mà tôi không nghĩ, nhưng đó là những gì trình nộp GolfScript thực hiện), tôi có thể thực hiện điều đó trong 25 byte:

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

Ý tưởng thực sự đơn giản: bắt đầu với một lưới chứa một khoảng trắng, sau đó N-1 lần hoán chuyển nó và nhân đôi tất cả các dòng với ký tự tiếp theo.

Đối với phiên bản dài, cuối cùng tôi cũng chuyển đổi lại N-1 lần để đảm bảo định hướng nhất quán.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.