वह कोण क्या है?


12

इस चुनौती का लक्ष्य एक छवि में एक पंक्ति के कोण को निर्धारित करना है।

छवि पर नियम:

  • छवि की पृष्ठभूमि सफेद होगी ( #FFFFFF)
  • लाइन का स्ट्रोक काला होगा ( #000000)
  • लाइन अलियास विरोधी नहीं होगी
  • इमेज 100x100 पिक्सल की होगी
  • रेखा छवि के केंद्र में शुरू होगी
  • लाइन नीचे इंगित करना शुरू कर देगी (6-OClock)
  • लाइन 50 पिक्सल लंबी होगी
  • लाइन का कोण प्रारंभिक स्थिति से वामावर्त मापा जा रहा है
  • छवि कोडेक .jpgया तो होगा.png

इनपुट प्रारूप कमांड लाइन arg, स्क्रिप्ट इनपुट या फ़ंक्शन arg द्वारा पारित एक फ़ाइल नाम होगा। आउटपुट स्वरूप सरल है - बस डिग्री की संख्या (उदाहरण के लिए 90) का आउटपुट करें ।

उत्तर दिए गए माप के ± 1 डिग्री हो सकते हैं। यहाँ कुछ उदाहरण चित्र दिए गए हैं:

1

ग्रे पृष्ठभूमि के साथ 45 डिग्री पर एक संदर्भ छवि

1

0 डिग्री है

2

45 डिग्री से

3

50 डिग्री से

4

130 डिग्री से

6

230 डिग्री से

7

324 डिग्री से

यहाँ छवियों को बनाने के लिए उपयोग किया जाने वाला कोड है (यह प्रसंस्करण के साथ कोडित है ):

int deg = 45;

int centX = width/2, centY = height/2;

background(255);
noSmooth();
line(centX,
     centY,
     centX + sin(radians(deg))*50,
     centY + cos(radians(deg))*50);

saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'

1
क्या मुझे नीचा दिखाया गया? यदि ऐसा है तो मतदाता क्यों विस्फोट कर सकता है?
J Atkin

क्या हम इसे केवल प्रदर्शित कर सकते हैं, न कि किसी फ़ाइल में सहेज सकते हैं?
ev3commander

यकीन है, कि कैसे अन्य सभी जवाब यह करते हैं। कंसोल पर प्रिंट करें जवाब आपके प्रोग्राम को उत्पन्न करता है।
J Atkin

1
@Jtkin मैं आम तौर पर उखाड़ी गई पोस्ट पर डाउनवोट्स के बारे में चिंता नहीं करता। c: हम सब मिल गया।
Addison Crump

ओह मैं समझा। मुझे आश्चर्य है कि मुझे एक क्यों मिला ...
जे एटकिन

जवाबों:


7

पायथ - 28 26 बाइट्स

जेएस उत्तर के रूप में समान बल की रणनीति का उपयोग करता है।

f!@F+]'zm+50s*48.t.tT7d_U2

स्टड से फ़ाइल नाम के रूप में इनपुट लेता है।

f                     Filters from 1 till predicate is matched
 !                    Boolean not so that only pixel with zero value matched
  @F+]                Folds by indexing to get pixel value  
   'z                 Reads image filename input
   m         _U2      Maps over both trig ratios
    +50               Adds 50 to pixel value
     *48              Multiplies pixel value by 48
      .t    d         Takes trig ratio with appropriate option
        .t 7          Degrees to radians
          T           Filter var

वाह, यह अच्छा है, लेकिन मैं अजगर नहीं बोलता। क्या आप एक स्पष्टीकरण जोड़ना चाहेंगे?
जे एटकिन

1
काश जावास्क्रिप्ट दूसरी तरफ एक ही बाइट गिनती होती।
०'

@insertusernamehere काश मैं ग्रूवी या स्काला इस तरह की गोल्फिंग कर सकता था।
J Atkin

@JAtkin स्पष्टीकरण जोड़ा गया। यदि आपके कोई प्रश्न हैं, तो चैट पर मुझे संदेश देने के लिए स्वतंत्र महसूस करें।
माल्टीसेन

9

जावास्क्रिप्ट (ईएस 6), 225 227 244 बाइट्स

