एक घुमाए गए आयत का आयाम निर्धारित करें


14

यह स्टैक स्निपेट अपने आयाम, स्थिति, कोण और ग्रिड आयामों के लिए दिए गए काले रंग की पृष्ठभूमि पर एक अलियासाइड सफेद आयत खींचता है :

<style>html *{font-family:Consolas,monospace}input{width:24pt;text-align:right;padding:1px}canvas{border:1px solid gray}</style><p>grid w:<input id='gw' type='text' value='60'> grid h:<input id='gh' type='text' value='34'> w:<input id='w' type='text' value='40'> h:<input id='h' type='text' value='24'> x:<input id='x' type='text' value='0'> y:<input id='y' type='text' value='0'> &theta;:<input id='t' type='text' value='12'>&deg; <button type='button' onclick='go()'>Go</button></p>Image<br><canvas id='c'>Canvas not supported</canvas><br>Text<br><textarea id='o' rows='36' cols='128'></textarea><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>function toCart(t,a,n,r){return{x:t-n/2,y:r/2-a}}function vtx(t,a,n){return{x:n.x+t*Math.cos(a),y:n.y+t*Math.sin(a)}}function sub(t,a){return{x:t.x-a.x,y:t.y-a.y}}function dot(t,a){return t.x*a.x+t.y*a.y}function inRect(t,a,n,r){var e=sub(a,t),o=sub(a,n),l=sub(a,r),i=dot(e,o),v=dot(e,l);return i>0&&i<dot(o,o)&&v>0&&v<dot(l,l)}function go(){var t=parseInt($("#gw").val()),a=parseInt($("#gh").val()),n=parseFloat($("#w").val()),r=parseFloat($("#h").val()),e={x:parseFloat($("#x").val()),y:parseFloat($("#y").val())},o=Math.PI*parseFloat($("#t").val())/180,l=Math.sqrt(n*n+r*r)/2,i=Math.atan2(r,n),v=vtx(l,o+i,e),h=vtx(l,o+Math.PI-i,e),u=vtx(l,o-i,e),x=$("#c");x.width(t).height(a).prop({width:t,height:a}),x=x[0].getContext("2d");for(var s="",c=0;a>c;c++){for(var f=0;t>f;f++)inRect(toCart(f+.5,c+.5,t,a),v,h,u)?(s+="..",x.fillStyle="white",x.fillRect(f,c,1,1)):(s+="XX",x.fillStyle="black",x.fillRect(f,c,1,1));a-1>c&&(s+="\n")}$("#o").val(s)}$(go)</script>
( JSFiddle संस्करण )

पाठ प्रतिनिधित्व में XXजहाँ भी छवि में एक काला पिक्सेल है और ..जहाँ भी सफेद पिक्सेल है। (अगर वे हैं Xऔर यह स्क्वीड दिखता है .।)

एक प्रोग्राम लिखें जो स्निपेट द्वारा निर्मित आयत का पाठ प्रतिनिधित्व लेता है और आयत की अनुमानित चौड़ाई और ऊँचाई को दोनों को वास्तविक चौड़ाई और ऊँचाई के% 7% के भीतर उत्पन्न करता है ।

आपका कार्यक्रम प्रभावी रूप से सभी संभव आयतों के लिए काम करना चाहिए जो स्निपेट द्वारा तैयार किए जा सकते हैं, बाधाओं के साथ:

  • आयत की चौड़ाई और ऊंचाई न्यूनतम 24 है।
  • ग्रिड की चौड़ाई और ऊंचाई न्यूनतम 26 है।
  • आयत कभी भी न तो छूती है और न ही ग्रिड की सीमा से बाहर जाती है।

तो इनपुट आयत में कोई रोटेशन, स्थिति और आयाम हो सकते हैं, और ग्रिड में कोई भी आयाम हो सकता है, जब तक कि ऊपर की तीन बाधाएं पूरी नहीं हो जातीं। ध्यान दें कि ग्रिड आयामों को छोड़कर, स्निपेट पैरामीटर फ्लोट हो सकते हैं।

