Распечатайте наименьший квадрат идеальной площади

16

Возведение квадратов в квадрат - это процесс разбиения квадрата, используя только другие квадраты. Если эта мозаика использует только квадраты разных размеров, то она считается идеальной . Минимально возможный идеальный квадрат квадрат является 112x112 квадратом черепицы с использованием 21 различных квадратов.

Я создал арт-версию этого квадрата ascii ниже:

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

Ваша заявка должна распечатать вышеуказанный квадрат. Вы можете распечатать отражение и / или вращение вышеуказанного квадрата, если хотите. Трейлинг-перевод строки в последней строке разрешен. Это , поэтому выигрывает самая маленькая подача!

Натан Меррилл
источник
@Optimizer Согласно вопросу и википедии, все маленькие квадраты должны быть совершенно разных размеров.
Уровень Река St
Натан, мое представление соответствует правилам? Я использовал одинаковую толщину для всех линий.
DavidC
@DavidCarraher У меня есть каждая сторона квадрата (так что на внутренних сторонах есть несколько знаков фунта). Кроме того, вам нужно использовать #вместоX
Натан Меррилл
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}|}%}/

Проверьте это здесь.

объяснение

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

Пустая сетка инициализируется как 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

DavidC
источник
Толщина линии не изменяется, квадрат 50х50 - это 48 пробелов в ширину и 48 пробелов вниз, с рамкой #«s». Он сталкивается с другими квадратами справа и снизу, которые нарисованы аналогичным образом. Там, где встречаются два квадрата со #всех сторон снаружи, вы получаете двойной #для внутренних линий. И квадраты действительно квадратные, имеют одинаковое количество символов по вертикали и горизонтали. Проблема в шрифте. Этот ответ не соответствует спецификации. Если он будет принят, вопрос будет закрыт для не объективной победы.
Уровень Река St
Линии воспринимаются как одномерные, а не двумерные. Они не должны интерпретироваться как границы, имеющие толщину. В конце концов, мы разбиваем квадратную область на квадратные субрегионы. Границы не должны занимать какую-либо площадь.
DavidC
Это своего рода точка. Линии идут между квадратами , и OP выбрал для представления квадратов с внутренними границами. Возможно, было бы яснее, если бы он решил использовать разные символы для каждого квадрата (и, возможно, также заполнил их). В любом случае, как вы можете видеть из недавних вопросов о флаге, обычное понимание (и весь смысл сложности комолгоров) tag) предназначено для точного воспроизведения художественного представления Ascii, предоставленного OP, а не для вашей собственной интерпретации. Хотя это интересно, это неверный ответ. Многие квадраты по-прежнему имеют разное количество символов по высоте и ширине.
Уровень Река St
Напоминает мне о улицах фон Кармана
бета-распад
3

Рубин, 180 байт

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

Первая магическая строка содержит коды ASCII для square sidelength+70и y increment +40. При встрече с длиной стороны квадрата (код Ascii> 67) мы предполагаем, что следующий квадрат находится в той же координате y, а координату x можно получить, увеличив текущую координату x на sidelength+2. При обнаружении увеличения y (код 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 #, а затем заменяет внутренние части квадратов пробелами.

$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
Уровень реки St
источник
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;}}

(Ungolfed)

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() для вывода символов по отдельности.

Возможно, это еще немного удастся, но я не думаю, что у него много шансов обыграть ответ Стивериллера .

(ссылка идеально)

брезгливый оссифраж
источник
+1 Это отличная концепция, гораздо лучше, чем у меня, на языке менее гольф. Я считаю, что это может быть лучше моего ответа. Обратите внимание, что вам нужно напечатать a, #когда !(p%(n-1)&&q%(n-1))я также рассмотрю вопрос о сокращении числа forциклов с четырех до двух, используя x=i%113и y = i/113 etc.
Уровень Река St
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-й строки значителен. Спасибо Алексею за несколько.

MickyT
источник
Вы ссылаетесь только sодин раз, так что вы не могли бы сделать, for(g in list(...))вместо того, чтобы указать sотдельно заранее? Я думаю, это сэкономит вам 2-3 байта.
Алекс А.
@AlexA. Спасибо, очевидный, который я полностью пропустил
MickyT
2

MS-DOS Binary, 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
user2845840
источник
1

Matlab / Octave, 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,''])
flawr
источник
0

Баш, 252

Каждый Codegolfer должен быть в состоянии побить алгоритм сжатия общего назначения:

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

Спасибо Тоби Спейту за подсказку использовать более короткий ввод (глупый я использовал gzipвместо gzip -9сжатия) и здесь-строку.

user2845840
источник
2 короче с здесь-строка:base64 -d<<<H4sIAP9YuVUAA+3XQQrDIBAF0H1PUfD+d+yq0FA7GirGie/vdEZfkCy0lLl5lOfJlPaKoAUIBAKBQCAQCLwzOP3mfdFVv9IKBM4BTyQpGA0PE0AgcB8wzC3A6vS7egH4d5YH64WPtVGh/zvygj8agcCvQuufzA+2GoFA4AZgd9KCwS7Hzu3B7qQFO09rbXDEaa0NjtgLCAQCgUAgEAgEAoHz34dj8wLKvMUNbzEAAA==|gunzip
Тоби Спейт
И более короткий ввод сводит нас к 251 :base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip
Тоби Спейт
Вы уверены, что это работает? Я только получаю gunzip: command not found. Я могу заставить это работать, используя subshell:, (base64 -d|gunzip)<<<...но это все еще использует 258 байтов.
user2845840
Странно, @ user284584 - что-то странное с твоим путем? Я проверил то, что я написал (в интерактивной оболочке, если это имеет значение)
Тоби Спейт
о боже ... попробуйте скопировать ваш комментарий и вставить его обратно в оболочку. Stackexchange «услужливо» вставил 6 невидимых символов, 3 из которых u + 200c и u + 200b. После их удаления все работает.
user2845840