Imprime el cuadrado cuadrado perfecto más pequeño

16

Cuadrar el cuadrado es un proceso de mosaico de un cuadrado usando solo otros cuadrados. Si este mosaico solo usa cuadrados de diferentes tamaños, entonces se considera perfecto . El cuadrado cuadrado perfecto más pequeño posible es un mosaico cuadrado de 112x112 con 21 cuadrados diferentes.

He creado la versión de arte ascii de este cuadrado a continuación:

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

Su envío debe imprimir el cuadrado de arriba. Puede imprimir un reflejo y / o rotación del cuadrado de arriba si lo desea. Se permite una nueva línea final en la última línea. Este es un , por lo que gana la presentación más pequeña.

Nathan Merrill
fuente
@Optimizer Según la pregunta y Wikipedia, todos los cuadrados pequeños tienen que ser de tamaños completamente diferentes.
Level River St
Nathan, ¿mi presentación está de acuerdo con las reglas? Usé un grosor uniforme para todas las líneas.
DavidC
@DavidCarraher Tengo cada lado del cuadrado delineado (por lo que los lados internos tienen múltiples signos de libras) Además, debe usar en #lugar deX
Nathan Merrill
1
Nathan, en el plano, los bordes no son bordes. Son segmentos de línea unidimensionales. Donde dos fichas se encuentran, deberíamos ver una sola línea, no dos. De lo contrario, estamos transmitiendo la idea de que hay una brecha entre las fichas.
DavidC
@DavidCarraher, si bien eso es cierto, creo que tiene más sentido representarlo de esta manera.
Nathan Merrill

Respuestas:

4

CJam, 88 84 83 bytes

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

Pruébalo aquí.

Explicación

Aquí está la idea básica: comience con un cuadrado "vacío" de 112x112. Ahora ve a través de los cuadrados en orden de lectura (de izquierda a derecha, de arriba a abajo). Agregue cada cuadrado en la primera posición disponible. Luego, imprima todas las líneas completadas; esto garantiza que solo necesitemos verificar la primera línea (restante) para averiguar dónde va el siguiente cuadrado.

La cuadrícula vacía se inicializa en ps, porque necesitaba un carácter con un código de caracteres más grande que el espacio y #, y porque podía reutilizar su propio código de caracteres 112para el tamaño de la cuadrícula inicial. Hice uso de algunos de los trucos de arte ASCII de Dennis aquí para llenar los cuadrados pequeños en la cuadrícula.

'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
fuente
9

Mathematica 360 426

El código funciona dibujando primero el cuadrado perfecto de los cuadrados, rasterizando y binarizando la imagen, y luego convirtiendo 0 en "#" y 1 en "".

La salida se devuelve como caracteres ASCII ordinarios en una tabla.

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


Prefiero esta representación, obtenida eliminando Thickness[.015]

pic2

DavidC
fuente
El grosor de la línea no varía, el cuadrado de 50x50 tiene 48 caracteres de espacio y 48 caracteres de espacio hacia abajo, con un borde de #'s. Choca contra otros cuadrados a la derecha e inferior, que se dibujan de manera similar. Cuando dos cuadrados que tienen #todo el exterior se encuentran, por lo tanto, obtienes un doble #para las líneas internas, y los cuadrados son cuadrados, tienen el mismo número de caracteres vertical y horizontalmente. El problema es la fuente. Esta respuesta no cumple con la especificación. Si se aceptara, la pregunta se votaría de cerca por una victoria no objetiva.
Level River St
Las líneas se conciben como unidimensionales, no bidimensionales. No deben interpretarse como bordes con grosor. Después de todo, estamos dividiendo una región cuadrada en subregiones cuadradas. Las fronteras no deben ocupar ninguna área.
DavidC
Ese es un poco el punto. Las líneas van entre los cuadrados , y OP eligió representar los cuadrados con bordes internos. Podría haber sido más claro si hubiera elegido usar un símbolo diferente para cada cuadrado (y posiblemente también los haya llenado). En cualquier caso, como puede ver en las preguntas recientes de la bandera, la comprensión habitual (y todo el punto de la complejidad de komolgorov etiqueta) es reproducir fielmente la representación de arte Ascii suministrada por el OP, no hacer su propia interpretación. Si bien es interesante, esta no es una respuesta válida. Muchos cuadrados todavía tienen diferentes números de caracteres en su altura y ancho.
Level River St
Me recuerda a Von Karman Streets
Beta Decay
3

Rubí, 180 bytes.

Versión de golf basada en la versión sin golf de abajo. Aprovechamos el hecho de que normalmente hay 2 o 3 cuadrados con la misma ycoordenada para la esquina superior izquierda.

La primera cadena mágica contiene códigos ASCII para square sidelength+70y y increment +40. Al encontrar una longitud lateral cuadrada (código Ascii> 67) asumimos que el siguiente cuadrado está en la misma coordenada y, y la coordenada x se puede obtener incrementando la coordenada x actual en sidelength+2. Al encontrar un incremento ay (código Ascii <67) incrementamos la coordenada y en consecuencia y restablecemos la coordenada x a la figura codificada en la segunda cadena mágica.

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

Versión original

