Dalam tantangan ini, Anda akan diberikan daftar poin. Titik-titik ini terletak pada perimeter persegi imajiner . Tujuan Anda adalah untuk:
- Jika memungkinkan, cetak rotasi kotak, yang akan menjadi nilai dari [0, 90) di mana 0 mewakili kotak dengan garis vertikal dan horizontal. Rotasi diberikan dalam derajat yang dihitung berlawanan arah jarum jam.
- Jika rotasi kuadratnya ambigu (misalnya hanya diberi 2 poin), cetak "Tidak Dikenal"
- Jika membuat kuadrat dengan poin tidak mungkin, cetak "Tidak Mungkin"
Poin yang Anda berikan dijamin unik, dan tidak ada urutan tertentu. Anda dapat menggunakan format apa pun yang ingin Anda masukkan dalam daftar, tetapi untuk contoh saya, poin saya akan berada dalam format x,y
, dan dipisahkan dengan ruang. Angka-angka tersebut adalah angka floating-point, dan Anda dapat mengasumsikan angka-angka itu berada dalam rentang yang dapat ditangani oleh bahasa Anda. Output Anda harus akurat untuk setidaknya 3 tempat desimal, dan anggap bahasa Anda menangani angka floating point dengan akurasi sempurna.
Berikut adalah beberapa kasus uji (saya telah membuat sebagian besar dari ini menggunakan bilangan bulat untuk memudahkan visualisasi, tetapi program Anda harus menangani poin mengambang):
Tidak dikenal:
0,0
0,0 1,0
0,0 1,0 0,1
0,0 1,0 0,1 1,1
0,1 0,2 1,0 1,3 2,0 2,3 3,1 3,2
Mustahil:
0,0 1,0 2,0 3,1 4,2
0,0 1,0 2,0 1,1
0,1 0,2 1,0 1,3 2,0 2,3 3,1 3,2 2,2
2,0 0,1 2,2 0,3
0,0 2,1 0,2 2,2 -1,1
Kemungkinan (jika tidak ditunjuk, harus mengembalikan 0):
0,0 1,0 2,0
0,0 0.3,0.3 0.6,0.6 (should return 45)
0,0 0.1,0.2 0.2,0.4 (should return appx 63.435 (the real value is arctan(2)))
0,0 0,1 2,1 2,2
0,1 0,2 1,0 1,4 2,0 2,4 4,1 4,3
Saya mungkin telah melewatkan beberapa kasus uji yang menarik. Jika demikian, beri komentar untuk menambahkannya.
Ini kode-golf, jadi kode terpendek menang!
Jawaban:
Rev 1: Ruby, 354 bytes
bermain golf lebih lanjut berkat blutorange.
Ruby, 392 byte
Algoritma adalah sebagai berikut:
-Klik titik arbitrer (yang pertama) dan pindahkan ke titik asal (kurangi koordinat titik ini dari semua titik dalam daftar.)
-Cobalah semua rotasi persegi tentang asal dalam peningkatan 0,001 derajat, hingga 360 derajat.
-Untuk rotasi tertentu, jika semua titik berada di atas sumbu y, gambarkan kotak terkecil yang mungkin di sekitar semua titik, dengan memasukkan titik terendah dan paling kiri.
-Periksa apakah semua titik ada di tepi. Ini dilakukan dengan perhitungan lembut yang mengambil setiap titik, menemukan jarak kuadrat dari semua tepi, dan mengalikannya bersama. Ini memberikan kecocokan yang baik daripada jawaban ya / tidak. Ditafsirkan bahwa suatu solusi ditemukan jika produk ini dibagi dengan panjang sisi ^ 8 kurang dari 1E-9. Dalam praktiknya ini kurang dari satu derajat toleransi.
-Sesuaian terbaik diambil mod 90 derajat dan dilaporkan sebagai sudut yang benar.
Saat ini kode mengembalikan nilai ambigu jika lebih dari 100 solusi ditemukan (pada resolusi 0,001 derajat. Itu 0,1 derajat toleransi.)
fungsi sepenuhnya bekerja pertama, dalam program uji
Saya meninggalkan resolusi pada 1/10 resolusi yang diperlukan untuk membuat kecepatan masuk akal. Ada kesalahan 0,01 degress pada kasus uji terakhir.
versi golf, sesuai dengan spesifikasi, membutuhkan sekitar satu menit per panggilan, dalam program uji.
Masih ada kesalahan sial 0,001 derajat pada test case terakhir. Meningkatkan resolusi lebih lanjut mungkin akan menghilangkannya.
Perhatikan bahwa untuk sekitar 30% lebih banyak kode, algoritma ini dapat diadaptasi untuk bekerja dengan cepat: jelas bahwa dalam kasus dengan sejumlah solusi terbatas, salah satu ujungnya terletak rata di sepanjang kubus, jadi yang harus kita coba adalah sudut-sudut itu yang sesuai dengan setiap pasangan simpul. Anda juga perlu melakukan sedikit gerak-gerik untuk memeriksa tidak ada banyak solusi yang tak terhingga.
sumber
0,0 1,0 2,0 1,2
masih memungkinkan untuk kuadrat 0,0 diagonal ... 2,2. Saya sudah mencoba itu, dan juga0,0 1,0 2,0 1,1
(yang terakhir memang tidak mungkin.) Poin lain: apakah Anda menganggap itu dapat diterima atau tidak dapat diterima bahwa kode saya mengembalikan tidak mungkin daripada tidak diketahui ketika hanya satu titik yang diberikan? Saya akan menghargai jawaban sebelum mulai bermain golf.1,1
. Tidak yakin bagaimana1,2
sampai di sana. Itu tidak bisa diterima.if..end
karena saya memiliki masalah besar dengan operator ternary yang bersarang di Ruby. Saya melihat Anda mengatasinya dengan menggunakan&&
.Perl
Halo, ini pertanyaan saya yang sederhana. Kasing uji dimasukkan ke dalam aliran DATA di bagian bawah file. Algoritma telah berkembang dengan pendekatan try-error.
Saya akui bahwa ini adalah pendekatan heuristik yang luas, tetapi sangat cepat: ia menyelesaikan semua kasus secara instan .
Saya sadar akan ada beberapa bug, tetapi sampai sekarang memberikan jawaban yang benar untuk semua kasus uji.
Saya juga sadar bahwa kode terpendek menang, tetapi saya yakin ini adalah yang terpendek dalam arti tercepat istilah tersebut.
Di sini adalah algoritma
memeriksa titik-titik dan untuk setiap segmen antara dua titik, catatan kemiringan, panjang, x-intersep, y-intersep
temukan garis lurus (yaitu tiga titik atau dua segmen yang berdekatan) dan kemiringan yang mungkin berbeda (katakanlah rotasi). Melacak segmen terpanjang yang tersedia di setiap baris.
temukan semua jarak antara segmen dan titik ketiga (ini harus digunakan untuk titik 4). Melacak jarak minimum non-nol.
untuk empat titik (kasar persegi panjang) temukan titik dalam
Tampilkan solusi:
A. Katakan "Tidak Mungkin" jika ada satu atau lebih titik dalam.
B. Satu Baris:
Jika sebagian besar titik dalam satu garis tanpa titik dalam, ucapkan "Kemungkinan"
Jika titik terlalu dekat dengan garis, katakan "Tidak Mungkin"
C. Dua baris:
Ucapkan "Kemungkinan" saat hanya ada satu rotasi yang memungkinkan
Katakan "Tidak Mungkin" ketika ada lebih dari satu rotasi
D. Tanpa garis: temukan rotasi yang sesuai dengan segmen rotasinya 90 °
Katakan "Kemungkinan" jika hanya satu yang cocok atau sebanyak titik yang cocok.
Katakan "Mustahil" jika lebih dari satu cocok dan tidak sebanyak titik
Katakan "Tidak Diketahui" jika rotasi sesuai.
Ini kodenya (semua bug yang diketahui sudah diatasi)
Dan ini dia ouptutnya
Salam.
Matteo.
sumber