विवरण

  • कच्चे पाठ आयत को इनपुट के रूप में लें या फ़ाइल का फ़ाइल नाम लें जिसमें कच्चा पाठ आयत (स्टड या कमांड लाइन के माध्यम से) हो। आप मान सकते हैं कि टेक्स्ट आयत में एक अनुगामी न्यूलाइन है।
  • आप मान सकते हैं कि पाठ आयत किसी भी दो अलग-अलग मुद्रण योग्य ASCII वर्णों से बना है Xऔर .यदि वांछित है। (न्यूलाइन्स को नए सिरे से बने रहना चाहिए।)
  • किसी भी क्रम में stdout करने के लिए पूर्णांक या फ़्लोट के रूप में मापी गई चौड़ाई और ऊँचाई को आउटपुट करें (क्योंकि यह निर्धारित करने का कोई तरीका नहीं है कि वास्तव में कौन से पैरामीटर के साथ गया)। किसी भी प्रारूप है कि स्पष्ट रूप से दो आयामों से पता चलता ठीक है, जैसे है D1 D2, D1,D2, D1\nD2, (D1, D2), आदि
  • एक कार्यक्रम के बजाय, आप एक फ़ंक्शन लिख सकते हैं जो टेक्स्ट आयत को एक स्ट्रिंग या फ़ाइल नाम के रूप में लेता है और परिणाम को सामान्य रूप से प्रिंट करता है या इसे दो तत्वों के साथ एक स्ट्रिंग या सूची / टपल के रूप में लौटाता है।
  • याद रखें कि XXया ..आयत का एक 'पिक्सेल' है, दो नहीं।

उदाहरण

पूर्व। 1

पैरामीटर: grid w:60 grid h:34 w:40 h:24 x:0 y:0 θ:12(स्निपेट डिफॉल्ट्स)

इनपुट

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....................................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..........................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX................................................................................XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX................................................................................XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..................................................................................XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX..........................................................................XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX....................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX........................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX....XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

उदाहरण आउटपुट

  • 40 24
  • 24 40
  • [40.0, 24.0]
  • 42.8, 25.68 (+ 7%)
  • 37.2, 22.32 (-7%)

पूर्व। 2

पैरामीटर: grid w:55 grid h:40 w:24.5 h:24 x:-10.1 y:2 θ:38.5

इनपुट

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX..................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX......................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX..................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX......................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX................................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX..............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX............................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX......................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX....................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX................................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXX............................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX......................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX..................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX................................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX..........................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX......................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX..................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

उदाहरण आउटपुट

  • 24.0 24.5
  • 25.68 26.215 (+ 7%)
  • 22.32 22.785 (-7%)

स्कोरिंग

बाइट्स में सबसे छोटा कोड जीतता है। टाईब्रेकर सबसे अधिक मतदान वाला पद है।


क्या किसी समाधान को स्वीकार की जाने वाली सटीक आवश्यकताओं को पूरा नहीं करना चाहिए? आपके द्वारा स्वीकृत एक निश्चित इनपुट मानों के लिए बहुत दूर है।
रेटो कोरदी

जवाबों:


6

मतलाब, 226 बाइट्स

विचार सरल है: पहले मैं यह पता लगाने की कोशिश करता हूं कि आयत कितना बदल गया था, फिर छवि को इस तरह मोड़ें कि आयत सीधा हो। तब मैं पंक्ति पंक्तियों में सभी पिक्सल को सहजता से 'सम' करता हूं और गिनता हूं कि चौड़ाई और ऊंचाई तय करने के लिए औसत (साधारण थ्रेसहोल्ड) की तुलना में कितने सारे योग हैं। यह सरल विधि आश्चर्यजनक रूप से मज़बूती से काम करती है।

मैं कोण का पता कैसे लगा सकता हूं?

मैं बस प्रत्येक चरण (प्रत्येक डिग्री एक डिग्री) की कोशिश करता हूं और कॉलम के साथ योग करता हूं और रकम का वेक्टर प्राप्त करता हूं। जब आयत सीधी होती है, तो मुझे आदर्श रूप से इस सदिश राशि में केवल दो अचानक परिवर्तन प्राप्त करने चाहिए। यदि वर्ग टिप पर है, तो परिवर्तन बहुत क्रमिक हैं। इसलिए मैं सिर्फ पहले व्युत्पन्न का उपयोग करता हूं, और 'जंप' की संख्या को कम करने की कोशिश करता हूं। यहां आप उस मानदंड की एक साजिश देख सकते हैं जिसे हम कम करने की कोशिश कर रहे हैं। ध्यान दें कि आप चार मिनीमा को देख सकते हैं जो कि चार संभव समतल अभिविन्यास से मेल खाती है।

न्यूनतम मानदंड