आइए गेंद को लुढ़काएँ:

f=s=>{(i=new Image).src=s;c=document.createElement`canvas`.getContext`2d`;c.drawImage(i,0,0,100,100);for(a=360;a--,r=a/180*(m=Math).PI;)if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){alert((450-a)%360);break}}

बस समारोह में छवि का URL पास करें:

f('90deg.png');

। 1 रेंज के भीतर अलर्ट की डिग्री। सभी परीक्षण मामलों को पारित किया।

Ungolfed

f=s=>{
    // create new image and set source
    (i=new Image).src=s;
    // create canvas and get context
    c=document.createElement`canvas`.getContext`2d`;
    // set width/height to 100px and draw image on canvas
    c.drawImage(i,0,0,100,100);
    // check whether for any degree on the theoretical circle a black pixel is found
    for(a=360;a--,r=a/180*(m=Math).PI;)
        if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){
            // wait, it should be ccw and the board is rotated 90 degrees
            alert((450-a)%360);
            break
        }
}

संपादित करता

  • सहेजे गए 17 बाइट्स - लगा कि मुझे कैनवास तत्व की चौड़ाई और ऊंचाई निर्धारित करने की आवश्यकता नहीं है।
  • स्थिति की उपेक्षा करके 2 बाइट्स को बचाया

मुझे लगता है कि यह काम करना चाहिए (यह परीक्षण नहीं किया है)। 206 बाइट्स:s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
user81655

1
यह कोड काम करता है क्योंकि आप भाग्यशाली हैं। कैनवास लगभग हर बार दागी जाएगा। के साथ विशेष रूप से file://। आपको crossOriginसंपत्ति सेट करने की आवश्यकता है । इसके अलावा, यह काम नहीं करेगा यदि छवि लोड करने में कैनवास बनाने से अधिक 0.00001 सेकंड लगते हैं। इसके अलावा, आपको f=2 बाइट्स काटने की आवश्यकता नहीं है । लेकिन यह वास्तव में एक अच्छा समाधान है !!! इसके लिए मेरा उत्थान।
इस्माइल मिगुएल

@IsmaelMiguel आपकी विस्तृत प्रतिक्रिया के लिए धन्यवाद। आप कैनवास के बारे में सही हैं। शुरुआत में मैंने छवि को घुमाने और दर्पण बनाने की कोशिश की, ताकि कोण को बदलने की आवश्यकता न हो। आप इसे अलविदा कह सकते हैं! धुंधली हो गई, सही पिक्सेल नहीं मिला। मैंने उस onloadभाग को छोड़ दिया है क्योंकि मैं उस वजह से एक और चुनौती में था। इसलिए मैंने सोचा कि यह ठीक है कि यह काफी तेजी से लोड होता है। अनाम फ़ंक्शन के बारे में मुझे यकीन नहीं है कि इसे कैसे गिना जाए। अगर मैं काट देता f=हूं और मैं इसे लागू करना चाहता हूं तो मुझे इसे ()पसंद करना होगा (s=>{})('arg');। क्या मैं बाइट की गिनती में इसे अनदेखा कर सकता हूं?
सम्मिलित

@insertusernamehere हाँ, आप बाइट की गणना को अनदेखा कर सकते हैं। लेकिन आपको यह निर्दिष्ट करना होगा कि यह एक अनाम फ़ंक्शन है
इस्माइल मिगुएल

5

मतलाब, 118 104 बाइट्स

मैं जटिल संख्याओं (केंद्र में 0) के साथ छवि के समान आकार का एक मैट्रिक्स उत्पन्न करता हूं और उस मैट्रिक्स से एक्सट्रैक्ट करता हूं जो लाइन पर हैं। उन के माध्य का तर्क तब प्रदर्शित किया जाता है।

सटीकता में सुधार का सुझाव देने के लिए @ThomasKwa को धन्यवाद, जिसके परिणामस्वरूप छोटे कोड भी आए !!!

I=imread(input('','s'));
[y,x]=ndgrid(-50:49);
c=y+i*x;
disp(mod(angle(mean(c(~I(:,:,1))))*180/pi+360,360))

