In ra Quảng trường bình phương nhỏ nhất hoàn hảo


16

Squared the Square là một quá trình ốp lát một hình vuông chỉ sử dụng các hình vuông khác. Nếu ốp này chỉ sử dụng các hình vuông có kích thước khác nhau, thì nó được coi là hoàn hảo . Hình vuông bình phương hoàn hảo nhỏ nhất có thể là một hình vuông 112x112 được lát bằng 21 hình vuông khác nhau.

Tôi đã tạo phiên bản nghệ thuật ascii của hình vuông này bên dưới:

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

Trình của bạn nên in ra hình vuông ở trên. Bạn có thể in hình phản chiếu và / hoặc xoay hình vuông ở trên nếu muốn. Một dòng mới trên dòng cuối cùng được cho phép. Đây là một , vì vậy bài nộp nhỏ nhất sẽ thắng!


@Optimizer Theo câu hỏi và Wikipedia, tất cả các ô vuông nhỏ phải có kích thước hoàn toàn khác nhau.
Cấp sông St

Nathan, trình của tôi có phù hợp với các quy tắc không? Tôi đã sử dụng độ dày đồng đều cho tất cả các dòng.
DavidC

@DavidCarraher Tôi có mỗi cạnh của hình vuông được phác thảo (vì vậy các mặt bên trong có nhiều dấu thăng). Ngoài ra, bạn cần sử dụng #thay vìX
Nathan Merrill

1
Nathan, Trong máy bay, các cạnh không phải là biên giới. Chúng là các đoạn đường một chiều. Trường hợp hai gạch abut, chúng ta sẽ thấy một dòng duy nhất, không phải hai. Mặt khác, chúng tôi đang truyền đạt ý tưởng rằng có một khoảng cách giữa các gạch.
DavidC

@DavidCarraher trong khi đó là sự thật, tôi nghĩ rằng nó có ý nghĩa hơn để đại diện cho nó trong ascii theo cách này.
Nathan Merrill

Câu trả lời:


4

CJam, 88 84 83 byte

'p:Ci_C*a*"2#   *%!"{i_S*a*{3af.|W%z}4*1$0=C#C*f{\+}..e<{_C&{oNo}|}%}/

Kiểm tra nó ở đây.

Giải trình

Đây là ý tưởng cơ bản: bắt đầu với một hình vuông 112x112 "trống". Bây giờ đi qua các ô vuông theo thứ tự đọc (trái sang phải, từ trên xuống dưới). Thêm mỗi hình vuông vào vị trí có sẵn đầu tiên. Sau đó, in tất cả các dòng đã hoàn thành - điều này đảm bảo rằng chúng ta chỉ cần kiểm tra dòng đầu tiên (còn lại) để tìm ra nơi hình vuông tiếp theo đi.

Lưới trống được khởi tạo thành ps, vì tôi cần một ký tự có mã ký tự lớn hơn khoảng trắng #và vì tôi có thể sử dụng lại mã ký tự của chính nó 112cho kích thước của lưới ban đầu. Tôi đã sử dụng một số thủ thuật nghệ thuật ASCII của Dennis ở đây để lấp đầy các ô vuông nhỏ vào lưới.

'p:C        e# Store the character 'p' in C.
i           e# Convert to its character code 112.
_C*a*       e# Generate a 112x112 array of p's.
"2#   *%!"  e# The 21 characters in this string correspond to the side lengths of
            e# the squares in the solution in reading order.
{           e# For each character in that string...
  i         e#   Convert to its character code (the current square's side length N).
  _S*a*     e#   Generate an NxN array of spaces.
  {         e#   Run this block 4 times. Each iteration turns the leading column into #'s
            e#   and then rotates the square by 90 degrees.
    3af.|   e#     For the first character in each row, take the bitwise OR with 3. 
            e#     This turns spaces into #'s and leaves #'s unchanged.
    W%z     e#     Reverse and transpose, which rotates by 90 degrees.
  }4*
  1$0=      e#   Copy the remaining grid and fetch the top row.
  C#        e#   Find the index of the first 'p'.
  C*        e#   Get a string of that many p's.
  f{\+}     e#   Prepend this string to each row of the small square, which gives the
            e#   square the correct horizontal position.
  ..e<      e#   Take the pairwise minimum of the square and the remaining grid. The p's
            e#   prepended to the square will leave the grid unchanged, but the spaces
            e#   and #'s in the square will overwrite the p's in the grid.
  {         e#   Map this block onto each row of the grid.
    _C&     e#     Copy the row and check if any p's are left.
    {oNo}|  e#     If NOT, the row is complete and we print it together with a newline.
            e#     This also removes the row from the grid, such that the top row for
            e#     the next iteration will have space for the next square left.
  }%
}/

