রুবি, 68
লাম্বদা ফাংশন জটিল সংখ্যাটি আর্গুমেন্ট হিসাবে গ্রহণ করে, জটিল সংখ্যা দেয়।
->z{k=1
4.times{z*=?i.to_c
x,y=z.rect
y*y>=x*x&&y<-x&&(z+=k;k=0)}
z}
আমরা 90 ডিগ্রি দিয়ে 4 বার দ্বারা গুণ করে পয়েন্টটি ঘোরান i
। সুতরাং এটি সমস্ত 4 কোয়াড্রেন্টের মধ্য দিয়ে যায় এবং অপরিবর্তিত অবস্থায় ফিরে আসবে - যখন আমরা তাদের কোনও নির্দিষ্ট ক্ষেত্রে থাকি তখন আমরা এটিকে সংশোধন করি। এটি সর্বদা একই চতুষ্কোণে পরিবর্তিত হয় এই পরিবর্তনটি সহজতর করে।
z
ডানহ্যান্ড কোয়াড্রেন্টে থাকা অবস্থায় আমরা যদি এটি পরিবর্তন করি তবে তা অনুসরণ করা সহজ । এই ক্ষেত্রে আমরা Y 1 তুল্য বৃদ্ধি প্রয়োজন (অর্থাত যোগ i
করার z
।)
আমরা যাচাই x.abs>=y.abs
বর্গের তুলনা করে x
এবং y
। এটি আমাদেরকে বলবে যে বিন্দুটি ডানহাতে বা বাম হাতের চতুর্দিকে রয়েছে, উপরের বা নীচে নয়। এটি যাচাই করার জন্য ডানহ্যান্ড চতুর্ভুজটি আসলে আমরা আরও পরীক্ষা করে দেখি x>y
(কঠোরতর কারণ আমরা কেসটি বাদ দিতে চাইx=y
"শীর্ষ" কোয়াড্র্যান্টের সাথে সম্পর্কিত কেসটি )) এটি সত্য যেখানে আমরা যুক্ত i
করছি z
।
গল্ফিং কারণে যুক্ত i
করা বাঞ্ছনীয় নয়। পরিবর্তে আমরা সংখ্যাটি সংশোধন করি যখন এটি নীচের চতুষ্কোণে থাকে, সেক্ষেত্রে আমরা x
স্থানাঙ্কে 1 যুক্ত করতে হয় (1 যোগ করুন z
)) এই ক্ষেত্রে আমরা পরীক্ষা করে দেখি যে y*y>=x*x
এটি পরীক্ষা করতে শীর্ষ বা নীচের চতুষ্কোণে রয়েছে। এটি নীচের চতুর্ভুজটিতে রয়েছে তা নিশ্চিত করার জন্য আমাদের পরীক্ষা করা দরকারy<-x
(কঠোরভাবে নীচের অংশে ডানদিকে কোণায় যেখানে ক্ষেত্রে ব্যতীত y=-x
।)
এই চেকটির একটি সুবিধা হল 0,0 স্থানাঙ্কের জন্য কোনও বিশেষ ক্ষেত্রে নেই। দুর্ভাগ্যক্রমে এটি পাওয়া গিয়েছিল যে পয়েন্টটি সরিয়ে নেওয়া এটি একটি পৃথক চতুর্ভুজকে স্থানান্তর করতে পারে এবং এর অর্থ এই যে চতুর্ভুজটিকে আবার পরীক্ষা করা উচিত, যদি দ্বিতীয়টি আন্দোলনকে দমন করা আবশ্যক, যা সম্ভবত সুবিধাটিকে উপেক্ষা করে।
উদাহরণ 1
Input 95,-12
Rotate 90deg 12,95
Rotate 90deg -95,12
Rotate 90deg -12,-95
Rotate 90deg 95,-12
y.abs>=x.abs=TRUE, y<-x=TRUE, increase x 95,-11
The check and alteration of the coordinate is done AFTER the rotation.
Thus in this case it gets done in the 4th iteration of the loop, not the 1st.
If the code were rewritten to do the check and alteration BEFORE the rotation,
it would be done in the 1st iteration instead of the 4th.
উদাহরণ 2
Input -1,0
Rotate 90deg 0,-1
y.abs>=x.abs=TRUE, y<-x=TRUE, increase x 1,-1
Rotate 90deg 1,1
Rotate 90deg 1,-1
Rotate 90deg -1,-1
y.abs>=x.abs?=TRUE, y<-x=TRUE but DO NOT CHANGE x!
This is an unusual situation due to the fact that the first move caused the
point to advance by one quadrant. We do NOT want to move it again, for this
reason we need to set k to 0 the first time it is moved.
পরীক্ষা প্রোগ্রামে
f=->z{k=1 #amount to be added to coordinate
4.times{z*=?i.to_c #iterate 4 times, rotating point by 90deg till it reaches the original orientation
x,y=z.rect #separate out x and y for testing
y*y>=x*x&&y<-x&&(z+=k;k=0)} #if y.abs>=x.abs and y negative and not equal -x, move the point and zero k.
z} #return z
puts f[Complex(0, 0)] # (0, 0)
puts f[Complex(1, 0)] # (1, 1)
puts f[Complex(1, 1)] # (0, 1)
puts f[Complex(0, 1)] # (-1, 1)
puts f[Complex(-1, 1)] # (-1, 0)
puts
puts f[Complex(-1, 0)] # (-1, -1)
puts f[Complex(-1, -1)] # (0, -1)
puts f[Complex(0, -1)] # (1, -1)
puts f[Complex(1, -1)] # (1, 0)
puts f[Complex(95, -12)] # (95, -11)
puts f[Complex(127, 127)] # (126, 127)
puts
puts f[Complex(-2, 101)] # (-3, 101)
puts f[Complex(-65, 65)] # (-65, 64)
puts f[Complex(-127, 42)] # (-127, 41)
puts f[Complex(-9, -9)] # (-8, -9)
puts f[Complex(126, -127)] # (127, -127)
puts f[Complex(105, -105)] # (105, -104)
নকশা
নিম্নলিখিত চিত্রটি (নীল) সেই অঞ্চলটি যেখানে x*x>=y*y
, (হলুদ) সেই ক্ষেত্রটি যেখানে y<-x
এবং (সবুজ) এগুলির ছেদটি দেখায় , এটি সেই অঞ্চল যেখানে সঠিক রূপান্তরটি 1 থেকে সংযোজন z
।