आगे के विचार: मुझे यकीन नहीं है कि यह कितना बड़ा हो सकता है क्योंकि एक्सक्लूसिव एंगल सर्च में बहुत सारे किरदार होते हैं और मुझे शक है कि आप इसे इतनी अच्छी तरह से बना सकते हैं कि बिल्ट इन ऑप्टिमाइज़ेशन मेथड्स, क्योंकि जैसा कि आप देख सकते हैं कि बहुत सारे लोकल मिनिमा हैं कि हम तलाश नहीं कर रहे हैं। आप आसानी से कोण के लिए एक छोटा कदम आकार चुनकर (बड़ी तस्वीरों के लिए) सटीकता में सुधार कर सकते हैं और 360 ° के बजाय केवल 90 ° खोज सकते हैं ताकि आप उस तरह या इसके 0:360साथ कुछ बदल सकते हैं 0:.1:90। लेकिन वैसे भी, मेरे लिए चुनौती गोल्फ के बजाय एक मजबूत एल्गोरिथ्म खोजने की अधिक थी और मुझे यकीन है कि गोल्फिंग भाषाओं की प्रविष्टियाँ मेरे सबमिशन को बहुत पीछे छोड़ देगीं =)

पुनश्च: किसी को वास्तव में मटलब / ऑक्टेव से एक गोल्फ भाषा प्राप्त करनी चाहिए।

आउटपुट

उदाहरण 1:

 25    39

उदाहरण 2:

 25    24

कोड

golfed:

