Wie viele Quadrate sind da?

12

Diese Herausforderung wird von einem Bild inspiriert , die auf Facebook schweift oft , dass sieht aus wie diese . Mit der Ausnahme, dass unser Basisquadrat ungefähr so ​​aussieht:

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

Das Quadrat besteht aus n x m1x1 Quadrat. Sie müssen zählen, wie viele Unterquadrate (1x1, 2x2, 3x3, 4x4, 5x5 usw.) in dieses Quadrat passen. Bei Quadraten können einige Gitterlinien fehlen (wie im obigen Beispiel) oder sie können wie im folgenden Beispiel vollständig sein. Eine rechnerische Aufteilung ist daher meines Wissens nicht möglich.

Eingänge:

  • Die Anzahl der Zeilen ( n) der Eingabe, um das Quadrat zu erstellen.
  • Ein Quadrat aus den folgenden Zeichen: |über nEingabezeilen.

Ausgabe:

  • Die Anzahl der Quadrate beliebiger Größe, die in das Eingabequadrat passen können (wir möchten hier nur eine einzige Zahl, keine Zahl für jede Größe).

Gewinnkriterium:

Die kleinste Antwort (Anzahl der Bytes) gewinnt.

Testfälle:

Im:

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

Aus: 30


Im:

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

Aus: 5


Im:

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

Aus: 7


Im:

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

Aus: 32


Im:

2
┌─┐
└─┘

Aus: 1


Im:

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

Aus: 22

Simon Landry
quelle
3
Ich habe die größeren nicht gezählt, aber hat der dritte nicht 11 Felder?
Value Ink
@ KevinLau-notKenny Du hast recht, ich habe einen Fehler gemacht.
Simon Landry
Ich finde es zu einfach, es wird über eine kombinatorische Form gezählt, möchten Sie lieber das Bildformat von Facebook berücksichtigen?
15.
1
Als Referenz ist der rechteckige Fall A271916 , der m*(m+1)*(3*n-m+1)/6für ein mdurch nRechteck mit n >= m(Abmessungen um eins versetzt, da der Eintrag eher von Punkten als von Quadraten selbst spricht) gibt
Sp3000
1
@SimonLandry Ich meinte Kombinatorik nicht im wahrsten Sinne des Wortes, ich glaube, sp3000 hat nur darauf hingewiesen, dass die erste Version Ihres Puzzles (vor der Bearbeitung) für einen einfachen mathematischen Durchbruch offen war
Abr001am

Antworten:

2

JavaScript (ES6), 292 Bytes 306 325

Bearbeiten Ich habe die Byteanzahl völlig falsch, korrigiert nun thx http://bytesizematters.com/ richtig für das letzte Mal , dass ich Hoffnung thx Cᴏɴᴏʀ O'Bʀɪᴇɴ sehen https://goo.gl/LSHC1U (und 1 Byte weniger wörtlich mit Zeilenumbruch statt '\ 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

Länger als erwartet (wahrscheinlich können ein paar Bytes mehr entfernt werden)

Alle möglichen Felder werden überprüft und gezählt.

Die rFunktion ordnet jedes Zeichen einer Bitmap zu, die hat

  • 1: horizontale Linie in der Mitte nach rechts
  • 2: vertikale Linie von der Mitte nach unten
  • 4: horizontale Linie in der Mitte nach links
  • 8: vertikale Linie von der Mitte nach oben

Ein Quadrat von beliebiger Größe muss haben

  • 4 in allen Zellen außer der ersten in der oberen und unteren Reihe
  • 1 in allen Zellen mit Ausnahme der letzten in der oberen und unteren Reihe
  • 8 in allen Zellen außer der ersten in der äußersten linken und rechten Spalte
  • 2 in allen Zellen mit Ausnahme der letzten in der äußersten linken und rechten Spalte

Prüfung

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
quelle
Ich zähle 307 Bytes .
Conor O'Brien
@Conor Ok, danke für den Link
edc65