Роздрукуйте найменший ідеальний квадрат


16

Сквертування площі - це процес облицювання квадрата, використовуючи лише інші квадрати. Якщо в цій плитці використовуються лише квадрати різних розмірів, то вона вважається ідеальною . Найменший можливий ідеальний квадрат квадрат є 112x112 квадрат плитковий з використанням 21 різних квадратів.

Я створив художню версію цієї площі ascii нижче:

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

У вашій заяві слід надрукувати вищевказаний квадрат. Ви можете надрукувати відображення та / або обертання вищевказаного квадрата, якщо бажаєте. Доступний новий рядок на останньому рядку. Це , тому найменше подання виграє!


@Optimizer Відповідно на запитання та Вікіпедію, всі маленькі квадрати повинні бути абсолютно різних розмірів.
Рівень річки Св.

Натане, чи моє подання відповідає правилам? Я використовував рівномірну товщину для всіх ліній.
DavidC

@DavidCarraher У мене окреслена кожна сторона квадрата (тому внутрішні сторони мають кілька знаків фунта). Також вам потрібно використовувати #замістьX
Nathan Merrill

1
Натан, У площині краї не є кордонами. Вони є одномірними відрізками ліній. Там, де стоять дві плитки, ми повинні бачити один рядок, а не два. Інакше ми передаємо думку про те, що між плитками є зазор.
DavidC

@DavidCarraher, хоча це правда, я думаю, що має сенс представити це в ascii таким чином.
Натан Меррілл

Відповіді:


4

CJam, 88 84 83 байт

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

Тестуйте це тут.

Пояснення

Ось основна ідея: почніть з «порожнього» квадрата 112х112. Тепер пройдіть через квадрати в порядку читання (зліва направо, зверху вниз). Додайте кожен квадрат до першої доступної позиції. Після цього надрукуйте всі завершені рядки - це гарантує, що нам потрібно лише перевірити перший (залишився) рядок, щоб зрозуміти, куди йде наступний квадрат.

Порожня сітка ініціалізована на ps, тому що мені потрібен був символ з кодовим символом, більшим за пробіл #, і тому, що я міг повторно використовувати його власний код символів 112для розміру початкової сітки. Я використав деякі мистецькі трюки Денніса ASCII, щоб заповнити маленькі квадрати в сітку.

'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

Mathematica 360 426

Код спрацьовує, спочатку намалював ідеальний квадрат квадратів, растрирувавши і бінаризувавши зображення, а потім перетворив 0 в "#" і 1 в "".

Виведення повертається як звичайні символи ASCII у таблиці.

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


Я вважаю за краще це візуалізація, отримана шляхом видалення Thickness[.015]

pic2


Товщина лінії не змінюється, квадрат 50х50 - це 48 пробілів і 48 пробілів вниз, з межею #'s. Він стикується проти інших квадратів праворуч і знизу, які намальовані аналогічно. Там, де #зустрічаються два квадрати, у яких все навколо зовні, ви отримуєте подвійне #для внутрішніх ліній, а квадрати справді квадратні, вони мають однакову кількість символів по вертикалі та горизонталі. Проблема полягає в шрифті. Ця відповідь не відповідає специфікаціям. Якби її прийняли, питання було б обрано для не об'єктивної перемоги.
Рівень р. Св.

Лінії мислиться як одновимірні, а не двовимірні. Їх не слід трактувати як межі, що мають товщину. Зрештою, ми розділяємо квадратну область на квадратні субрегіони. Кордони не повинні займати жодної зони.
DavidC

У чомусь справа. Лінії йдуть між квадратами , і ОП вирішив зобразити квадрати з внутрішніми рамками. Можливо, було б зрозуміліше, якби він вирішив використовувати інший символ для кожного квадрата (і, можливо, також заповнив їх.) У будь-якому випадку, як ви бачите з останніх запитань прапора, звичайного розуміння (і вся суть складності комолгорова тег) - це правдиво відтворити художнє представлення Ascii, яке надає ОП, а не робити власну інтерпретацію. Хоча цікаво, це неправдива відповідь. Багато квадратів все ще мають різну кількість символів за їх висотою та шириною.
Рівень річки Св.

Нагадує про вулиці Фон Кармана
Бета-розпад

3

Рубін, 180 байт

Версія для гольфу, що базується на версії, яка не перебуває нижче. Ми скористаємося тим, що yдля лівого верхнього кута зазвичай є 2 або 3 квадрата з однаковою координатою.

Перша магічна рядок містить коди ASCII для square sidelength+70і y increment +40. Зустрічаючи бічну довжину квадрата (код Ascii> 67), ми припускаємо, що наступний квадрат є тією самою координатою y, а координату x можна отримати, збільшуючи поточну координату x на sidelength+2. Зіткнувшись із збільшенням коду (код Ascii <67), ми відповідно збільшуємо координату y і скидаємо координату x на фігуру, закодовану у другій магічній рядку.

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

