স্কয়ারফাইন্ডার - নিয়মিত টেট্র্যাগনগুলি সনাক্ত করা


27

প্লেনটিতে টানা কয়েকটি আয়তক্ষেত্রের কল্পনা করুন, প্রতিটি আয়তক্ষেত্রের সমান্তরাল স্থানাঙ্কে এবং এর পাশের অক্ষগুলির সাথে সমান্তরালভাবে এর শীর্ষগুলি সমেত:

এখানে চিত্র বর্ণনা লিখুন

আয়তক্ষেত্রটি বিমানটিকে কয়েকটি বিচ্ছিন্ন অঞ্চলে বিভক্ত করে, নীচে বর্ণের লাল এবং নীল বর্ণযুক্ত:

এখানে চিত্র বর্ণনা লিখুন

আপনার লক্ষ্যটি হ'ল এমন অঞ্চলগুলির সংখ্যা সন্ধান করা যা নিখুঁত স্কোয়ার। উপরের উদাহরণে তিনটি রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

মনে রাখবেন যে মাঝের বৃহত বর্গটি একটি একক অঞ্চল না হওয়ায় এটি গণনা করা হয় না, বরং এটি বেশ কয়েকটি ছোট বিভাজন অঞ্চল নিয়ে গঠিত।

ইনপুট

আপনি এই চ্যালেঞ্জের জন্য একটি ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম লিখতে পারেন।

ইনপুটটি বিমানে আয়তক্ষেত্রগুলি 4nসংজ্ঞায়িত করাকালীন পূর্ণসংখ্যা হবে n। প্রতিটি আয়তক্ষেত্র দুটি বিপরীত শীর্ষকে উপস্থাপিত হয়, যেমন 4 9 7 8বিপরীত শীর্ষকে (4, 9)এবং দিয়ে আয়তক্ষেত্রকে উপস্থাপন করে (7, 8)। নোট করুন যে এই আয়তক্ষেত্রটি হিসাবে 7 8 4 9বা হিসাবে প্রতিনিধিত্ব করা যেতে পারে 4 8 7 9

সঠিক ইনপুট ফর্ম্যাটটি নমনীয় (যেমন স্থান-পৃথক স্ট্রিং, কমা-বিভাজিত স্ট্রিং, পূর্ণসংখ্যার একক অ্যারে, স্থানাঙ্কিত টিউপসগুলির তালিকা) এবং তবে দয়া করে যুক্তিযুক্ত হন এবং আপনার পোস্টে কীভাবে আপনার কোড চালাবেন তার একটি উদাহরণ দিন। আপনি ইনপুটটিকে পুনরায় অর্ডার করতে পারবেন না।

সরলতার জন্য, আপনি ধরে নিতে পারেন যে কোনও দুটি কিনারা ওভারল্যাপিং হবে না - এর মধ্যে একটি শীর্ষবিন্দুতে ওভারল্যাপিং অন্তর্ভুক্ত রয়েছে। বিশেষত, এর দ্বারা বোঝা যাচ্ছে যে কোনও দুটি আয়তক্ষেত্র প্রান্ত-থেকে-প্রান্ত বা কোণে-কোণে স্পর্শ করবে না এবং আয়তক্ষেত্রগুলিতে ননজারো অঞ্চল থাকবে।

আউটপুট

আপনার প্রোগ্রামটি একটি একক পূর্ণসংখ্যাকে মুদ্রণ করে বা ফেরত পাঠানো উচিত, এটি বর্গক্ষেত্রের সংখ্যা।

স্কোরিং

এটি কোড গল্ফ, সুতরাং কয়েকটি বাইটের কোডটি জয়ী।


পরীক্ষার মামলা

ইনপুট:

0 0 5 5
6 8 10 4
14 16 11 13
19 1 18 2

আউটপুট:

4

এটি কেবল চারটি বিচ্ছিন্ন স্কোয়ার:

এখানে চিত্র বর্ণনা লিখুন


ইনপুট:

2 1 3 11
1 10 5 19
6 10 11 3
8 8 15 15
13 13 9 5
15 1 19 7
17 19 19 17

আউটপুট:

3

পোস্টের শুরুতে এটি উদাহরণের উদাহরণ test


ইনপুট:

0 9 15 12
6 3 18 15
9 6 12 20
13 4 17 8

