Wydrukuj najmniejszy idealny kwadratowy kwadrat

16

Kwadratowanie kwadratu to proces układania kwadratu za pomocą tylko innych kwadratów. Jeśli ten kafelek wykorzystuje tylko kwadraty o różnych rozmiarach, wówczas uważa się go za idealny . Najmniejsza idealny kwadrat kwadrat jest kwadrat 112x112 kafelki przy użyciu 21 różnych kwadratów.

Poniżej utworzyłem wersję ascii tego kwadratu:

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

Twoje zgłoszenie powinno wydrukować powyższy kwadrat. Możesz wydrukować odbicie i / lub obrót powyższego kwadratu, jeśli chcesz. Końcowy znak nowej linii w ostatnim wierszu jest dozwolony. To jest , więc najmniejsze zgłoszenie wygrywa!

Nathan Merrill
źródło
@Optimizer Zgodnie z pytaniem i Wikipedią wszystkie małe kwadraty muszą mieć zupełnie różne rozmiary.
Level River St
Nathan, Czy moje zgłoszenie jest zgodne z zasadami? Użyłem jednakowej grubości dla wszystkich linii.
DavidC,
@DavidCarraher Mam zarys każdej strony kwadratu (więc wewnętrzne strony mają wiele znaków funta). Ponadto musisz użyć #zamiastX
Nathan Merrill
1
Nathan, W płaszczyźnie krawędzie nie są granicami. Są to jednowymiarowe odcinki linii. Tam, gdzie stykają się dwie płytki, powinniśmy zobaczyć jedną linię, a nie dwie. W przeciwnym razie przekazujemy ideę, że pomiędzy płytkami jest przerwa.
DavidC
@DavidCarraher, chociaż to prawda, myślę, że bardziej sensowne jest reprezentowanie go w ascii w ten sposób.
Nathan Merrill

Odpowiedzi:

4

CJam, 88 84 83 bajtów

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

Sprawdź to tutaj.

Wyjaśnienie

Oto podstawowa idea: zacznij od „pustego” kwadratu 112 x 112. Teraz przejdź przez kwadraty w kolejności czytania (od lewej do prawej, od góry do dołu). Dodaj każdy kwadrat do pierwszej dostępnej pozycji. Następnie wydrukuj wszystkie ukończone linie - to gwarantuje, że musimy tylko sprawdzić pierwszą (pozostałą) linię, aby dowiedzieć się, gdzie idzie następny kwadrat.

Pusta siatka jest inicjowana na ps, ponieważ potrzebowałem znaku o kodzie znaków większym niż spacja #, oraz ponieważ mogłem ponownie użyć własnego kodu znaków 112dla rozmiaru początkowej siatki. Wykorzystałem tutaj niektóre sztuczki Dennisa ASCII , aby wypełnić małe kwadraty na siatce.

'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.
  }%
}/
Martin Ender
źródło
9

Mathematica 360 426

Kod działa najpierw poprzez narysowanie idealnego kwadratu, rasteryzację i binaryzację obrazu, a następnie konwersję 0 na „#” i 1 na „”.

Dane wyjściowe są zwracane jako zwykłe znaki ASCII w tabeli.

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


Wolę to renderowanie, uzyskane przez usunięcie Thickness[.015]

pic2

DavidC
źródło
Grubość linii nie zmienia się, kwadrat 50 x 50 ma 48 znaków spacji i 48 znaków spacji w dół, z ramką #„s”. Styka się z innymi kwadratami po prawej iu dołu, które są rysowane w podobny sposób. Tam, gdzie dwa kwadraty #wokół siebie się spotykają, otrzymujesz podwójną #linię wewnętrzną, a kwadraty rzeczywiście są kwadratowe, mają taką samą liczbę znaków w pionie i poziomie, Problemem jest czcionka. Ta odpowiedź nie jest zgodna ze specyfikacją. Jeśli zostanie zaakceptowana, pytanie zostanie ocenione z bliska na zwycięstwo bez celu.
Level River St
Linie są pomyślane jako jednowymiarowe, a nie dwuwymiarowe. Nie należy ich interpretować jako granice o grubości. W końcu dzielimy kwadratowy region na kwadratowe podregiony. Granice nie powinny zajmować żadnego obszaru.
DavidC,
Właśnie o to chodzi. Linie przechodzą między kwadratami , a OP wybrał reprezentowanie kwadratów z wewnętrznymi granicami. Mogłoby być bardziej zrozumiałe, gdyby wybrał inny symbol dla każdego kwadratu (i ewentualnie również je wypełnił). W każdym razie, jak widać z ostatnich pytań z flagą, zwykłe zrozumienie (i cała kwestia złożoności komolgorowa tag) to wierne odtworzenie przedstawionej przez OP sztuki Ascii, a nie własna interpretacja. Chociaż jest to interesujące, nie jest to prawidłowa odpowiedź. Wiele kwadratów wciąż ma różną liczbę znaków pod względem wysokości i szerokości.
Level River St
Przypomina mi ulice von Karmana
rozpad bety
3

Rubinowy, 180 bajtów

Wersja do gry w golfa oparta na wersji bez golfa poniżej. Korzystamy z faktu, że zazwyczaj ylewy górny róg ma zwykle 2 lub 3 kwadraty o tej samej współrzędnej.