Оригінальна версія

Це (повністю без вогонь) рішення містить 315 байт, виключаючи непотрібні порожні рядки та відступи. Він просто створює масив з 112 рядків 112 #'s, потім замінює нутрощі квадратів пробілами.

$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 байт

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

(Безголів)

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) ? ' ' : '#';
          }
        }
      }
    }
  }
}

Все це - сканування через масив 112 × 112 байт (ініціалізований до нуля). Щоразу, коли він стикається з нульовим байтом, він отримує значення з масиву iі додає вікно відповідного розміру. Додатковий байт у кожному рядку виконує роль строкового термінатора, тому ми можемо використовувати puts()для виведення цілих рядків, а не putchar()для виведення символів окремо.

Напевно, це може бути трохи більше в гольфі, але я не думаю, що це багато шансів перемогти відповідь Steveverrill .

(посилання ideone)


+1 Це відмінна концепція, набагато краща за мою, менш гофрованою мовою. Я вважаю, що це могло б перемогти мою відповідь. Зверніть увагу, що вам потрібно роздрукувати, #коли !(p%(n-1)&&q%(n-1))я також намагаюся зменшити кількість forциклів з чотирьох до двох, використовуючи x=i%113і y = i/113 etc.
Рівень р. Св.

3

R, 293 291 287 282 байт

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='')

Після цього я зрозумів, що зробив майже той самий процес, що і @steveverrill. Масив "#" та порожнє інтер'єр квадрата. Можливо, може вичавити ще щось із цього. Повернення вагона для 3-ї лінії суттєве. Завдяки AlexA за кілька.


Ви посилаєтесь лише sодин раз, тож чи не могли ви зробити це, for(g in list(...))а не sзаздалегідь вказати окремо? Я думаю, що це дозволить заощадити 2-3 байти.
Олексій А.

@AlexA. Дякую, очевидний, який я зовсім пропустив
MickyT

2

Бінарний MS-DOS, 137

Наступний код буде запущений у MS-DOS, якщо ви записуєте його у файл, який називається square.com, подальша компіляція не потрібна (але, оскільки він заданий у шістнадцятковій формі, спочатку потрібно "зняти його"):

fcba8f01b82370e83000bd1400bb4d018b1743438a27b02043e81e004d75
f1b97000ba8f3289d7b00daab00aaab82409aa83ea70cd214975ecc331c9
88e189ce89d788e1f3aa83c2704e75f4c3201d30e223218527190524063d
1f11521d0d811c0f321f09921c04b8141670101b4d12176619076f1905a6
141066120e4602288d100221022300021f

Вихід буде невпізнанним у більшості терміналів, але ви можете перенаправити його у файл ( square.com > output.txt) і переглянути його в текстовому редакторі. Якщо ви хочете щось читабельніше, наступний код створить робочий square.com, якщо він подається в 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

Матлаб / Октав, 258

Як завжди, матриці. Я жорстко кодував рядки та індекси стовпців кожного квадрата та розмір. Я можу використовувати їх для заповнення великого "порожнього" квадрата #s.

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

Баш, 252

Кожен кодгольфер повинен мати можливість перемогти алгоритм стиснення загального призначення:

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

Завдяки Toby Speight за підказку використовувати коротший ввід (нерозумно я використовував gzipзамість gzip -9стиснення) та рядок тут.


2 коротше з тут-рядком:base64 -d<<<H4sIAP9YuVUAA+3XQQrDIBAF0H1PUfD+d+yq0FA7GirGie/vdEZfkCy0lLl5lOfJlPaKoAUIBAKBQCAQCLwzOP3mfdFVv9IKBM4BTyQpGA0PE0AgcB8wzC3A6vS7egH4d5YH64WPtVGh/zvygj8agcCvQuufzA+2GoFA4AZgd9KCwS7Hzu3B7qQFO09rbXDEaa0NjtgLCAQCgUAgEAgEAoHz34dj8wLKvMUNbzEAAA==|gunzip
Toby Speight

І коротший вклад приводить нас до 251 :base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip
Toby Speight

Ви впевнені, що це працює? Я тільки отримую gunzip: command not found. Я можу змусити його працювати, використовуючи підзаголовок:, (base64 -d|gunzip)<<<...але він все ще використовує 258 байт.
користувач2845840

Дивно, @ user284584 - щось дивно у вашому шляху? Я перевірив те, що написав (в інтерактивній оболонці, якщо це має значення)
Toby Speight

о боже ... спробуйте скопіювати свій коментар і вставити його назад в оболонку. Stackexchange "корисно" вставив 6 невидимих ​​символів, по 3 з u + 200c & u + 200b. Після їх видалення він працює.
користувач2845840
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.