আউটপুট:

7

এখানে চিত্র বর্ণনা লিখুন


ইনপুট:

5 9 11 10
5 12 11 13
6 8 7 14
9 8 10 14
13 8 14 9
13 10 14 14

আউটপুট:

14

এখানে চিত্র বর্ণনা লিখুন


ইনপুট:

0 99999 100000 0

আউটপুট:

0

এটি কেবল একটি বড় আয়তক্ষেত্র।


ইনপুট:

0 99999 100000 0
2 1 142857 285714

আউটপুট:

1

দুটি বড় আয়তক্ষেত্র যা ওভারল্যাপ করে।

উত্তর:


9

এসকিউএল (পোস্টজিআইএস), 286 269 261 240 226 218 216

এটি পোস্টগ্রিজ এসকিউএল-তে পোস্টজিআইএস এক্সটেনশনের জন্য একটি প্রশ্ন। আমি মোট ইনপুট মান গণনা করা হয়নি।

SELECT SUM(1)FROM(SELECT(ST_Dump(ST_Polygonize(g))).geom d FROM(SELECT ST_Union(ST_Boundary(ST_MakeEnvelope(a,b,c,d)))g FROM(VALUES
-- Coordinate input
(2, 1, 3, 11)
,(1, 10, 5, 19)
,(6, 10, 11, 3)
,(8, 8, 15, 15)
,(13, 13, 9, 5)
,(15, 1, 19, 7)
,(17, 19, 19, 17)
)i(a,b,c,d))i)a WHERE(ST_XMax(d)-ST_XMin(d))^2+(ST_YMax(d)-ST_YMin(d))^2=ST_Area(d)*2

ব্যাখ্যা

ক্যোয়ারী প্রতিটি সমন্বয়যুক্ত জোড়ার জন্য জ্যামিতি তৈরি করে। ইউনিয়নগুলি বাহ্যিকভাবে রিংগুলি সঠিকভাবে নোডে বেধে দেয়। ফলাফলগুলি বহুভুতে রূপান্তরিত করে এবং উচ্চতার বিপরীতে প্রস্থের পরীক্ষা করে এবং ক্ষেত্রফল প্রতিটি পক্ষের স্কোয়ারের যোগফলের দ্বিগুণ হয়।

এটি পোস্টজিআইএস এক্সটেনশন সহ যে কোনও পোস্টগ্রাইএসকিউএল ডাটাবেসে স্ট্যান্ডেলোন কোয়েরি হিসাবে চলবে।

সম্পাদনা আরও কয়েক খুঁজে।


1
... এবং হাস্কেল
অপ্টিমাইজার

@ অপ্টিমাইজার আমি সন্দেহ করি এটি টিকে থাকবে :)
মিকিটি

@ মিকিটি এটি একটি স্বাস্থ্যকর প্রতিযোগিতায় পরিণত হয়েছে। :)
জাগারব

@ জাগারব এটির কিছুটা রয়েছে :-) তবে আমি মনে করি না যে আমি আর কিছু পেয়েছি got
মিকিটি

13

পাইথন 2, 480 436 386 352 বাইট

exec u"""s=sorted;H=[];V=[]
FRIinput():
 S=2*map(s,zip(*R))
 FiI0,1,2,3:
    c=S[i][i/2];a,b=S[~i]
    FeIs(H):
     C,(A,B)=e
     if a<C<b&A<c<B:e[:]=C,(A,c);H+=[C,(c,B)],;V+=[c,(a,C)],;a=C
    V+=[c,(a,b)],;H,V=V,H
print sum(a==A==(d,D)&c==C==(b,B)&B-b==D-d&1-any(d<X[0]<D&b<y<B Fy,XIH)Fb,aIH FB,AIH Fd,cIV FD,CIV)""".translate({70:u"for ",73:u" in ",38:u" and "})

বিন্যাসে STDIN এর মাধ্যমে স্থানাঙ্ক জোড়াগুলির একটি তালিকা নেয়:

[  [(x, y), (x, y)],  [(x, y), (x, y)],  ...  ]

এবং ফলাফলটি STDOUT এ মুদ্রণ করে।


স্ট্রিং প্রতিস্থাপনের পরে আসল প্রোগ্রামটি হ'ল:

s=sorted;H=[];V=[]
for R in input():
 S=2*map(s,zip(*R))
 for i in 0,1,2,3:
    c=S[i][i/2];a,b=S[~i]
    for e in s(H):
     C,(A,B)=e
     if a<C<b and A<c<B:e[:]=C,(A,c);H+=[C,(c,B)],;V+=[c,(a,C)],;a=C
    V+=[c,(a,b)],;H,V=V,H
print sum(a==A==(d,D) and c==C==(b,B) and B-b==D-d and 1-any(d<X[0]<D and b<y<B for y,X in H)for b,a in H for B,A in H for d,c in V for D,C in V)

ব্যাখ্যা

জটিল বহুভুজগুলির সাথে ঝাঁকুনির পরিবর্তে, এই প্রোগ্রামটি সাধারণ লাইন বিভাগগুলির সাথে ডিল করে। প্রতিটি ইনপুট আয়তক্ষেত্রের জন্য, আমরা পৃথকভাবে এর চারটি প্রান্তকে একটি যৌথ বিভাগের তালিকায় যুক্ত করি তালিকায় একটি বিভাগ যুক্ত করা নিম্নরূপ যায়: আমরা বিদ্যমান প্রতিটি বিভাগকে নতুন বিভাগের সাথে ছেদ করার জন্য পরীক্ষা করি; যদি আমরা কোনও ছেদ খুঁজে পাই তবে আমরা উভয় বিভাগকে ছেদ করার স্থানে ভাগ করে নিই এবং চালিয়ে যাই। জিনিসগুলিকে আরও সহজ করার জন্য, আমরা আসলে দুটি পৃথক বিভাগের তালিকা রাখি: একটি অনুভূমিক একটি এবং একটি উল্লম্ব। যেহেতু বিভাগগুলি ওভারল্যাপ করে না, অনুভূমিক বিভাগগুলি কেবল উল্লম্ব বিভাগগুলিকে ছেদ করতে পারে এবং বিপরীতে। আরও ভাল, এর অর্থ হল যে সমস্ত ছেদগুলি (একই আয়তক্ষেত্রের প্রান্তগুলি বিবেচনা করে না) "যথাযথ", অর্থাৎ আমাদের টি-আকৃতির ছেদ নেই, সুতরাং প্রতিটি বিভাগের "উভয় পক্ষ" সত্যই বিভক্ত divided

একবার আমরা সেগমেন্টের তালিকা তৈরি করলাম, আমরা স্কোয়ারগুলি গণনা শুরু করব। চারটি বিভাগের প্রতিটি সংমিশ্রণের জন্য (বিশেষত, দুটি অনুভূমিক বিভাগ এবং দুটি উল্লম্ব বিভাগ) আমরা পরীক্ষা করি যদি সেগুলি একটি বর্গ গঠন করে। তদুপরি, আমরা যাচাই করি যে এই বর্গক্ষেত্রের মধ্যে কোনও শীর্ষবিন্দু নেই (যা ঘটতে পারে, উদাহরণস্বরূপ, যদি আমাদের বৃহত্তর ভিতরে একটি ছোট বর্গ থাকে)) এটি আমাদের পছন্দসই পরিমাণ দেয়। নোট করুন যে প্রোগ্রামটি প্রতিটি সংমিশ্রণকে বিভিন্ন অর্ডারে চারবার পরীক্ষা করে দেখায়, বিভাগের নির্দিষ্ট ক্রমটি সমন্বয় করে গ্যারান্টি দেয় যে আমরা প্রতিটি বর্গকে কেবল একবার গণনা করি।


1
আপনি কতটা দ্রুত সমাধান করেছেন এবং আপনি যেভাবে সমস্যার কাছে এসেছেন তা দেখে আমি খুব মুগ্ধ! লুপগুলি আমাকে যেতে "অবশ্যই কিছু করা যেতে পারে ..."
Sp3000

@ এসপি 3000 হ্যাঁ আমি itertoolsলুপগুলির জন্য ব্যবহার করার চেষ্টা করেছি তবে এটি দীর্ঘ হওয়া পর্যন্ত শেষ হয়েছিল। আমি exec+ স্ট্রিং প্রতিস্থাপনের সাথে কয়েকটি বাইট শেভ করতে পারি , তবে খুব উত্তেজনাপূর্ণ কিছুই নয়।
Ell

