Ada berapa kotak?

12

Tantangan ini terinspirasi oleh gambar yang sering berkeliaran di Facebook yang terlihat seperti ini . Kecuali base square kami akan terlihat seperti ini:

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

Kotak itu terbuat dari n x mkotak 1x1, Anda harus menghitung berapa banyak sub-kotak (1x1, 2x2, 3x3, 4x4, 5x5, dll.) Yang bisa masuk dalam kotak itu. Kotak dapat kehilangan beberapa garis kisi (seperti pada contoh di atas) atau lengkap seperti pada contoh di bawah. Yang berarti pemecahan matematis tidak dimungkinkan (sejauh yang saya tahu).

Input:

  • Jumlah garis ( n) input untuk membangun kuadrat;
  • Kotak dibuat dari karakter berikut: |melintasi ngaris input.

Keluaran:

  • Jumlah kotak dengan ukuran apa pun yang dapat masuk dalam kotak input (kami hanya ingin satu nomor di sini, bukan nomor untuk setiap ukuran).

Kriteria kemenangan:

Jawaban terkecil (jumlah byte) menang.

Kasus uji:

Di:

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

Keluar: 30


Di:

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

Keluar: 5


Di:

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

Keluar: 7


Di:

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

Keluar: 32


Di:

2
┌─┐
└─┘

Keluar: 1


Di:

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

Keluar: 22

Simon Landry
sumber
3
Saya tidak menghitung yang lebih besar, tetapi bukankah yang ketiga memiliki 11 kotak di dalamnya?
Nilai Tinta
@ KevinLau-notKenny Anda benar saya membuat kesalahan.
Simon Landry
Saya pikir ini terlalu sederhana, itu dihitung melalui bentuk kombinatorik, apakah Anda lebih suka mempertimbangkan format gambar facebook?
Abr001am
1
Untuk referensi, kotak persegi panjang adalah A271916 , yang memberikan m*(m+1)*(3*n-m+1)/6untuk mdengan npersegi panjang dengan n >= m(dimensi diimbangi oleh satu sejak entri berbicara tentang poin daripada kotak sendiri)
Sp3000
1
@SimonLandry maksud saya bukan kombinatorik dalam arti murni, saya pikir sp3000 baru saja menunjukkan bahwa, versi pertama dari teka-teki Anda (sebelum diedit) terbuka untuk terobosan matematika sederhana
Abr001am

Jawaban:

2

JavaScript (ES6), 292 byte 306 325

Sunting Saya benar-benar salah menghitung byte, dikoreksi sekarang thx http://bytesizematters.com/ benar untuk yang terakhir kali saya harap thx Cᴏɴᴏʀ O'Bʀɪᴇɴ lihat https://goo.gl/LSHC1U (dan 1 byte lebih sedikit menggunakan literal) bukan baris baru dari '\ 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

Lebih lama dari yang saya harapkan (mungkin beberapa byte lagi dapat dicukur)

Semua kotak yang mungkin diperiksa dan dihitung.

The rfungsi peta masing-masing karakter untuk bitmap memiliki

  • 1: pusat garis horizontal ke kanan
  • 2: pusat garis vertikal ke bawah
  • 4: pusat garis horizontal ke kiri
  • 8: pusat garis vertikal ke atas

Kuadrat dari berbagai ukuran harus memiliki

  • 4 di semua sel kecuali yang pertama di baris atas dan bawah
  • 1 di semua sel kecuali yang terakhir di baris atas dan bawah
  • 8 di semua sel kecuali yang pertama di kolom paling kiri dan paling kanan
  • 2 di semua sel kecuali yang terakhir di kolom paling kiri dan paling kanan

Uji

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
sumber
Saya menghitung 307 byte .
Conor O'Brien
@Conor Ok terima kasih atas tautannya
edc65