s=input('');r=sum(s=='n');S=reshape(s',nnz(s)/r,r)';S=S(:,1:2:end-2)=='.';m=Inf;a=0;for d=0:360;v=sum(1-~diff(sum(imrotate(S,d))));if v<m;m=v;a=d;end;end;S=imrotate(S,a);x=sum(S);y=sum(S');disp([sum(x>mean(x)),sum(y>mean(y))])

Ungolfed:

s=input('');
r=sum(s=='n');              
S=reshape(s',nnz(s)/r,r)'; 
S=S(:,1:2:end-2)=='.';    
m=Inf;a=0;
for d=0:360;                 
    v=sum(1-~diff(sum(imrotate(S,d))));
    if v<m;
        m=v;a=d;
    end;
end;
S=imrotate(S,a);
x=sum(S);y=sum(S');
disp([sum(x>mean(x)),sum(y>mean(y))])

7

CJam, 68 65 64 बाइट्स

यह थोड़ा और गोल्फ हो सकता है ..

qN/2f%{{:QN*'.#Qz,)mdQ2$>2<".X"f#_~>@@0=?Qz}2*;@@-@@-mhSQWf%}2*;

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

तर्क बहुत आसान है, अगर आप इसके बारे में सोचते हैं।

इनपुट X.संयोजन से हम सभी की जरूरत है दो आसन्न पक्षों के 3 निर्देशांक है। यहाँ हम उन्हें कैसे प्राप्त करें:

First

आयत के किसी भी अभिविन्यास .में, पूरे इनपुट में पहला कोनों में से एक होने जा रहा है। उदाहरण के लिए..

XXXXXXXXXXXXXX
XXXXXXX...XXXX
XXXX.......XXX
X............X
XX.........XXX
XXXX...XXXXXXX
XXXXXXXXXXXXXX

यहां, पहला .2 एनडी लाइन, 8 वें कॉलम में है।

लेकिन ऐसा नहीं है, हमें कुछ समायोजन करना होगा और .उस लाइन पर रन की चौड़ाई को सही अंत का समन्वय प्राप्त करने के लिए निर्देशांक में जोड़ना होगा।

Second

यदि हम उपरोक्त आयत (newlines पर pivoted) को स्थानांतरित करते हैं, तो नीचे बाएँ कोने में उपरोक्त चरण का स्थान लिया जाता है। लेकिन यहां, हम .रन लंबाई के लिए क्षतिपूर्ति नहीं करते हैं, क्योंकि हम किनारे वाले किसी भी मार्ग के निचले बाएँ समन्वय को प्राप्त करना चाहते हैं (जो कि ट्रांसपोज़्ड फॉर्म में अभी भी पहली बार सामना किया जाएगा .)

Rest two

बाकी दो निर्देशांक के लिए, हम बस क्षैतिज रूप से फ्लिप करते हैं, आयत और ऊपर के दो चरण करते हैं। यहां के कोनों में से एक पहले दो से आम होगा।

सभी 4 प्राप्त करने के बाद, हम केवल दूरी प्राप्त करने के लिए कुछ सरल गणित करते हैं।

अब यह सबसे सटीक तरीका नहीं है, लेकिन यह त्रुटि मार्जिन के भीतर और आयत के सभी संभावित झुकावों के लिए अच्छी तरह से काम करता है।

कोड विस्तार (थोड़ा पुराना)

qN/2f%{{:QN*'.#Q0=,)md}:A~1$Q='.e=+QzA@@-@@-mhSQWf%}2*;
qN/2f%                               e# Read the input, split on newlines and squish it
      {   ...   }2*                  e# Run the code block two times, one for each side  
{:QN*'.#Q0=,)md}:A~                  e# Store the code block in variable A and execute it
 :QN*                                e# Store the rows in Q variable and join by newlines
     '.#                             e# Get the location of the first '.'
        Q0=,)                        e# Get length + 1 of the first row
             md                      e# Take in X and Y and leave out X/Y and X%Y on stack
1$Q=                                 e# Get the row in which the first '.' appeared
    '.e=+                            e# Get number of '.' in that row and add it to X%Y
         QzA                         e# Transpose the rows and apply function A to get
                                     e# the second coordinate
            @@-@@-                   e# Subtract resp. x and y coordinates of the two corners
                  mh                 e# Calculate (diff_x**2 + diff_y**2)**0.5 to get 1 side
                    SQWF%            e# Put a space on stack and put the horizontally flipped
                                     e# version of the rows/rectangle all ready for next two
                                     e# coordinates and thus, the second side

इसे यहाँ ऑनलाइन आज़माएँ


50x50 के ग्रिड आकार, 45x45 के आयत आकार, और कोण की कोशिश करें -2। त्रुटि लगभग 28% है। मैंने एक समान दृष्टिकोण की कोशिश की (यह मेरा प्रारंभिक विचार था, तुम्हारा देखने से पहले), और इसे सटीक रूप से प्राप्त करना उम्मीद की तुलना में काफी पेचीदा हो गया, खासकर अगर पक्ष क्षैतिज / ऊर्ध्वाधर के करीब हैं। महान काम करता है अगर वे विकर्ण के करीब हैं। मुझे लगता है कि इसके लिए या तो अधिक तर्क की आवश्यकता होती है (जैसे कि विकर्ण दिशा में चरम की खोज), या पूरी तरह से अलग दृष्टिकोण।
रेटो कोराडी

@RetoKoradi ओह। ऐसा केवल इसलिए है क्योंकि सभी नकारात्मक कोणों .को पहले के बजाय दूसरे समन्वय पर चौड़ाई समायोजन की आवश्यकता होती है । ठीक कर देंगे। शॉर्ट फिक्स होना चाहिए।
ऑप्टिमाइज़र

1
@RetoKoradi को अभी तय किया जाना चाहिए।
ऑप्टिमाइज़र

40x24 आयत को कोण के साथ आज़माएं 0.
रेटो कोराडी

@RetoKoradi अच्छे अंक। अभी के लिए अस्वीकार्य है।
केल्विन के शौक

5

पायथन 3, 347 337 बाइट्स

यह मेरी अपेक्षा से अधिक कठिन था। कार्य प्रगति पर है...

def f(s):
 l=s.split('\n');r=range;v=sorted;w=len(l[0]);h=len(l);p=[[x,y]for x in r(w)for y in r(h)if'X'>l[y][x]];x,y=[sum(k)/w/h for k in zip(*p)];g=[[x/2,y]];d=lambda a:((a[0]/2-a[2]/2)**2+(a[1]-a[3])**2)**.5
 for i in r(3):g+=v(p,key=lambda c:~-(c in g)*sum(d(j+c)for j in g))[:1]
 print(v(map(d,[g[1]+g[2],g[2]+g[3],g[1]+g[3]]))[:2])

एक फ़ंक्शन fको एक तर्क के रूप में लेते हुए एक फ़ंक्शन को परिभाषित करता है और परिणाम को STDOUT में प्रिंट करता है।

पायथ, 87 84 82 81 75 72 71 बाइट्स

(POSSIBLY INVALID, जब मुझे घर मिलेगा तो निवेश करना)

Km%2d.zJf<@@KeThTG*UhKUKPSm.adfqlT2ytu+G]ho*t}NGsm.a,kNGJ3]mccsklhKlKCJ

अभी भी बहुत लंबा रास्ता । मूल रूप से पिछले का एक बंदरगाह। लविंग पाइथ की .aयूक्लिडियन दूरी। STDIN के माध्यम से इनपुट लेता है और STDOUT के माध्यम से आउटपुट देता है। गैर-आयत वर्ण को निम्न-स्थिति x(ठीक है, ASCII मान 98 या अधिक के साथ कुछ भी) होने की उम्मीद है।

कलन विधि

ये दोनों एक ही एल्गोरिदम का उपयोग करते हैं। मैं मूल रूप से एक सरणी से शुरू करता हूं जिसमें आयत क्षेत्र के द्रव्यमान का केंद्र होता है। मैं फिर आयत में सभी बिंदुओं के सरणी में तीन अंक जोड़ता हूं, हमेशा सरणी में पहले से ही बिंदुओं के लिए अधिकतम दूरी के साथ एक को चुनना । परिणाम आयत के विभिन्न कोनों में हमेशा तीन बिंदु होते हैं। मैं तो बस उन तीन बिंदुओं के बीच की सभी तीन दूरियों की गणना करता हूं और दो सबसे छोटी दूरी तय करता हूं।


अजगर समाधान बिल्कुल काम नहीं करता है। ओपी के दो उदाहरण [33.0, 59.0]इसके बजाय [40, 24]और के [39.0, 54.0]बजाय परिणाम देते हैं [24.0, 24.5]
जकुबे

@ जाकुब अजीब। घर पहुँचते ही छानबीन करूँगा। दुर्भाग्य से मैं 9 जून तक लैपलैंड की क्लास ट्रिप पर हूं।
पुरकाकूदरी

मैं दुर्भाग्य से लैपलैंड की यात्रा को नहीं
बुलाऊंगा

0

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

import sys
r=[]
h=.0
for l in sys.stdin:w=len(l);r+=[[x*.5,h]for x in range(0,w,2)if l[x:x+2]=='..'];h+=1
x,y=.0,.0
for p in r:x+=p[0];y+=p[1]
n=len(r)
x/=n
y/=n
m=.0
for p in r:
 p[0]-=x;p[1]-=y;d=p[0]**2+p[1]**2
 if d>m:m=d;u,v=p
m=.0
for p in r:
 d=p[0]*v-p[1]*u
 if d>m:m=d;s,t=p
print ((u-s)**2+(v-t)**2)**.5+1,((u+s)**2+(v+t)**2)**.5+1

इसने @ Pietu1998 के एल्गोरिथ्म से प्रेरणा ली। यह एक कोने को केंद्र से सबसे दूर बिंदु के रूप में निर्धारित करने का विचार लेता है, लेकिन वहां से भिन्न होता है:

  • मैं केंद्र से पहले कोने तक वेक्टर के साथ सबसे बड़े क्रॉस उत्पाद के साथ बिंदु के रूप में दूसरे कोने का निर्धारण करता हूं। यह केंद्र से पहले कोने तक की लाइन से सबसे बड़ी दूरी के साथ बिंदु देता है।
  • तीसरे कोने की खोज करने की कोई आवश्यकता नहीं है, क्योंकि यह केंद्र के सापेक्ष दूसरे कोने की सिर्फ दर्पण छवि है।

तो कोड इस क्रम का अनुसरण करता है:

  • पहला लूप इनपुट में लाइनों के ऊपर है, और rआयत बिंदुओं की एक सूची बनाता है ।
  • दूसरा लूप आयत के केंद्र को देते हुए सभी आयत बिंदुओं के औसत की गणना करता है।
  • तीसरा लूप बिंदु को केंद्र से सबसे दूर पाता है। यह पहला कोना है। इसी समय, यह केंद्र को सूची में मौजूद बिंदुओं से घटाता है, ताकि शेष गणना के लिए बिंदु निर्देशांक केंद्र के सापेक्ष हों।
  • चौथा लूप वेक्टर के साथ सबसे बड़े क्रॉस उत्पाद के साथ बिंदु को पहले कोने में पाता है। यह दूसरा कोना है।
  • पहले कोने और दूसरे कोने के बीच की दूरी को प्रिंट करता है, और दूसरे कोने के पहले कोने और दर्पण की छवि के बीच की दूरी।
  • 1.0को दूरियों में जोड़ा जाता है क्योंकि मूल दूरी की गणना पिक्सेल सूचकांकों का उपयोग करती है। उदाहरण के लिए, यदि आपके पास 5 पिक्सेल हैं, तो अंतिम और पहले पिक्सेल के सूचकांक के बीच का अंतर केवल 4 था, जिसे अंतिम परिणाम में मुआवजे की आवश्यकता है।

परिशुद्धता काफी अच्छी है। दो उदाहरणों के लिए:

$ cat rect1.txt | python Golf.py 
24.5372045919 39.8329756779
$ cat rect2.txt | python Golf.py 
23.803508502 24.5095563412

0

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

इसे एक अलग उत्तर के रूप में पोस्ट करना क्योंकि यह मेरे पिछले एक की तुलना में पूरी तरह से अलग एल्गोरिथ्म है:

import sys,math
y,a,r=0,0,0
l,t=[1<<99]*2
for s in sys.stdin:
 c=s.count('..')
 if c:a+=c;x=s.find('.')/2;l=min(l,x);r=max(r,x+c);t=min(t,y);b=y+1
 y+=1
r-=l
b-=t
p=.0
w,h=r,b
while w*h>a:c=math.cos(p);s=math.sin(p);d=c*c-s*s;w=(r*c-b*s)/d;h=(b*c-r*s)/d;p+=.001
print w,h

यह दृष्टिकोण कोनों की पहचान नहीं करता है। यह अवलोकन पर आधारित है कि बाउंडिंग बॉक्स का आकार (चौड़ाई और ऊंचाई) और घुमाए गए आयत का क्षेत्रफल आयत की चौड़ाई और ऊंचाई निर्धारित करने के लिए पर्याप्त है।

यदि आप एक स्केच को देखते हैं, तो आयत के बॉक्स / आयत के आकार और रोटेशन कोण की चौड़ाई ( wb) और ऊंचाई ( hb) की गणना करना काफी आसान है :whp

wb = w * cos(p) + h * sin(p)
hb = w * sin(p) + h * cos(p)

wbऔर hbछवि से सीधे निकाला जा सकता है। हम पिक्सेल aकी संख्या की गणना करके आयत के कुल क्षेत्रफल को जल्दी से निकाल सकते हैं ..। चूंकि हम एक आयत के साथ काम कर रहे हैं, यह हमें अतिरिक्त समीकरण देता है:

a = w * h

तो हम 3 अज्ञात (साथ 3 समीकरण है w, hऔर p) है, जो अज्ञात निर्धारित करने के लिए पर्याप्त है। एकमात्र बुमेर यह है कि समीकरणों में त्रिकोणमितीय फ़ंक्शन होते हैं, और कम से कम मेरे धैर्य और गणित कौशल के साथ सिस्टम को आसानी से विश्लेषणात्मक रूप से हल नहीं किया जा सकता है।

मैंने जो लागू किया वह कोण के लिए एक क्रूर बल खोज है p। एक बार pदिए जाने के बाद , ऊपर दिए गए पहले दो समीकरण दो रैखिक समीकरणों की एक प्रणाली बन जाते हैं, जिन्हें हल किया जा सकता है wऔर h:

w = (wb * cos(p) - hb * sin(p)) / (cos(p) * cos(p) - sin(p) * sin(p))
h = (hb * cos(p) - wb * sin(p)) / (cos(p) * cos(p) - sin(p) * sin(p))

इन मूल्यों के साथ, हम फिर w * hआयत के मापा क्षेत्र के साथ तुलना कर सकते हैं । आदर्श रूप से दो मूल्य किसी बिंदु पर समान होंगे। यह निश्चित रूप से फ्लोटिंग पॉइंट मैथ में नहीं होने वाला है।

w * hकोण बढ़ने पर मूल्य घटता है। इसलिए हम कोण 0.0 पर शुरू करते हैं, और तब कोण को छोटे चरणों द्वारा बढ़ाते हैं जब तक कि पहली बार w * hमापा क्षेत्र से कम न हो।

कोड में केवल दो मुख्य चरण हैं:

  1. इनपुट से बाउंडिंग बॉक्स और आयत क्षेत्र का आकार निकालें।
  2. समाप्ति के मानदंड तक पहुंचने तक उम्मीदवार कोणों पर लूप।

आउटपुट की सटीकता आयतों के लिए अच्छी है जहां चौड़ाई और ऊंचाई काफी भिन्न होती है। यह आयत के साथ कुछ iffy है कि लगभग वर्ग और 45 डिग्री के करीब घुमाया जाता है, बस मुश्किल से 7 उदाहरण परीक्षण 2 के लिए त्रुटि बाधा समाशोधन।

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

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