Pierwszy ciąg znaków zawiera kody ASCII dla square sidelength+70i y increment +40. Kiedy napotykamy kwadratową długość boczną (kod Ascii> 67), zakładamy, że następny kwadrat ma tę samą współrzędną y, a współrzędną x można uzyskać poprzez zwiększenie bieżącej współrzędnej x o sidelength+2. Po napotkaniu przyrostu a (kod Ascii <67) odpowiednio zwiększamy współrzędną y i resetujemy współrzędną x do postaci zakodowanej w drugim ciągu magicznym.

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

Orginalna wersja

To (całkowicie niestosowne) rozwiązanie zawiera 315 bajtów, z wyłączeniem niepotrzebnych pustych linii i wcięć. Po prostu tworzy tablicę 112 ciągów 112 #, a następnie zamienia wnętrze kwadratów spacjami.

$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
Level River St
źródło
3

C, 198 bajtów

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

(Nie golf)

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

Wszystko to polega na skanowaniu tablicy 112 × 112 bajtów (zainicjowanej na zero). Ilekroć napotyka bajt zerowy, pobiera wartość z tablicy ii dodaje pole o odpowiednim rozmiarze. Dodatkowy bajt w każdym wierszu działa jako terminator ciągów, dzięki czemu możemy użyć puts()do wypisania całych linii zamiast putchar()do wypisania pojedynczych znaków.

Prawdopodobnie można to trochę pograć w golfa, ale nie sądzę, że ma dużą szansę na pokonanie odpowiedzi Steveverrilla .

(link ideone)

piskliwy kostuch
źródło
+1 To doskonała koncepcja, znacznie lepsza niż moja, w mniej golfowym języku. Wierzę, że może być w stanie pokonać moją odpowiedź. Zauważ, że musisz wydrukować, #kiedy !(p%(n-1)&&q%(n-1))chciałbym również zmniejszyć liczbę forpętli z czterech do dwóch, używając x=i%113i y = i/113 etc.
Level River St
3

R 293 291 287 282 bajtów

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

Po tym zdałem sobie sprawę, że wykonałem prawie identyczny proces jak @steveverrill. Tablica „#” i puste kwadratowe wnętrza. Może prawdopodobnie wycisnąć z tego trochę więcej. Zwrot karetki dla 3. linii jest znaczący. Podziękowania dla AlexA za kilka.

MickyT
źródło
Odwołujesz się tylko sraz, więc czy nie możesz zrobić inaczej for(g in list(...))niż swcześniej określić osobno? Myślę, że zaoszczędziłoby to 2-3 bajty.
Alex A.,
@AlexA. Dzięki, oczywisty, za którym całkowicie tęskniłem
MickyT,
2

MS-DOS Binary, 137

Poniższy kod będzie działał w MS-DOS, jeśli zapiszesz go w pliku o nazwie square.com, nie jest wymagana dalsza kompilacja (ale ponieważ jest podany w postaci szesnastkowej, musisz go najpierw usunąć z pamięci):

fcba8f01b82370e83000bd1400bb4d018b1743438a27b02043e81e004d75
f1b97000ba8f3289d7b00daab00aaab82409aa83ea70cd214975ecc331c9
88e189ce89d788e1f3aa83c2704e75f4c3201d30e223218527190524063d
1f11521d0d811c0f321f09921c04b8141670101b4d12176619076f1905a6
141066120e4602288d100221022300021f

Dane wyjściowe będą nierozpoznawalne w większości terminali, ale można przekierować je do pliku ( square.com > output.txt) i obejrzeć w edytorze tekstu. Jeśli chcesz czegoś bardziej czytelnego, poniższy kod utworzy działający square.com, jeśli zostanie wprowadzony do 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
użytkownik 2845840
źródło
1

Matlab / Octave, 258

Jak zawsze Matryce. Na stałe zakodowałem indeks wierszy i kolumn dla każdego kwadratu oraz rozmiar. Mogę ich użyć do wypełnienia dużego „pustego” kwadratu #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,''])
wada
źródło
0

Bash, 252

Każdy kodegolfer powinien być w stanie pokonać algorytm kompresji ogólnego przeznaczenia:

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

Dzięki Toby Speightowi za podpowiedź do użycia krótszych danych wejściowych (głupie ja użyłem gzipzamiast gzip -9do kompresji) i ciąg znaków tutaj.

użytkownik 2845840
źródło
2 krótsze z ciągiem tutaj:base64 -d<<<H4sIAP9YuVUAA+3XQQrDIBAF0H1PUfD+d+yq0FA7GirGie/vdEZfkCy0lLl5lOfJlPaKoAUIBAKBQCAQCLwzOP3mfdFVv9IKBM4BTyQpGA0PE0AgcB8wzC3A6vS7egH4d5YH64WPtVGh/zvygj8agcCvQuufzA+2GoFA4AZgd9KCwS7Hzu3B7qQFO09rbXDEaa0NjtgLCAQCgUAgEAgEAoHz34dj8wLKvMUNbzEAAA==|gunzip
Toby Speight
Krótszy wkład prowadzi nas do 251 :base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip
Toby Speight
Jesteś pewien, że to działa? Tylko rozumiem gunzip: command not found. Mogę uruchomić go za pomocą podpowłoki: (base64 -d|gunzip)<<<...ale nadal używa 258 bajtów.
user2845840,
Dziwne, @ user284584 - coś dziwnego na twojej ścieżce? Testowałem to, co napisałem (w interaktywnej powłoce, jeśli to robi różnicę)
Toby Speight
o Boże ... spróbuj skopiować swój komentarz i wkleić go z powrotem do powłoki. Stackexchange „pomocne” wstawiło 6 niewidzialnych znaków, po 3 u + 200c i u + 200b. Po ich usunięciu działa.
user2845840,