Tulis fungsi yang mengambil 4 titik pada bidang sebagai input dan mengembalikan true jika 4 poin membentuk kuadrat. Poin akan memiliki koordinat integral dengan nilai absolut <1000.
Anda dapat menggunakan representasi 4 poin yang masuk akal sebagai input. Poin tidak disediakan dalam urutan tertentu.
Kode terpendek menang.
Kotak contoh:
(0,0),(0,1),(1,1),(1,0) # standard square
(0,0),(2,1),(3,-1),(1,-2) # non-axis-aligned square
(0,0),(1,1),(0,1),(1,0) # different order
Contoh non-kotak:
(0,0),(0,2),(3,2),(3,0) # rectangle
(0,0),(3,4),(8,4),(5,0) # rhombus
(0,0),(0,0),(1,1),(0,0) # only 2 distinct points
(0,0),(0,0),(1,0),(0,1) # only 3 distinct points
Anda dapat mengembalikan benar atau salah untuk kotak degenerasi (0,0),(0,0),(0,0),(0,0)
Jawaban:
Python
1769079 byteFungsi S mengambil daftar bilangan kompleks sebagai inputnya (A). Jika kita tahu pusat dan salah satu sudut kotak, kita dapat merekonstruksi kotak dengan memutar sudut 90.180 dan 270 derajat di sekitar titik pusat (c). Pada rotasi bidang yang rumit sebesar 90 derajat tentang titik asal dilakukan dengan mengalikan titik dengan i . Jika bentuk asli kita dan alun-alun yang direkonstruksi memiliki titik yang sama maka itu pasti persegi.
sumber
J, 28
172527J tidak benar-benar memiliki fungsi, tetapi inilah kata kerja monadik yang mengambil vektor titik dari bidang kompleks:
Metode adalah campuran dari Michael Spencer (bekerja hanya pada panjang antar-simpul; tetapi dia saat ini gagal rhombus2 saya) dan karya Eelvex (periksa ukuran set). Membaca dari kanan ke kiri:
-/~
hitung semua perbedaan poin,
meratakan|
ekstrak besarnya/:~
memilah#/.~
nub dan hitung4 8 4 -:
harus memiliki 4 equidistant (pada 0), 8 sedikit lebih besar (panjang 1, sisi), 4 lebih besar lagi (panjangsqrt 2
, diagonal)Demonstrasi:
Demi ingatan, metode saya sebelumnya (diperlukan simpul yang dipesan, tetapi dapat mendeteksi poligon reguler dari pesanan apa pun):
Lihat riwayat untuk penjelasan dan demo. Metode saat ini mungkin dapat diperluas ke poligon lain, yang
4 8 4
memang terlihat banyak seperti distribusi binomial.sumber
3 :'4 8 4-:#/.~/:~|,-/~y'
Python, 71
42Perbarui 1) untuk memerlukan 4 poin berbeda (sebelumnya akan memberikan positif palsu untuk poin berulang - apakah ada yang lain?) 2) untuk mendefinisikan fungsi per spec
Untuk bujur sangkar, vektor antara dua titik harus 0 (titik yang sama), sisi, atau diagonal. Jadi, himpunan besarnya vektor-vektor ini harus memiliki panjang 3.
sumber
Haskell, 100 karakter
Inilah cara saya menulis solusi JB's di Haskell. Dengan tidak ada upaya untuk merusak keterbacaan dengan menghapus karakter yang tidak penting, ini tentang 132 karakter:
Anda dapat mengikisnya sedikit hingga 100 dengan menghapus ruang berlebih dan mengganti nama beberapa hal
Mari kita gunakan QuickCheck untuk memastikan bahwa ia menerima kuadrat sembarang, dengan satu simpul di (x, y) dan vektor tepi (a, b):
Mencoba dalam ghci:
Oh benar, kotak kosong tidak dianggap sebagai kotak di sini, jadi kami akan merevisi pengujian kami:
Dan mencobanya lagi:
sumber
d
.s l=[4,8,4]==(map length.group.sort)[(x-a)^2+(y-b)^2|(x,y)<-l,(a,b)<-l]
Faktor
Implementasi dalam bahasa pemrograman Factor :
Dan beberapa tes unit:
sumber
OCaml, 145
164Jalankan seperti ini:
Ayo deobfuscate dan jelaskan sedikit.
Pertama kita mendefinisikan suatu norma:
Anda akan melihat bahwa tidak ada panggilan ke sqrt, itu tidak diperlukan di sini.
Di sini a, b, c dan d adalah poin. Kami berasumsi bahwa poin-poin ini ditata seperti ini:
Jika kita memiliki kotak maka semua syarat ini harus berlaku:
Perhatikan bahwa yang berikut ini selalu berlaku:
Kami akan menggunakannya untuk menyederhanakan fungsi pengujian kami di bawah ini.
Karena input kami tidak dipesan, kami juga harus memeriksa semua permutasi. Tanpa kehilangan sifat umum kita dapat menghindari permutasi pada poin pertama:
Setelah penyederhanaan:
Sunting: mengikuti saran M.Giovannini.
sumber
n
untuk pengurangan 20 karakter:let t a b c d=a%b+a%c=b%c&&d%c+d%b=b%c&&a%b=a%c&&d%c=d%b
.Python (105)
Poin diwakili oleh
(x,y)
tupel. Poin bisa dalam urutan apa pun dan hanya menerima kotak. Membuat daftar,,s
dari jarak berpasangan (bukan nol) antara titik-titik. Total harus ada 12 jarak, dalam dua kelompok unik.sumber
f([(0,0),(0,4),(2,2),(-2,2)])
adalah persegiPython - 42 karakter
Sepertinya ini peningkatan untuk menggunakan bilangan kompleks untuk poin
di mana A = [(11 + 13j), (14 + 12j), (13 + 9j), (10 + 10j)]
jawaban lama:
Poin ditentukan dalam urutan apa pun sebagai daftar, misalnya
sumber
>>> A=[(0,0),(0,0),(1,1),(0,0)] >>> len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2 True
A=[(0,0),(0,4),(2,2),(-2,2)]; len(set((a-c)**2+(b-d)**2 for(a,b),(c,d)in combinations(A,2)))==2
C # - tidak terlalu pendek. LINQ yang menyalahgunakan. Memilih dua kombinasi titik yang berbeda dalam input, menghitung jaraknya, lalu memverifikasi bahwa empat di antaranya sama dan hanya ada satu nilai jarak berbeda. Point adalah kelas dengan dua anggota ganda, X dan Y. Bisa dengan mudah menjadi Tuple, tapi meh.
sumber
PHP, 82 karakter
sumber
K - 33
Terjemahan dari solusi J oleh JB :
K menderita di sini dari kata-kata yang dicadangkan (
_sqr
dan_sqrt
).Pengujian:
sumber
Baterai OCaml +, 132 karakter
(lihat, Bu, tidak ada spasi!) Pemahaman daftar di
q
bentuk daftar norma kuadrat untuk setiap pasangan poin unordered berbeda. Sebuah bujur sangkar memiliki empat sisi yang sama dan dua diagonal yang sama, panjang kuadrat dari yang terakhir menjadi dua kali panjang kuadrat dari yang pertama. Karena tidak ada segitiga sama sisi dalam kisi integer tes tidak benar-benar diperlukan, tapi saya memasukkannya untuk kelengkapan.Tes:
sumber
Mathematica
65 80 6966Memeriksa bahwa jumlah jarak antar-titik yang berbeda (tidak termasuk jarak dari satu titik ke titik itu sendiri) adalah 2 dan yang lebih pendek dari keduanya bukan 0.
Pemakaian
NB:
\[And]
adalah karakter tunggal dalam Mathematica.sumber
Jeli , 8 byte
Cobalah online!
Mengambil daftar bilangan kompleks sebagai argumen baris perintah. Cetakan
1
atau0
.Ini sepertinya tantangan yang menyenangkan untuk dihidupkan kembali!
sumber
Haskell (212)
Upaya pertama yang naif. Periksa dua kondisi berikut untuk semua permutasi dari daftar input poin (di mana permutasi yang diberikan mewakili, katakanlah, urutan searah jarum jam dari poin-poin):
Kode dan tes yang didobobus
sumber
Scala (146 karakter)
sumber
JavaScript 144 karakter
Secara matematis sama dengan jawaban J Bs. Ini menghasilkan 6 panjang dan menyatakan bahwa 2 terbesar adalah sama dan bahwa 4 terkecil sama. Input harus berupa array array.
sumber
PHP,
161158 karakterBukti (1x1): http://codepad.viper-7.com/ZlBpOB
Ini didasarkan pada jawaban JavaScript eBuisness .
sumber
JavaScript 1.8, 112 karakter
Pembaruan: menyimpan 2 karakter dengan melipatgandakan pemahaman array.
Implementasi lain dari jawaban JB. Mengeksploitasi fitur JavaScript 1.7 / 1.8 (penutupan ekspresi, pemahaman array, tugas penataan). Juga penyalahgunaan
~~
(bitwise bukan operator) untuk memaksaundefined
ke numerik, dengan paksaan array-to-string dan regexp untuk memeriksa bahwa jumlah panjangnya adalah[4, 8, 4]
(diasumsikan bahwa tepat 4 poin dilewatkan). Penyalahgunaan operator koma adalah trik C kuno yang dikaburkan.Tes:
sumber
GoRuby - 66 karakter
diperluas:
Algoritma yang sama dengan jawaban JB .
Tes seperti:
Output
true
untuk true dan blank untuk falsesumber
ruby -r ./golf-prelude.rb FILE_TO_RUN.rb
dan itu akan bekerja sama persis.sort
sebelumnyagroup_by
..sort.group_by {...}
harus ditulis sebagai.group_by {...}
Python 97 (tanpa poin kompleks)
Ini akan mengambil daftar tupel titik dalam [(x, y), (x, y), (x, y), (x, y)] dalam urutan apa pun, dan dapat menangani duplikat, atau jumlah poin yang salah. TIDAK memerlukan poin kompleks seperti jawaban python lainnya.
Anda dapat mengujinya seperti ini:
Ini akan membutuhkan sedikit penjelasan, tetapi gagasan keseluruhan adalah bahwa hanya ada tiga jarak antara titik-titik dalam kotak (Sisi, Diagonal, Nol (titik dibandingkan dengan dirinya sendiri)):
Untuk menyimpan karakter kode saya adalah:
Saya khawatir seseorang dapat menemukan test case yang memecahkan ini. Jadi tolong lakukan dan saya akan benar. Misalnya fakta saya hanya memeriksa tiga jarak, bukannya melakukan abs () dan memeriksa panjang sisi dan sisi miring, sepertinya kesalahan.
Pertama kali saya mencoba kode golf. Berbaik hatilah jika aku melanggar aturan rumah.
sumber
Clojure, 159 karakter.
Sunting: Untuk juga menjelaskan sedikit.
(Catatan: rooting persegi tidak diperlukan dan karenanya dalam kode yang disimpan di atas.)
sumber
C #, 107 karakter
Di mana poin adalah Daftar Vector3D yang berisi poin.
Menghitung semua jarak yang dikuadratkan di antara semua titik, dan jika ada tepat tiga jenis berbeda (harus 0, beberapa nilai a, dan 2 * a) dan 4 titik berbeda maka titik-titik tersebut membentuk kuadrat.
sumber
Python, 66
Meningkatkan jawaban kuda kertas dari 76 menjadi 66:
sumber
Python 2 , 49 byte
Cobalah online!
Mengambil daftar empat bilangan kompleks sebagai input. Putar setiap titik 90 derajat di sekitar rata-rata, dan periksa bahwa setiap titik yang dihasilkan ada dalam daftar asli.
Panjang yang sama (meskipun menggunakan Python 3 lebih pendek
{*l}
).Cobalah online!
sumber
^
bisa digunakan sebagai ganti==
.Bahasa Wolfram (Mathematica) ,
3231 byteCobalah online!
Mengambil daftar poin yang diwakili oleh bilangan kompleks, menghitung momen pusat kedua dan ketiga, dan memeriksa bahwa keduanya nol.
Tidak golf:
atau
bukti
Kriteria ini bekerja pada seluruh bidang kompleks, bukan hanya pada bilangan bulat Gaussian .
Pertama, kami mencatat bahwa momen sentral tidak berubah ketika poin diterjemahkan bersama. Untuk satu set poin
semua momen sentral tidak tergantung
c
(itulah sebabnya mereka disebut sentral ):Kedua, momen sentral memiliki ketergantungan sederhana pada penskalaan kompleks keseluruhan (penskalaan dan rotasi) dari himpunan titik:
Ini berarti bahwa jika momen pusat adalah nol, maka penskalaan dan / atau memutar himpunan titik akan menjaga momen pusat sama dengan nol.
Ketiga, mari kita buktikan kriteria untuk daftar poin di mana dua poin pertama ditetapkan:
Dalam kondisi apa sajakah bagian nyata dan imajiner dari momen pusat kedua dan ketiga nol?
Semua dari enam solusi ini mewakili kuadrat: Oleh karena itu, satu-satunya cara agar daftar titik dari formulir
{0, 1, x[3] + I*y[3], x[4] + I*y[4]}
dapat memiliki nol momen pusat kedua dan ketiga adalah ketika empat poin membentuk persegi.Karena properti terjemahan, rotasi, dan penskalaan yang ditunjukkan dalam poin 1 dan 2, ini berarti bahwa setiap saat momen pusat kedua dan ketiga adalah nol, kami memiliki kotak dalam beberapa kondisi terjemahan / rotasi / penskalaan. ∎
generalisasi
Momen sentral k-th dari n-gon reguler adalah nol jika k tidak dapat dibagi oleh n. Cukup dari kondisi ini harus dikombinasikan untuk membuat kriteria yang cukup untuk mendeteksi n-gon. Untuk kasus n = 4 sudah cukup untuk mendeteksi nol dalam k = 2 dan k = 3; untuk mendeteksi, misalnya, segi enam (n = 6) mungkin perlu untuk memeriksa k = 2,3,4,5 untuk nol. Saya belum membuktikan yang berikut, tetapi curiga bahwa itu akan mendeteksi n-gon biasa:
Tantangan kode pada dasarnya adalah kode ini khusus untuk daftar panjang-4.
sumber
J,
31 29 2726memeriksa apakah 8 jarak terkecil antara titik adalah sama.memeriksa apakah ada tepat tiga jenis jarak antara titik (nol, panjang sisi dan panjang diagonal).4 2 $
adalah cara menulis array di J.sumber
Smalltalk untuk 106 karakter
di mana p adalah kumpulan poin, misalnya
Saya pikir matematika itu sehat ...
sumber
Mathematica, 123 karakter (tetapi Anda bisa berbuat lebih baik):
Di mana 'a' adalah input dalam formulir daftar Mathematica, misalnya:
a={{0,0},{3,4},{8,4},{5,0}}
Kuncinya adalah melihat titik produk antara semua vektor dan perhatikan bahwa mereka harus memiliki tepat tiga nilai: 0, x, dan 2 * x untuk beberapa nilai x. Produk titik memeriksa baik tegak lurus DAN panjangnya dalam satu gelombang besar.
Saya tahu ada cara pintas Mathematica yang bisa membuat ini lebih pendek, tapi saya tidak tahu apa itu.
sumber
Union
alih-alihSort@DeleteDuplicates
. Saya menempatkan 3 baris Anda bersama-sama juga:#[[1]] == 0 && #[[3]]/#[[2]] == 2 &[ Union@Abs@Flatten[Table[c.d, {c, #}, {d, #}]] &[ Flatten[Table[x - y, {x, a}, {y, a}], 1]]]
Haskell, "wc -c" melaporkan 110 karakter. Tidak memeriksa apakah input memiliki 4 elemen.
Saya diuji
sumber