क्या यह रेखा उस वर्ग से होकर गुजरती है?


19

नीचे दिखाए गए अनुसार, प्रत्येक ग्रिड को 1x1 ग्रिड में पॉजिटिव x- एक्सिस, पॉजिटिव y- एक्सिस, और ओरिजिन) में विभाजित करें, इसके नीचे-बाएँ कोने के निर्देशांक द्वारा लेबल किए गए प्रत्येक ग्रिड के साथ:

ध्यान दें कि प्रत्येक ग्रिड में इसकी सीमाएँ और उसके कोने हैं। गणितीय प्रतीकों का उपयोग करते हुए, लेबल किया गया ग्रिड (m, n) वर्ग का प्रतिनिधित्व करेगा{(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}


के रूप में एक सीधी रेखा को देखते हुए ax+by+c=0पूर्णांकों के साथ a, b, और c, और एक ग्रिड का प्रतिनिधित्व करती (m,n)लाइन ग्रिड, यानी कि क्या दिया ग्रिड में किसी भी बिंदु लाइन पर है के माध्यम से गुजरता है, उत्पादन।


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

कृपया टिप्पणियों में और अधिक वृषण का सुझाव दें।


यह । बाइट्स जीत में सबसे छोटा जवाब। मानक खामियां लागू होती हैं।


1
निश्चित रूप से हमें यह मान लेना चाहिए कि a और b दोनों 0 नहीं हैं, तब से यदि c शून्य है तो अनंत रेखाएं हो सकती हैं जबकि यदि c गैर-शून्य है तो वहां कोई रेखा नहीं हो सकती है।
एर्ग आउटफोलर

क्या मुझे दो या अधिक सरणियों के रूप में इनपुट मिल सकता है, [a, b, c](रेखा) और [m, n](वर्ग)?
आउटगोल्फ

@EriktheOutgolfer मुझे आश्चर्य है कि मेटा में नहीं है।
लीक नून


जवाबों:


5

पायथन 3, 84 66 बाइट्स

पहला गोल्फ, पहला फेल (शायद)।

प्रत्यक्ष इनपुट के बजाय एक फ़ंक्शन का उपयोग करके 18 बाइट्स को बंद करने के लिए रॉड का धन्यवाद।

def f(a,b,c,m,n):f=-(a*m+c)/b;g=f-a/b;print(min(f,g)<=n<=max(f,g))

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण:

मूल रूप से हम m और m + 1 के लिए लाइन फ़ंक्शन के मूल्य की गणना करते हैं, यदि n मानों की इनबिल्ट है, तो सूची को किसी बिंदु पर इसके माध्यम से गुजरना होगा। बेहतर होगा यदि भाषा में कई पूर्णांकों को इनपुट करने का सरल तरीका था।



2
PPCG में आपका स्वागत है!
२२

1
क्या यह n + 1 के साथ-साथ m + 1 के खिलाफ जाँच करने की आवश्यकता नहीं है?
नील

3
जब bहै तब शून्य से भाग करें 0
ओलिवियर ग्रेगोइरे

इसके अलावा, यह लीक नन द्वारा उजागर किए गए कई परीक्षण मामलों को पारित नहीं करता है ।
ओलिवियर ग्रेजायर

5

जेली , 10 बाइट्स

ż‘{Œpæ.ṠE¬

इसे ऑनलाइन आज़माएं!

पृष्ठभूमि

खदान से पहले अन्य उत्तरों की तरह, यह इस तथ्य पर निर्भर करता है कि एक सीधी रेखा विमान को दो अर्ध-विमानों में विभाजित करती है। आयत या तो इन सेमी-प्लेन (लाइन के साथ कोई चौराहा) में से एक में निहित है या दोनों सेमीप्लेन (और इस तरह उन्हें अलग करने वाली लाइन) को इंटरसेक्ट करती है।

यह काम किस प्रकार करता है

ż‘{Œpæ.ṠE¬  Main link. Left argument: [m, n]. Right argument: [a, b, c]

 ‘{         Increment left; yield [m+1, n+1].
ż           Zipwith; yield [[m, m+1], [n, n+1]].
   Œp       Cartesian product; yield [[m, n], [m, n+1], [m+1, n], [m+1, n+1]].
     æ.     Take the dot products with [a, b, c], mapping each [x, y] to ax+by+c.
       Ṡ    Take the signs.
        E   Test the signs for equality.
         ¬  Logical NOT.

4

अजगर 2 , 59 बाइट्स

lambda a,b,c,m,n:min(0,a,b,a+b)<=-a*m-b*n-c<=max(0,a,b,a+b)

इसे ऑनलाइन आज़माएं!

हम बता सकते हैं कि किस बिंदु के किनारे किस बिंदु पर है a*x+b*y+c। जब तक सभी चार कोने (m,n),(m,n+1),(m+1,n),(m+1,n+1)सख्ती से लाइन के एक ही तरफ नहीं होते तब तक लाइन स्क्वायर (टचिंग काउंटिंग) से गुजरती है । हम इन मानों को उन स्थिरांक में निकाल सकते हैं जो a*m+b*n+cचारों में दिखाई देते हैं:

a*m+b*n+c
a*m+b*n+c+a
a*m+b*n+c+b
a*m+b*n+c+a+b

तो, रेखा वर्ग से गुजरती है जब तक कि ये चारों मान सभी सकारात्मक या सभी नकारात्मक नहीं होते हैं। तो, यह उनके न्यूनतम होने <=0और अधिकतम होने के लिए पर्याप्त है >=0

min(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)<=0<=max(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)

आम घटाना a*m+b*n+cप्रत्येक भाग से को कोड देता है।

थोड़ा लंबा दृष्टिकोण यह जांचने के लिए है कि क्या संकेतों के सेट (+, 0, -) की लंबाई कम से कम 2 है।

पायथन 2 , 62 बाइट्स

lambda a,b,c,m,n:len({cmp(a*m+b*n+c,-d)for d in(0,a,b,a+b)})>1

इसे ऑनलाइन आज़माएं!


3

गणितज्ञ, 60 55 बाइट्स

Solve[m#+n#2==-#3&&#4<=m<=#4+1&&#5<=n<=#5+1,{m,n}]!={}&

-5 बाइट्स thanx @MartinEnder को

इनपुट फॉर्म

[क, ख, ग, मी, n]


2
आह, काश हर भाषा में कोई Solveफंक्शन होता ...
एरिक द आउटगॉल्फ

3

बैच, 66 बाइट्स

@cmd/cset/a"q=%1*%4+%2*%5+%3,((-(q+%1)*(q+%2)&-q*(q+%1+%2))>>31)+1

स्पष्टीकरण: हम सेल के चार कोनों पर समीकरण द्वारा लिए गए मानों पर विचार करते हैं। यदि रेखा सेल को इंटरसेक्ट नहीं करती है, तो सभी चार मानों का एक ही चिन्ह है, लेकिन यदि यह सेल को इंटरसेक्ट करता है, तो कम से कम एक मान शून्य या विपरीत चिन्ह होगा। विपरीत कोनों के जोड़े को गुणा करके तुलना को सरल किया जाता है, फिर यदि दोनों मान सकारात्मक हैं तो लाइन सेल को प्रतिच्छेद नहीं करती है। कुछ बिट-ट्विडलिंग तो गुणा को समग्र परिणाम में परिवर्तित करते हैं।


1

गणितज्ञ, 50 बाइट्स

-4<Tr@Sign[Tuples@{{#,#+1},{#2,#2+1}}.{##4}+#3]<4&

इसे ऑनलाइन आज़माएं!

लेता है m, n, c, a, bउस क्रम में इनपुट के रूप में ।

स्पष्टीकरण: Tuples@{{#,#+1},{#2,#2+1}}तो साथ डॉट उत्पाद लेने वर्ग के चारों कोनों के निर्देशांक की एक सूची बनाता है, .{##4}(जो साधन {#4, #5}) और जोड़ने +#3computes ax + by + cके लिए x,yप्रत्येक कोने पर। यदि रेखा बिंदु से गुजरती है, तो यह शून्य है; यदि लाइन मूल से आगे है, तो यह नकारात्मक है; और यदि रेखा मूल के करीब है, तो यह सकारात्मक है - इसलिए हम Signइन चार मूल्यों की जांच करते हैं। रेखा वर्ग के बाहर से गुजरती है यदि और केवल यदि सभी चार मान 1 या सभी चार हैं, तो हम जांचते हैं कि उनकी राशि -4 और 4 के बीच कड़ाई से है।

(यह सवाल इस सवाल के मेरे जवाब से अस्पष्ट रूप से प्रेरित है ।)


1

पायथन 2, 147 110 बाइट्स

def f(a,b,c,m,n):
 if b:d=sorted((-a*x-c)/float(b)for x in(m,m+1));return d[0]-1<=n<=d[1]
 return m<=-c/a<=m+1

और लीक नन का बहुत बड़ा धन्यवाद!

TIO।




@LeakyNun, वाह कमाल!
डैनियल



1

पायथन , 54 बाइट्स

lambda a,b,c,m,n:abs(2*(a*m+b*n+c)+a+b)<=abs(a)+abs(b)

इसे ऑनलाइन आज़माएं!

(परीक्षण स्क्रिप्ट के लिए धन्यवाद xnor।)

यह काम किस प्रकार करता है

लाइन m + 1/2 + x , n + 1/2 + y के माध्यम से होती है यदि और केवल यदि

एक ⋅ ( मीटर + 1/2 + x ) + ⋅ ( n + 1/2 + y ) + = 0
⇔ 2⋅ ( एकमीटर + n + ) + एक + = -2⋅ एकएक्स - 2⋅ y

यह कुछ के लिए संभव है | x |, | y | ≤ 1/2 यदि और केवल यदि | 2⋅ ( एकमीटर + n + ) + एक + | ≤ | | + | बी |


1

जावा (ओपनजेडके 8) , 71 बाइट्स

(a,b,c,x,y)->(0<a?0:a)+(0<b?0:b)<=(x=-a*x-b*y-c)&x<=(0>a?0:a)+(0>b?0:b)

इसे ऑनलाइन आज़माएं!

Xnor के पायथन समाधान का पोर्ट।

मूल समाधान, जावा के आकार / लाइन चौराहे का उपयोग करके निर्मित (108 बाइट्स)

(a,b,c,x,y)->b==0?x<=-c/a&-c/a<=x+1:new java.awt.Rectangle(x,y,1,1).intersectsLine(x,c=(c+a*x)/-b,x+1,c-a/b)

इसे ऑनलाइन आज़माएं!

क्रेडिट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.