¿Cuántos cuadrados hay?

12

Este reto se inspira en una imagen que a menudo vaga en Facebook que se parece a esto . Excepto que nuestro cuadrado base se verá más así:

┌─┬───┬─┐
├─┼─┬─┼─┤
├─┼─┴─┼─┤
├─┼─┬─┼─┤
└─┴─┴─┴─┘

El cuadrado está hecho de n x m1x1 cuadrado, tienes que contar cuántos subcuadrados (1x1, 2x2, 3x3, 4x4, 5x5, etc.) pueden caber dentro de ese cuadrado. A los cuadrados les pueden faltar algunas líneas de cuadrícula (como en el ejemplo anterior) o pueden estar completos como en el ejemplo a continuación. Lo que significa que no es posible un desglose matemático (que yo sepa).

Entradas:

  • La cantidad de líneas ( n) de entrada para construir el cuadrado;
  • Un cuadrado formado por los siguientes caracteres: a |través de nlíneas de entrada.

Salida:

  • La cantidad de cuadrados de cualquier tamaño que pueden caber dentro del cuadrado de entrada (solo queremos un número aquí, no un número para cada tamaño).

Criterio ganador:

La respuesta más pequeña (número de bytes) gana.

Casos de prueba:

En:

5
┌─┬─┬─┬─┐
├─┼─┼─┼─┤
├─┼─┼─┼─┤
├─┼─┼─┼─┤
└─┴─┴─┴─┘

Fuera: 30


En:

3
┌─┬─┐
├─┼─┤
└─┴─┘

Fuera: 5


En:

5
┌─┬─┐
├─┴─┤
├───┤
├─┬─┤
└─┴─┘

Fuera: 7


En:

4
┌─┬─┬─┬─┬─┬─┐
├─┼─┼─┼─┼─┼─┤
├─┼─┼─┼─┼─┼─┤
└─┴─┴─┴─┴─┴─┘

Fuera: 32


En:

2
┌─┐
└─┘

Fuera: 1


En:

4
┌─┬─┬─┬─┬─┬─┐
├─┴─┼─┼─┼─┴─┤
├─┬─┼─┼─┼─┬─┤
└─┴─┴─┴─┴─┴─┘

Fuera: 22

Simon Landry
fuente
3
No conté las más grandes, pero ¿la tercera no tiene 11 casillas?
Value Ink
@ KevinLau-notKenny Tienes razón, cometí un error.
Simon Landry
Creo que es demasiado simple, se cuenta a través de una forma combinatoria, ¿preferirías considerar el formato de imagen de Facebook?
Abr001am
1
Para referencia, el caso rectangular es A271916 , lo que da m*(m+1)*(3*n-m+1)/6para una mpor nrectángulo con n >= m(dimensiones compensadas por uno desde la entrada habla de puntos en lugar de los propios cuadrados)
SP3000
1
@SimonLandry no quise decir combinatoria en sentido puro, creo que sp3000 ya señaló que la primera versión de su rompecabezas (antes de editar) estaba abierta para un avance matemático simple
Abr001am

Respuestas:

2

JavaScript (ES6), 292 bytes 306 325

Editar Hice el recuento de bytes totalmente incorrecto, corregido ahora gracias a http://bytesizematters.com/ correcto por última vez espero que Cᴏɴᴏʀ O'Bʀɪᴇɴ vea https://goo.gl/LSHC1U (y 1 byte menos usando un literal nueva línea en lugar de '\ n')

(h,z)=>(o=>{r=p=>" ),┌(─┐┬'└│├┘┴┤┼".search(z[p]);for(q=s=0;++s<o/2&s<h;)for(y=0;y<(h-s)*o;y+=o)for(x=0;x<o-s*2;q+=!n,x+=2)for(n=i=0,t=x,u=y;i<=s;t+=2,u+=o,i++)n|=i<s&(!(r(t+y)&r(t+y+s*o)&1)|!(r(x+u)&r(x+u+s*2)&2))|i>0&(!(r(t+y)&r(t+y+s*o)&4)|!(r(x+u)&r(x+u+s*2)&8))})(-~z.search`
`)|q

