¿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


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>



@Conor Ok, gracias por el enlace
— edc65
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.