Quantos quadrados existem?


12

Este desafio é inspirada por uma imagem que muitas vezes anda no Facebook que se parece com isso . Exceto que nosso quadrado base será mais parecido com este:

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

O quadrado é composto de n x m1x1 quadrado, você deve contar quantos sub-quadrados (1x1, 2x2, 3x3, 4x4, 5x5 etc.) cabem dentro desse quadrado. Quadrados podem estar faltando algumas linhas de grade (como no exemplo acima) ou estar completos como no exemplo abaixo. O que significa que uma quebra matemática não é possível (tanto quanto eu sei).

Entradas:

  • A quantidade de linhas ( n) de entrada para construir o quadrado;
  • Um quadrado formado pelos seguintes caracteres: |através das nlinhas de entrada.

Resultado:

  • A quantidade de quadrados de qualquer tamanho que pode caber no quadrado de entrada (queremos apenas um único número aqui, não um número para cada tamanho).

Critério de vitória:

A menor resposta (número de bytes) vence.

Casos de teste:

Dentro:

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

Fora: 30


Dentro:

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

Fora: 5


Dentro:

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

Fora: 7


Dentro:

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

Fora: 32


Dentro:

2
┌─┐
└─┘

Fora: 1


Dentro:

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

Fora: 22


3
Não contei os maiores, mas o terceiro não possui 11 quadrados?
Value Ink

@ KevinLau-notKenny Você está certo, eu cometi um erro.
Simon Landry

Eu acho que é muito simples, é contado através de uma forma combinatória. Você prefere considerar o formato de imagem do facebook?
Abr001am 15/05

1
Para referência, o caso é rectangular A271916 , que dá m*(m+1)*(3*n-m+1)/6para um mpor nrectângulo com n >= m(dimensões compensado por uma vez que a entrada de fala de pontos, em vez dos próprios quadrados)
SP3000

1
@SimonLandry i did not combinatória médios em sens puros, eu acho que SP3000 apenas apontou que fora já, a primeira versão do seu quebra-cabeça (antes de editar) foi aberto para um avanço matemático simples
Abr001am

Respostas:


2

JavaScript (ES6), 292 bytes 306 325

Edit Eu fiz a contagem de bytes totalmente errada, corrigida agora thx http://bytesizematters.com/ correta pela última vez, espero que thx Cᴏɴᴏʀ O'Bʀɪᴇɴ veja https://goo.gl/LSHC1U (e 1 byte a menos usando um literal nova linha em vez 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

Mais do que eu esperava (provavelmente mais alguns bytes podem ser removidos)

Todos os quadrados possíveis são verificados e contados.

A rfunção mapeia cada caractere para um bitmap que possui

  • 1: linha horizontal central para a direita
  • 2: linha vertical centro para baixo
  • 4: centro da linha horizontal para a esquerda
  • 8: centro da linha vertical para cima

Um quadrado de qualquer tamanho deve ter

  • 4 em todas as células, exceto a primeira na linha superior e inferior
  • 1 em todas as células, exceto a última na linha superior e inferior
  • 8 em todas as células, exceto a primeira na coluna mais à esquerda e mais à direita
  • 2 em todas as células, exceto a última na coluna mais à esquerda e mais à direita

Teste

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>


Eu conto 307 bytes .
Conor O'Brien

@Conor Ok obrigado pelo link
edc65
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.