1
क्या लाइन के सभी बिंदुओं के माध्य का तर्क खोजना कम होगा?
23

वाह, यह मेरे जवाब की अपेक्षा बहुत कम है, अच्छा काम!
J Atkin

@ThomasKwa बिल्कुल, लेकिन फिर यह उतना सटीक नहीं होगा, क्योंकि केंद्र के करीब पिक्सेल बिल्कुल गलत हैं। यदि आप कोशिश करना चाहते हैं, तो आप इस कोड को ऑक्टेव में भी चला सकते हैं, मुझे लगता है!
23

माध्य का तर्क (जो लाइन के केंद्र के तर्क को बहुत अच्छी सटीकता के लिए देना चाहिए), तर्क का मतलब नहीं। मुझे नहीं पता कि सटीकता स्वीकार्य होगी या नहीं।
lirtosiast

1
@ThomasKwa महान विचार, धन्यवाद! सटीकता अब और भी बेहतर है और कोड कुछ बाइट्स छोटा है =)
त्रुटी

5

मतलाब, 86 77 बाइट्स

यहाँ Matlab का उपयोग करने का एक और तरीका है:

[I,J]=find(~im2bw(imread(input('','s'))));mode(mod(round(atan2d(J-51,I-51)),360))

यह फ़ाइल को पढ़ता है ( त्रुटिपूर्ण से चोरी ), और ब्लैक पिक्सल्स के सूचकांकों को खोजता है। फिर, यह वेक्टर को काम करता है जो छवि के केंद्र से प्रत्येक ब्लैक पिक्सेल पर इंगित करता है, और atan2dकोण को खोजने के लिए उपयोग करता है, पूर्णांक कोण प्राप्त करने के लिए, और mod(...,360)सही सीमा में परिणाम प्राप्त करने के लिए कर रहा है। सही कोण प्राप्त करने के लिए (केंद्र के करीब पिक्सेल के लिए थोड़ी सी त्रुटि है), सबसे अधिक गणना वाले कोण को लें।

सुझाव के लिए slvrbld के लिए धन्यवाद im2bw!


1
[I, J] = find (~ im2bw (imread (इनपुट) ('))) के साथ मोड (...) से पहले वाले हिस्से को बदलकर आपका कोड 77 बाइट्स तक घटाया जा सकता है ;
slvrbld

अच्छा है! धन्यवाद मुझे यकीन है कि वहाँ एक तरीका है कि और अधिक आसानी से कर रहा था, लेकिन इसे याद नहीं कर सका।
डेविड

3

लैबव्यू, 10098 बाइट्स

चलो वहाँ एक और labview कोड डालते हैं।

चूंकि लैबव्यू में बाइट्स को गिनने का कोई आधिकारिक तरीका नहीं है इसलिए मैं सहेजे जाने पर फ़ाइल के आकार का उपयोग करता हूं। वैकल्पिक रूप से प्रत्येक तार और फ़ंक्शन को 1 और गिनती के रूप में 2 के रूप में मामले में यह 71 तक आ जाएगा।

1

लोड छवि, 1 डी पर समतल करें, दोनों पक्षों से 0s के लिए स्कैन करें और पहले, कैल्क को वापस बिंदु पर ले जाएं और कोण प्राप्त करने के लिए ज्यामिति का उपयोग करें।


1
अच्छा लगा, यह दिलचस्प है। आप मेटा पर पूछना चाहते हैं कि लैबव्यू प्रोग्राम कैसे स्कोर करें।
J Atkin

वहाँ पहले से ही कैसे स्कोर करने के लिए पर एक धागा है, लेकिन दुर्भाग्य से वहाँ अभी तक कोई जवाब नहीं है
Eumel

ओह मैं समझा। मैं सिर्फ बाइट ए के अमेरिका में करने के लिए और अधिक समझ में आता है गिनती करने के लिए अपनी पोस्ट संपादित
जम्मू एटकिन

@JAtkin एक यूरोपीय साथी के रूप में यह मुझे मेरे सिर खरोंच कर दिया, सोच रहा था कि वह बाइट के उन अंशों को कैसे मिला। एक जगह का उपयोग सभी पक्षों कृपया नहीं होगा?
आरोन

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