9

Toán học 360 426

Mã này hoạt động bằng cách trước tiên vẽ hình vuông hoàn hảo của hình vuông, rasterising và binarizing hình ảnh, sau đó chuyển đổi 0 thành "#" và 1 thành "".

Đầu ra được trả về dưới dạng các ký tự ASCII thông thường trong một bảng.

f@{n_,x_,y_}:=Rectangle[{x,y},{x+n,y+n}];t=Transpose;
Flatten[i=Rasterize[Graphics[{EdgeForm[{(*Thickness[.015],*)Black}],White,
f/@ Partition[{33,0,0,29,0,33,50,0,62,37,33,0,25,29,37,42,70,0,18,70,42,24,88,42,9,54,53,7,63,53,15,50,62,17,65,60,
11,82,66,19,93,66,35,50,77,27,85,85},3]
},ImageSize->70
],RasterSize->70]//Binarize//ImageData,1]/.{0:> "#",1:> " "};
GraphicsGrid@t@Most@Most@Rest@t[Most@Most[Rest[ArrayReshape[%,Dimensions[i]]]]]

pic1


Tôi thích kết xuất này, thu được bằng cách xóa Thickness[.015]

pic2


Độ dày của dòng không thay đổi, hình vuông 50x50 là 48 ký tự không gian trên và 48 ký tự không gian trở xuống, với đường viền #là. Nó tàn sát các ô vuông khác ở bên phải và phía dưới, được vẽ theo cách tương tự. Khi hai hình vuông có #tất cả các hình tròn bên ngoài gặp nhau, do đó bạn có được một hình đôi #cho các dòng bên trong, Và hình vuông thực sự là hình vuông, chúng có cùng số lượng ký tự theo chiều dọc và chiều ngang, Vấn đề là phông chữ. Câu trả lời này không tuân thủ thông số kỹ thuật, Nếu nó được chấp nhận, câu hỏi sẽ được đóng lại cho một chiến thắng không khách quan.
Cấp sông St

Các dòng được quan niệm là một chiều, không phải hai chiều. Chúng không được hiểu là biên giới có độ dày. Rốt cuộc, chúng tôi đang phân vùng một khu vực vuông thành các tiểu vùng vuông. Các biên giới không nên chiếm bất kỳ khu vực.
DavidC

Đó là một điểm. Các đường kẻ nằm giữa các hình vuông và OP đã chọn đại diện cho các hình vuông có đường viền bên trong. Có thể đã rõ ràng hơn nếu anh ấy chọn sử dụng một biểu tượng khác nhau cho mỗi hình vuông (và cũng có thể điền vào chúng.) Trong mọi trường hợp, như bạn có thể thấy từ các câu hỏi cờ gần đây, cách hiểu thông thường (và toàn bộ điểm về độ phức tạp của komolgorov thẻ) là để tái tạo một cách trung thực các đại diện nghệ thuật của Ascii do OP cung cấp, không đưa ra giải thích của riêng bạn. Trong khi thú vị, đây không phải là một câu trả lời hợp lệ. Nhiều hình vuông vẫn có số lượng ký tự khác nhau về chiều cao và chiều rộng.
Cấp sông St

Nhắc nhở tôi về Von Karman Streets
Beta Decay

3

Ruby, 180 byte

Phiên bản chơi gôn dựa trên phiên bản chưa được chỉnh sửa dưới đây. Chúng tôi tận dụng thực tế là thường có 2 hoặc 3 hình vuông có cùng ytọa độ cho góc trên cùng bên trái.

Chuỗi ma thuật đầu tiên chứa mã ASCII cho square sidelength+70y increment +40. Khi gặp một bước sóng vuông (mã Ascii> 67), chúng ta giả sử hình vuông tiếp theo có cùng tọa độ y và tọa độ x có thể thu được bằng cách tăng tọa độ x hiện tại theo sidelength+2. Khi gặp gia số ay (mã Ascii <67), chúng ta tăng tọa độ y tương ứng và đặt lại tọa độ x thành hình được mã hóa trong chuỗi ma thuật thứ hai.

a=Array.new(112){?#*112}
x=y=1
j=9
'vg_CLW0SUO3J\,a]M*KV/T3n-Hi,e'.each_byte{|i|i>67?(s=i-70;(y..y+s-1).map{|i|a[i][x,s]=" "*s};x+=s+2):(x=')Fo_h){[~'[j-=1].ord-40;y+=i-40)}
puts a

Phiên bản gốc

Giải pháp (hoàn toàn không được cung cấp) này chứa 315 byte, không bao gồm các dòng trống và thụt lề không cần thiết. Nó chỉ đơn giản là tạo ra một chuỗi 112 chuỗi 112 #sau đó thay thế bên trong các hình vuông bằng khoảng trắng.

$a=Array.new(112){"#"*112}
def f(x,y,s)
  (y..y+s-1).map{|i|$a[i][x,s]=" "*s}
end

f(1,1,48)
f(51,1,33)
f(86,1,25)

f(86,28,6)
f(94,28,17)

f(51,36,13)
f(66,36,15)
f(83,36,9)

f(83,47,4)
f(89,47,22)

f(1,51,27)
f(30,51,23)
f(55,51,7)

f(64,53,5)
f(71,53,16)

f(55,60,14)

f(71,71,40)

f(30,76,2)
f(34,76,35)

f(1,80,31)

puts $a

3

C, 198 byte

char*i="bSK8C?A;6HMI927B@Z4UQ",o[112][113],x,y,p,q,n;main(){for(;y<112;puts(o[y]),y++)for(x=-1;++x<112;)if(!o[y][x]){n=*i++-48;for(p=-1;++p<n;)for(q=-1;++q<n;)o[q+y][p+x]=p&&n-1-p&&q&&n-1-q?32:35;}}

(Bị đánh cắp)

char *i="bSK8C?A;6HMI927B@Z4UQ", o[112][113], x, y, p, q, n;
main() {
  for ( ; y<112; puts(o[y]),y++) {
    for (x=-1; ++x<112; ) {
      if (!o[y][x]) {
        n = *i++ - 48;
        for (p=-1; ++p<n; ) {
          for(q=-1; ++q<n; ) {
            o[q+y][p+x] = (p && n-1-p && q && n-1-q) ? ' ' : '#';
          }
        }
      }
    }
  }
}

Tất cả điều này là quét qua một mảng 112 × 112 byte (được khởi tạo thành không). Bất cứ khi nào nó gặp một byte bằng 0, nó sẽ tìm nạp một giá trị từ mảng ivà thêm một hộp có kích thước tương ứng. Các byte bổ sung trong mỗi hàng đóng vai trò là bộ kết thúc chuỗi để chúng ta có thể sử dụng puts()để xuất toàn bộ dòng thay vì sử dụng putchar()để xuất các ký tự riêng lẻ.

Điều này có thể có thể được đánh gôn nhiều hơn một chút, nhưng tôi không nghĩ rằng nó có nhiều cơ hội để đánh bại câu trả lời của steveverrill .

(liên kết ideone)


+1 Đây là một khái niệm tuyệt vời, tốt hơn nhiều so với của tôi, trong một ngôn ngữ ít chơi gôn hơn. Tôi tin rằng nó có thể đánh bại câu trả lời của tôi. Lưu ý bạn cần in một lần #khi !(p%(n-1)&&q%(n-1))tôi cũng sẽ xem xét giảm số forvòng từ bốn xuống còn hai, sử dụng x=i%113và y = i/113 etc.
Cấp sông St

3

R, 293 291 287 282 byte

a=array('#',112:113)
a[,113]='
'
for(g in list(c(0,0,49,34,26),c(27,85,7,18),c(35,50,14,16,10),c(46,82,5,23),c(50,0,28,24,8,1),c(52,63,6,17),c(59,54,15),c(70,70,41),c(75,29,3,36),c(79,0,32))){y=g[1];x=g[2]
for(b in g[0:1-2]){a[(y+2):(y+b),(x+2):(x+b)]=' '
x=x+b+1}}
cat(t(a),sep='')

Sau khi tôi làm điều này, tôi nhận ra rằng tôi đã thực hiện gần như quá trình giống như @steveverrill. Một mảng '#' và để trống nội thất hình vuông. Có lẽ có thể ép thêm một số trong số này. Lợi nhuận vận chuyển cho dòng thứ 3 là rất đáng kể. Cảm ơn AlexA cho một vài.


Bạn chỉ tham khảo smột lần, vì vậy bạn không thể làm for(g in list(...))hơn là chỉ định sriêng trước? Tôi nghĩ rằng sẽ giúp bạn tiết kiệm 2-3 byte.
Alex A.

@AlexA. Cảm ơn, một điều hiển nhiên mà tôi hoàn toàn bỏ lỡ
MickyT

2

Nhị phân MS-DOS, 137

Đoạn mã sau sẽ chạy trong MS-DOS nếu bạn viết nó vào một tệp có tên là vuông.com, không cần phải biên dịch thêm (nhưng vì nó được đưa ra dưới dạng hex, trước tiên bạn cần "giải mã" nó):

fcba8f01b82370e83000bd1400bb4d018b1743438a27b02043e81e004d75
f1b97000ba8f3289d7b00daab00aaab82409aa83ea70cd214975ecc331c9
88e189ce89d788e1f3aa83c2704e75f4c3201d30e223218527190524063d
1f11521d0d811c0f321f09921c04b8141670101b4d12176619076f1905a6
141066120e4602288d100221022300021f

Đầu ra sẽ không thể nhận ra trong hầu hết các thiết bị đầu cuối, nhưng bạn có thể chuyển hướng nó đến một tệp ( square.com > output.txt) và xem xét nó trong một trình soạn thảo văn bản. Nếu bạn muốn một cái gì đó dễ đọc hơn, đoạn mã sau sẽ tạo ra một hình vuông hoạt động nếu được đưa vào debug.exe ( debug.exe < square.asm):

a
cld
mov dx,18f
mov ax,7023
call 13a
mov bp,14
mov bx,14d
mov dx,[bx]
inc bx
inc bx
mov ah,[bx]
mov al,20
inc bx
call 13a
dec bp
jnz 110
mov cx,70
mov dx,328f
mov di,dx
mov al,d
stosb
mov al,a
stosb
mov ax,924
stosb
sub dx,70
int 21
dec cx
jnz 125
ret
xor cx,cx
mov cl,ah
mov si,cx
mov di,dx
mov cl,ah
rep stosb
add dx,70
dec si
jnz 140
ret
db 20,1d,30,e2,23,21
db 85,27,19,05,24,6
db 3d,1f,11,52,1d,d
db 81,1c,f,32,1f,9
db 92,1c,4,b8,14,16
db 70,10,1b,4d,12,17
db 66,19,7,6f,19,5
db a6,14,10,66,12,e
db 46,02,28,8d,10,2
db 21,02,23,00,02,1f

n square.com
rcx
89
w
q

1

Matlab / Octave, 258

Như mọi khi, Ma trận. Tôi đã mã hóa hàng và các chỉ số cột của mỗi ô vuông cũng như kích thước. Tôi có thể sử dụng những thứ này để lấp đầy một ô vuông 'trống' lớn #.

r=[2,2,2,29,29,37,37,37,48,48,52,52,52,54,54,61,72,77,77,81];
c=[2,52,87,87,95,52,67,84,84,90,2,31,56,65,72,56,72,31,35,2];
s=[47,32,24,5,16,12,14,8,3,21,26,22,6,4,15,13,39,1,34,30];
z=ones(112)*35;
for i=1:20;
    z(r(i)+(0:s(i)),c(i)+(0:s(i)))=32;
end;disp([z,''])

0

Bash, 252

Mỗi codegolfer sẽ có thể đánh bại một thuật toán nén cho mục đích chung:

base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip

Cảm ơn Toby Speight về gợi ý sử dụng đầu vào ngắn hơn (tôi đã sử dụng một cách ngớ ngẩn gzipthay vì gzip -9nén) và một chuỗi ở đây.


2 ngắn hơn với chuỗi ở đây:base64 -d<<<H4sIAP9YuVUAA+3XQQrDIBAF0H1PUfD+d+yq0FA7GirGie/vdEZfkCy0lLl5lOfJlPaKoAUIBAKBQCAQCLwzOP3mfdFVv9IKBM4BTyQpGA0PE0AgcB8wzC3A6vS7egH4d5YH64WPtVGh/zvygj8agcCvQuufzA+2GoFA4AZgd9KCwS7Hzu3B7qQFO09rbXDEaa0NjtgLCAQCgUAgEAgEAoHz34dj8wLKvMUNbzEAAA==|gunzip
Toby Speight

Và một đầu vào ngắn hơn khiến chúng tôi giảm xuống còn 251 :base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip
Toby Speight

Bạn có chắc chắn rằng nó hoạt động? Tôi chỉ nhận được gunzip: command not found. Tôi có thể làm cho nó hoạt động bằng cách sử dụng một lớp con: (base64 -d|gunzip)<<<...nhưng nó vẫn sử dụng 258 byte.
dùng2845840

Lạ thật, @ user284584 - có gì lạ với con đường của bạn? Tôi đã thử nghiệm những gì tôi đã viết (trong một vỏ tương tác, nếu điều đó tạo ra sự khác biệt)
Toby Speight

trời ơi ... hãy thử sao chép bình luận của bạn và dán nó vào vỏ. Stackexchange "hữu ích" chèn 6 ký tự vô hình, 3 ký tự u + 200c & u + 200b. Sau khi loại bỏ chúng, nó hoạt động.
dùng2845840
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.