Membagi kuadran pertama (termasuk sumbu x positif, sumbu y positif, dan asal) menjadi kisi 1x1, dengan setiap kisi diberi label oleh koordinat sudut kiri bawahnya, seperti yang ditunjukkan di bawah ini:
Perhatikan bahwa setiap kisi berisi batas dan simpulnya. Menggunakan simbol matematika, kotak berlabel (m, n) akan mewakili kuadrat {(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}
.
Diberikan garis lurus dalam bentuk ax+by+c=0
dengan bilangan bulat a
,, b
dan c
, dan sebuah kisi yang diwakili oleh (m,n)
, output apakah garis tersebut melewati kisi, yaitu apakah ada titik pada kisi yang diberikan pada garis tersebut.
a b c m n output
1 1 0 0 0 true
1 1 0 1 1 false
1 1 0 0 2 false
1 1 -3 0 1 true
1 1 -3 0 0 false
2 -1 0 1 1 true
2 -1 0 1 0 false
2 -1 0 0 2 true
2 -1 0 0 1 true
2 -1 0 1 2 true
2 0 -1 0 0 true
2 0 -1 0 1 true
2 0 -1 0 2 true
2 0 -1 1 0 false
2 0 -1 1 1 false
0 2 -1 0 0 true
0 2 -1 1 0 true
0 2 -1 2 0 true
0 2 -1 0 1 false
0 2 -1 1 1 false
1 0 -1 0 0 true
1 0 -1 0 1 true
1 0 -1 0 2 true
1 0 -1 1 0 true
1 0 -1 1 1 true
Harap sarankan lebih banyak testcases di komentar.
Ini adalah kode-golf . Jawaban terpendek dalam byte menang. Celah standar berlaku.
code-golf
geometry
decision-problem
Biarawati Bocor
sumber
sumber
[a, b, c]
(baris) dan[m, n]
(kotak)?Jawaban:
Python 3,
8466 byteGolf pertama, kegagalan pertama (mungkin).
Terima kasih kepada Rod untuk mencukur 18 byte dengan menggunakan fungsi alih-alih input langsung.
Cobalah online!
Penjelasan:
Pada dasarnya kita menghitung nilai fungsi garis untuk m dan m + 1, jika n adalah di antara nilai-nilai, maka daftar harus melewati itu di beberapa titik. Akan jauh lebih baik jika bahasa memiliki cara yang lebih sederhana untuk memasukkan banyak bilangan bulat.
sumber
b
ini0
.Jelly , 10 byte
Cobalah online!
Latar Belakang
Seperti jawaban lain sebelum saya, ini bergantung pada kenyataan bahwa garis lurus membagi pesawat menjadi dua semi-pesawat. Persegi panjang terkandung dalam salah satu dari semi-pesawat ini (tidak ada persimpangan dengan garis) atau memotong kedua semiplane (dan dengan demikian garis yang memisahkannya).
Bagaimana itu bekerja
sumber
Python 2 , 59 byte
Cobalah online!
Kita dapat mengetahui sisi mana dari sebuah titik dengan tanda
a*x+b*y+c
. Garis melewati kotak (menghitung sentuhan) kecuali keempat simpul(m,n),(m,n+1),(m+1,n),(m+1,n+1)
benar-benar di sisi yang sama dari garis. Kita bisa pasang nilai-nilai ini di ekstrak keluar konstantaa*m+b*n+c
yang muncul di keempat:Jadi, garis melewati kuadrat kecuali keempat nilai ini semuanya positif atau semuanya negatif. Jadi, cukup untuk minimum
<=0
dan maksimum>=0
.Mengurangi kesamaan
a*m+b*n+c
dari setiap bagian memberikan kode.Pendekatan yang sedikit lebih lama adalah untuk memeriksa apakah set tanda (+, 0, -) memiliki panjang setidaknya 2.
Python 2 , 62 byte
Cobalah online!
sumber
Mathematica,
6055 byte-5 byte byte ke @MartinEnder
formulir input
sumber
Solve
fungsi ...Batch, 66 byte
Penjelasan: Kami mempertimbangkan nilai-nilai yang diambil oleh persamaan di empat sudut sel. Jika garis tidak memotong sel, maka keempat nilai memiliki tanda yang sama, tetapi jika itu memotong sel, maka setidaknya satu nilai akan menjadi nol atau tanda yang berlawanan. Perbandingan disederhanakan dengan mengalikan pasangan sudut yang berlawanan, maka jika kedua nilai positif maka garis tidak memotong sel. Beberapa bit-twiddling kemudian mengubah perkalian menjadi hasil keseluruhan.
sumber
Mathematica, 50 byte
Cobalah online!
Diambil
m, n, c, a, b
sebagai input dalam urutan itu.Penjelasan:
Tuples@{{#,#+1},{#2,#2+1}}
buatlah daftar koordinat dari empat sudut alun-alun, kemudian ambil produk titik dengan.{##4}
(yang berarti{#4, #5}
) dan tambahkan+#3
perhitunganax + by + c
untukx,y
di setiap sudut. Jika garis melewati titik, ini nol; jika garis lebih jauh dari titik asal, itu negatif; dan jika garis lebih dekat ke titik asal, itu positif - karena itu kami memeriksaSign
s dari empat nilai ini. Garis melewati di luar kotak jika dan hanya jika keempat nilai 1 atau keempat adalah -1, jadi kami memeriksa bahwa jumlah mereka benar-benar antara -4 dan 4.(Jawaban ini agak terinspirasi oleh jawaban saya untuk pertanyaan ini .)
sumber
Python 2,
147110 byteDan terima kasih banyak untuk Leaky Nun!
TIO.
sumber
Python , 54 byte
Cobalah online!
(Terima kasih kepada xnor untuk skrip pengujian.)
Bagaimana itu bekerja
Garis melewati m + 1/2 + x , n + 1/2 + y jika dan hanya jika
a ⋅ ( m + 1/2 + x ) + b ⋅ ( n + 1/2 + y ) + c = 0
⇔ 2⋅ ( a ⋅ m + b ⋅ n + c ) + a + b = −2⋅ a ⋅ x - 2⋅ b ⋅ y .
Ini mungkin untuk beberapa | x |, | y | ≤ 1/2 jika dan hanya jika | 2⋅ ( a ⋅ m + b ⋅ n + c ) + a + b | ≤ | a | + | b |.
sumber
Java (OpenJDK 8) , 71 byte
Cobalah online!
Port solusi Python xnor.
Solusi asli, menggunakan persimpangan bentuk / garis Java (108 byte)
Cobalah online!
Kredit
sumber