Esta solución (completamente no oculta) contiene 315 bytes, excluyendo líneas en blanco y sangrías innecesarias. Simplemente crea una matriz de 112 cadenas de 112 #y luego reemplaza el interior de los cuadrados con espacios.

$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
fuente
3

C, 198 bytes

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

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

Todo lo que hace es escanear a través de una matriz de 112 × 112 bytes (inicializados a cero). Cada vez que encuentra un byte cero, obtiene un valor de la matriz iy agrega un cuadro del tamaño correspondiente. El byte adicional en cada fila actúa como un terminador de cadena, por lo que podemos usar puts()para generar líneas completas en lugar de usarputchar() para generar caracteres individualmente.

Probablemente esto se pueda jugar un poco más, pero no creo que tenga muchas posibilidades de superar la respuesta de steveverrill .

(enlace ideone)

ossifrage aprensivo
fuente
+1 Este es un concepto excelente, mucho mejor que el mío, en un lenguaje menos golfista. Creo que podría superar mi respuesta. Tenga en cuenta que necesita imprimir un #cuando !(p%(n-1)&&q%(n-1))también buscaría reducir el número de forbucles de cuatro a dos, usando x=i%113e y = i/113 etc.
Level River St
3

R, 293 291 287 282 bytes

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

Después de hacer esto, me di cuenta de que había hecho casi el mismo proceso que @steveverrill. Una matriz de '#' y deja en blanco los interiores cuadrados. Probablemente pueda exprimir un poco más de esto. El retorno de carro para la tercera línea es significativo. Gracias a AlexA por unos pocos.

MickyT
fuente
Solo hace referencia suna vez, ¿no podría hacerlo en for(g in list(...))lugar de especificar por sseparado de antemano? Creo que eso te ahorraría 2-3 bytes.
Alex A.
@AlexA. Gracias, una obvia que me perdí totalmente
MickyT
2

Binario de MS-DOS, 137

El siguiente código se ejecutará en MS-DOS si lo escribe en un archivo llamado square.com, no se requiere compilación adicional (pero dado que se proporciona en hexadecimal, primero debe "deshex"):

fcba8f01b82370e83000bd1400bb4d018b1743438a27b02043e81e004d75
f1b97000ba8f3289d7b00daab00aaab82409aa83ea70cd214975ecc331c9
88e189ce89d788e1f3aa83c2704e75f4c3201d30e223218527190524063d
1f11521d0d811c0f321f09921c04b8141670101b4d12176619076f1905a6
141066120e4602288d100221022300021f

El resultado será irreconocible en la mayoría de los terminales, pero puede redirigirlo a un archivo ( square.com > output.txt) y mirarlo en un editor de texto. Si desea algo más legible, el siguiente código producirá un square.com que funcione si se alimenta a 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
usuario2845840
fuente
1

Matlab / Octave, 258

Como siempre, Matrices. Codifiqué la fila y los índices de columna de cada cuadrado y el tamaño. Puedo usar estos para llenar un gran cuadrado 'en blanco' de #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,''])
falla
fuente
0

Bash, 252

Cada codegolfer debería poder superar un algoritmo de compresión de propósito general:

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

Gracias a Toby Speight por la sugerencia de usar una entrada más corta (tonto que yo usé en gziplugar de gzip -9compresión) y una cadena aquí.

usuario2845840
fuente
2 más corto con here-string:base64 -d<<<H4sIAP9YuVUAA+3XQQrDIBAF0H1PUfD+d+yq0FA7GirGie/vdEZfkCy0lLl5lOfJlPaKoAUIBAKBQCAQCLwzOP3mfdFVv9IKBM4BTyQpGA0PE0AgcB8wzC3A6vS7egH4d5YH64WPtVGh/zvygj8agcCvQuufzA+2GoFA4AZgd9KCwS7Hzu3B7qQFO09rbXDEaa0NjtgLCAQCgUAgEAgEAoHz34dj8wLKvMUNbzEAAA==|gunzip
Toby Speight
Y una entrada más corta nos lleva a 251 :base64 -d<<<H4sIADyFv1UCA+3ZOw6EMAwFwH5PgeT735EOUSyfQAgOmVeCxUgusAkRbfOLqTARd0qAQCAQCAQCgcAvg80375dW/T+lQGAbsCCdgvsdXl0AAoHjgM8e7mUA92bKG+DtpAevDPflRsko7BXcKAQCD9+X3wOPCoFA4ABgnZ/OmcHTS+bw4PXzkV7Ak93KDdboVm6wxrOAQCAQCAQCgUAgENj++7BuZsq8xQ1vMQAA|gunzip
Toby Speight
¿Estás seguro de que funciona? Yo solo entiendo gunzip: command not found. Puedo hacerlo funcionar usando un subshell: (base64 -d|gunzip)<<<...pero eso todavía usa 258 bytes.
user2845840
Extraño, @ user284584: ¿algo extraño en tu camino? Probé lo que escribí (en un shell interactivo, si eso marca la diferencia)
Toby Speight
oh dios ... intenta copiar tu comentario y pegarlo de nuevo en el shell. Stackexchange insertó "útilmente" 6 caracteres invisibles, 3 de cada uno de u + 200c yu + 200b. Después de eliminarlos, funciona.
user2845840