4

হাস্কেল, 276 266 250 237 225 222 217 বাইট

এটি সংক্ষিপ্ততর হতে থাকে ... এবং আরও অচল হয়ে পড়ে।

(x#i)l=mapM id[[min x i..max x i-1],l]
(y!j)l f=and[p l==p(f[y,j])|p<-map elem$f[y..j]]
s[h,v]=sum[1|[x,j]<-h,[y,i]<-v,x<i,i-x==j-y,(y!j)h$x#i,(x!i)v$y#j]
n=s.foldr(\(x,y,i,j)->zipWith(++)[x#i$[y,j],y#j$[x,i]])[[],[]]

n [(0,0,5,5),(6,8,10,4),(14,16,11,13),(19,1,18,2)]প্রথম পরীক্ষার ক্ষেত্রে মূল্যায়ন করুন । আমি মনে করি আমি হাস্কেলের এই অ্যালগরিদমকে গল্ফ করার সীমাতে কাছে চলেছি।

এই ফাংশনটি এত ধীর (কমপক্ষে ও (এন 3 ) যেখানে এন ইনপুটটির সমস্ত আয়তক্ষেত্রের মোট পরিধি) আমি শেষ দুটি পরীক্ষার ক্ষেত্রে এটি মূল্যায়ন করতে পারি না। যখন আমি এটি অপটিমাইজেশন চালু করে [(0,249,250,0),(2,1,357,714)]শেষ পরীক্ষার 400 বার সঙ্কুচিত সংস্করণে চালিত করেছি তখন এটি 12 সেকেন্ডের মধ্যে শেষ হয়েছিল। এর ভিত্তিতে, প্রকৃত পরীক্ষার কেসটি প্রায় 25 বছরের মধ্যে শেষ হবে।

ব্যাখ্যা (আংশিক, আমি সময় পেলে এটি প্রসারিত করব)

আমরা প্রথমে দুটি তালিকা তৈরি করি hএবং vনিম্নরূপ। ইনপুটটিতে প্রতিটি আয়তক্ষেত্রের জন্য, আমরা এর সীমানাটি দৈর্ঘ্যের 1 অংশে বিভক্ত করি, অনুভূমিক খন্ডের পশ্চিম প্রান্তগুলিকে দৈর্ঘ্যের তালিকা হিসাবে, hউল্লম্ব বিভাগগুলির দক্ষিণ প্রান্তগুলিতে সংরক্ষণ করা হয় in এর স্থানাঙ্কগুলি বিপরীতে সংরক্ষণ করা হয় গল্ফিং কারণ হিসাবে ফর্ম তারপরে আমরা উভয় তালিকার উপরে লুপ করেছি এবং অনুভূমিক প্রান্ত এবং উল্লম্ব প্রান্তটি সন্ধান করব যেমন এবং (সুতরাং তারা একটি বর্গক্ষেত্রের উত্তর-পশ্চিম এবং দক্ষিণ-পূর্ব কোণে), এবং চেক করুন যে বর্গাকার সীমানাগুলি সঠিক তালিকায় রয়েছে এবং অভ্যন্তরীণ অবস্থায় স্থানাঙ্কগুলি হয় না। অনুসন্ধানের ইতিবাচক উদাহরণগুলির সংখ্যা আউটপুট।v[x,y]v[y,x][x,j][i,y]x < ii-x == j-yhv


ভাল হয়েছে, আমি মনে করি আমাকে এখনই স্বীকার করতে হবে :)
মিকিটি

@ মিকিটি এক সপ্তাহ কেটে গেছে তাই আপাতত আমি জার্গের উত্তরটি মেনে নিয়েছি, তবে আপনি যদি পরে এটি হারাতে পারেন তবে চেক চিহ্নটি সরে যেতে পারে! সত্যই আপনি দু'জন যে কতটা যেতে পেরেছিলেন তাতে আমি অত্যন্ত মুগ্ধ হয়েছি
Sp3000

@ জাগারব জয়ের উপযুক্ত :-)
মিকিটি

@ Sp3000 একটি দুর্দান্ত সামান্য চ্যালেঞ্জের জন্য ধন্যবাদ।
মিকিটি

@ Sp3000 ধন্যবাদ! আমি এই গল্ফ খুব মজা ছিল।
Zgarb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.