Más tiempo de lo que esperaba (probablemente se pueden eliminar algunos bytes más)

Todos los cuadrados posibles se verifican y cuentan.

La rfunción asigna cada carácter a un mapa de bits que tiene

  • 1: línea horizontal de centro a derecha
  • 2: línea vertical de centro a fondo
  • 4: línea horizontal centro a izquierda
  • 8: línea vertical de centro a arriba

Un cuadrado de cualquier tamaño debe tener

  • 4 en todas las celdas excepto la primera en la fila superior e inferior
  • 1 en todas las celdas excepto la última en la fila superior e inferior
  • 8 en todas las celdas, excepto la primera en la columna más a la izquierda y más a la derecha
  • 2 en todas las celdas, excepto la última en la columna más a la izquierda y más a la derecha

Prueba

f=(h,z)=>(o=>{r=p=>" ),┌(─┐┬'└│├┘┴┤┼".search(z[p]);k=(p,d,m)=>r(p)&r(p+s*d)&m;for(q=s=0;++s<o/2&s<h;)for(y=0;y<(h-s)*o;y+=o)for(x=0;x<o-s*2;q+=!n,x+=2)for(n=i=0,t=x,u=y;i<=s;t+=2,u+=o,i++)n=n|i<s&(!k(t+y,o,1)|!k(x+u,2,2))|i>0&(!k(t+y,o,4)|!k(x+u,2,8));})(-~z.search`
`)|q

console.log=(...x)=>O.textContent+=x+'\n'

// Less golfed

Uf=(h,z)=>{
  o=-~z.search`\n`;
  w=o/2;
  r=p=>" ),┌(─┐┬'└│├┘┴┤┼".search(z[p]);
  k=(p,d,m)=>r(p)&r(p+s*d)&m;
  for(q=s=0;++s<w&s<h;)
    for(y=0;y<(h-s)*o;y+=o)
      for(x=0;x<(w-s)*2;q+=!n,x+=2)
        for(n=i=0,t=x,u=y;i<=s;t+=2,u+=o,i++)
          n|=i<s&(!k(t+y,o,1)|!k(x+u,2,2))
          |i>0&(!k(t+y,o,4)|!k(x+u,2,8));
  return q
}

;[[5,`┌─┬───┬─┐
├─┼─┬─┼─┤
├─┼─┴─┼─┤
├─┼─┬─┼─┤
└─┴─┴─┴─┘`,20]
,[5,`┌─┬─┬─┬─┐
├─┼─┼─┼─┤
├─┼─┼─┼─┤
├─┼─┼─┼─┤
└─┴─┴─┴─┘`,30]
,[3,`┌─┬─┐
├─┼─┤
└─┴─┘`,5]
,[5,`┌─┬─┐
├─┴─┤
├───┤
├─┬─┤
└─┴─┘`,7]
,[4,`┌─┬─┬─┬─┬─┬─┐
├─┼─┼─┼─┼─┼─┤
├─┼─┼─┼─┼─┼─┤
└─┴─┴─┴─┴─┴─┘`,32]
,[2,`┌─┐
└─┘`,1]
,[4,`┌─┬─┬─┬─┬─┬─┐
├─┴─┼─┼─┼─┴─┤
├─┬─┼─┼─┼─┬─┤
└─┴─┴─┴─┴─┴─┘`,22],
,[6,`┌─┬─────┐
├─┼─┬─┐ 
 ├─┼─┼─┤
 └─┼─┼─┤
   └─┼─┤
└─────┴─┘`,12],  
,[6,`┌─┬─┬─┬─┐
├─┴─┼─┼─┤
   └─┼─┤
├─┬─┬─┼─┤
├─┼─┼─┼─┤
└─┴─┴─┴─┘`,23]]  
.forEach(t=>{
  var r=t[0],a=t[1],k=t[2],x=f(r,a)
  console.log(x==k?'OK '+x:'KO '+x+' Expected '+k,'\n'+a)
})
<pre id=O></pre>

edc65
fuente
Cuento 307 bytes .
Conor O'Brien
@Conor Ok, gracias por el enlace
edc65