Ile jest kwadratów?

12

To wyzwanie jest inspirowany obrazem, który często przemierza na Facebooku, który wygląda jak ten . Tyle że nasz kwadrat podstawowy będzie wyglądał bardziej tak:

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

Kwadrat składa się z n x mkwadratu 1x1, musisz policzyć, ile kwadratów (1x1, 2x2, 3x3, 4x4, 5x5 itp.) Mieści się w tym kwadracie. Kwadraty mogą nie zawierać niektórych linii siatki (jak w powyższym przykładzie) lub być kompletne jak w poniższym przykładzie. Co oznacza, że ​​matematyczny podział nie jest możliwy (o ile mi wiadomo).

Wejścia:

  • Ilość linii ( n) danych wejściowych do zbudowania kwadratu;
  • Kwadrat złożony z następujących znaków: w |poprzek nlinii wprowadzania.

Wynik:

  • Liczba kwadratów o dowolnym rozmiarze, które mogą zmieścić się w kwadracie wejściowym (chcemy tutaj tylko jednej liczby, a nie liczby dla każdego rozmiaru).

Kryterium wygranej:

Najmniejsza odpowiedź (liczba bajtów) wygrywa.

Przypadki testowe:

W:

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

Out: 30


W:

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

Out: 5


W:

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

Out: 7


W:

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

Out: 32


W:

2
┌─┐
└─┘

Out: 1


W:

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

Out: 22

Simon Landry
źródło
3
Nie liczyłem większych, ale czy na trzecim nie ma 11 kwadratów?
Wartość tuszu
@ KevinLau-notKenny Masz rację Popełniłem błąd.
Simon Landry
Myślę, że jest to zbyt proste, jest liczone za pomocą formy kombinatorycznej, czy wolałbyś raczej rozważyć format obrazu na Facebooku?
Abr001am,
1
Dla porównania, prostokątny przypadek A271916 , co daje m*(m+1)*(3*n-m+1)/6AN mprzez nprostokąt z n >= m(wymiary przesunięte o jeden od wejścia mówi punktów zamiast samych kwadraty)
SP3000
1
@ SimonLandry Nie miałem na myśli kombinatoryki w czystym sensie, myślę, że sp3000 właśnie wskazało, że już pierwsza wersja twojej układanki (przed edycją) była otwarta na prosty matematyczny przełom
Abr001am

Odpowiedzi:

2

JavaScript (ES6), 292 bajtów 306 325

Edytuj Zrobiłem, że liczba bajtów była całkowicie niepoprawna, poprawiona teraz dzięki http://bytesizematters.com/ poprawiona po raz ostatni Mam nadzieję, że dzięki Cᴏɴᴏʀ O'Bʀɪᴇɴ zobacz https://goo.gl/LSHC1U (i 1 bajt mniej używając literału znak nowej linii zamiast „\ 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

Dłuższy niż się spodziewałem (prawdopodobnie można wygolić jeszcze kilka bajtów)

Wszystkie możliwe kwadraty są sprawdzane i liczone.

rFunkcja map każdy znak do bitmapy konieczności

  • 1: linia pozioma od środka do prawej
  • 2: pionowa linia od środka do dołu
  • 4: środek linii poziomej w lewo
  • 8: pionowa linia od środka do góry

Kwadrat o dowolnym rozmiarze musi mieć

  • 4 we wszystkich komórkach oprócz pierwszego w górnym i dolnym rzędzie
  • 1 we wszystkich komórkach oprócz ostatniego w górnym i dolnym rzędzie
  • 8 we wszystkich komórkach oprócz pierwszej w kolumnie znajdującej się najbardziej po lewej i prawej stronie
  • 2 we wszystkich komórkach oprócz ostatniej w kolumnie znajdującej się najbardziej po lewej i prawej stronie

Test

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
źródło
Liczę 307 bajtów .
Conor O'Brien
@ Conor Ok, dziękuję za link
edc65