Tulis program penghitungan kuadrat

8

Teka-teki yang terkenal melibatkan menghitung berapa banyak kotak yang dapat dibuat menggunakan titik-titik pada kisi 3x3:

.  .  .
.  .  .
.  .  .

Jawabannya adalah 6 - empat kotak kecil, satu kotak besar, dan satu kotak terbentuk dari pasak atas, kiri, bawah, dan kanan, dengan tepi di sepanjang diagonal kotak.

Tugas Anda adalah membangun sebuah program yang menghitung jumlah kuadrat yang dapat dibentuk dari sekumpulan poin.

Program Anda akan mengambil input dalam salah satu dari dua format (pilihan Anda):

  • Sebuah Moleh Njaringan yang terdiri dari baik .atau . .mewakili titik pada kotak yang kotak dapat menjadi sudut, dan semua ruang pada kotak persis satu unit terpisah secara horizontal atau vertikal.

  • Daftar pasangan koordinat yang mewakili titik-titik dimana persegi dapat berada.

dan kembalikan jumlah kotak yang berbeda yang dapat dibentuk dengan menggunakan poin yang disediakan. Program Anda harus mengembalikan solusi yang benar untuk setiap input yang mungkin.


Misalnya, ambil input di atas tetapi di mana alun-alun tidak ada:

...
. .
...

Hanya ada dua kotak yang mungkin di sini (yang besar dan yang diagonal), sehingga program harus kembali 2.


Kode terpendek untuk melakukan ini dalam bahasa apa pun menang.

Joe Z.
sumber
7
Saya akan mendukung Anda, tetapi reputasi Anda sempurna. (6666) :-P
Gagang Pintu
Selama aku punya reputasi itu, aku iblis :(
Joe Z.
Apakah kita berbicara tentang kotak atau persegi panjang ? Anda mengatakan unit horisontal dan vertikal sama-sama 1. Tetapi dalam contoh Anda, titik-titik adalah satu unit terpisah secara vertikal tetapi 3 unit terpisah secara horizontal. Jadi bagaimana kotak-kotak itu? Mungkinkah ada kesenjangan dalam input? Jika demikian, dapatkah Anda memberikan contoh yang lebih kompleks?
Martin Ender
Titik-titik dalam pertanyaan hanya diberi jarak lebih luas untuk tujuan estetika. Mereka harus terpisah hanya satu karakter untuk keperluan pertanyaan aktual.
Joe Z.
Berapa nilai maksimum yang mungkin untuk M dan N, dan jumlah maksimum poin total? Dan apakah kita bebas untuk mengatakan berapa banyak poin yang kita inginkan? (Entah dengan mengambil input di awal, atau dengan menghentikan begitu semacam EOF tercapai.)
Level River St

Jawaban:

7

Python, 95

Mengambil daftar koordinat dari stdin.

l=input();print(sum((c-d+b,d+c-a)in l and(a-d+b,b+c-a)in l for a,b in l for c,d in l)-len(l))/4

Penjelasan:

Untuk setiap pasangan poin (a,b)dan (c,d), periksa apakah kotak dengan poin tambahan (c-d+b,d+c-a)dan (a-d+b,b+c-a)ada dalam daftar. Ini menghitung setiap kuadrat 4 kali, dan setiap titik sekali (ketika (a,b) = (c,d)), jadi kurangi jumlah poin dan bagi dengan 4 memberi jumlah kuadrat.

kotak kardus
sumber
Pintar, ringkas.
primo