রিয়েল চেবিশেভ রোটেশন


15

এটি চেবিশেভ রোটেশন দ্বারা অনুপ্রাণিত একটি চ্যালেঞ্জ । আমি এই চ্যালেঞ্জটির অনুপ্রেরণা পেতে উত্তরগুলি দেখার পরামর্শ দিচ্ছি।

সমতলে একটি বিন্দু দেওয়া হল একটি অনন্য বর্গক্ষেত্র (সমান পক্ষের একটি আয়তক্ষেত্র) যা মূলকে কেন্দ্র করে এবং সেই বিন্দুকে ছেদ করে ( ইন্টারেক্টিভ ডেমো ):

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

একটি বিন্দু প্রদত্ত পি এবং একটি দূরত্ব , পয়েন্ট দূরত্ব চলন্ত দ্বারা প্রাপ্ত আসতে থেকে পি , ঘড়ির কাঁটার বিপরীতে (এবং নেতিবাচক জন্য ঘড়ির কাঁটার দিকে ), বর্গাকার ঘের বরাবর উৎপত্তি যে ছেদ করে কেন্দ্রেও পি । আপনার উত্তরটি অবশ্যই কমপক্ষে 4 দশমিক অঙ্কের জন্য সঠিক হতে হবে।

Testcases:

(0, 0), 100 -> (0, 0)
(1, 1), 81.42 -> (-0.4200, 1.0000)
(42.234, 234.12), 2303.34 -> (-234.1200, 80.0940)
(-23, -39.234), -234.3 -> (39.2340, -21.8960)

নিম্নলিখিত পরীক্ষার কেসগুলি মার্টিন এন্ডারের মূল চ্যালেঞ্জ থেকে এবং সমস্ত ডি = 1 সহ :

(0, 0)       -> (0, 0)
(1, 0)       -> (1, 1)
(1, 1)       -> (0, 1)
(0, 1)       -> (-1, 1)
(-1, 1)      -> (-1, 0)
(-1, 0)      -> (-1, -1)
(-1, -1)     -> (0, -1)
(0, -1)      -> (1, -1)
(1, -1)      -> (1, 0)
(95, -12)    -> (95, -11)
(127, 127)   -> (126, 127)
(-2, 101)    -> (-3, 101)
(-65, 65)    -> (-65, 64)
(-127, 42)   -> (-127, 41)
(-9, -9)     -> (-8, -9)
(126, -127)  -> (127, -127)
(105, -105)  -> (105, -104)

এই সমস্ত প্রায় অন্যান্য চ্যালেঞ্জ থেকে সামান্য পরিবর্তন করা যায় না? এটি একটি অযথা সংযোজন বলে মনে হচ্ছে।
এটাকো

1
@ATaco না, এটি কিছুটা জটিল।
orlp

পি থেকে শুরু করে পরিধিটি গণনা করা উচিত?
গ্যাবার ফেকেট

@ গুবারফিকেট
orlp

হ্যাঁ, আমি দেখছি, পরীক্ষার কেসগুলি এটিকে বোঝায় তবে এটি সুস্পষ্টভাবে বলা হয়নি। আমি প্রথমে ভেবেছিলাম এটি এক্স-অক্ষের ধনাত্মক মোড়ে শুরু হবে।
গ্যাবার ফেকেট

উত্তর:


4

পাইথন 2, 363 335 296 266 262 258 256 233 বাইট

উও, ১৩০ বাইট হারিয়েছে! 4 বাইট বাঁচানোর জন্য নীলকে ধন্যবাদ, 2 বাইট বাঁচানোর জন্য নাথান মেরিল এবং একটি হাস্যকর 23 বাইট সংরক্ষণ করার জন্য xnor!

সাধারণ ধারণাটি হ'ল: আমরা বর্গাকার ঘেরের বিপরীতে এর মডুলাস গ্রহণ করে ভ্রমণ করা দূরত্ব হ্রাস করতে পারি। পরিধিটি দুটি স্থানাঙ্কের মধ্যে 8 গুণ বৃহত্তম হিসাবে সংজ্ঞায়িত করা হয়, যেহেতু পয়েন্টটি অবশ্যই তার উপর নির্ভর করে। তারপরে, মডুলাস গ্রহণের পরে আমাদের কোনও ওভারল্যাপ না হওয়ার গ্যারান্টিযুক্ত। মডুলাস একটি ইতিবাচক ফলাফল দেয় যেহেতু আমাদের কেবলমাত্র ঘড়ির কাঁটার বিপরীতে চলে যেতে হবে তাও গ্যারান্টি দেয়।

সেখান থেকে আমি কেবলমাত্র আমরা কোথায় রয়েছে তা নির্ধারণ করতে প্রদত্ত x এবং y- স্থানাঙ্কগুলি থেকে যা জানি তা ব্যবহার করি: শীর্ষ, নীচে, বাম, ডান বা কোনও কোণে এবং দিকটি নির্ধারণ করুন যা একটি হতে পারে 0, 1, 2, 3:

0 --> we are on the 'top', moving 'left'
1 --> we are on the 'left', moving 'down'
2 --> we are on the 'bottom', moving 'right'
3 --> we are on the 'right', moving 'up'

এর পরে, আমাদের ভ্রমণের দূরত্ব থাকা অবস্থায় লুপিংয়ের মতো সহজ, এবং আমরা যথাযথ স্থানাঙ্কে বিয়োগ বা যোগ করার দিকের ভিত্তিতে এবং লুপটি বলি যে আমরা এগিয়ে যাচ্ছি tell

p,d=input()
x,y=p
s=max(x,y,-x,-y)
d=d%(s*8or 1)
r=[(y<s)*[2,[3,x>-s][x<s]][y>-s],[2*(y<0),3*(y<=0)][x>0]][y*y==x*x]
while s>0<d:f=1-2*(r<2);m=abs(f*s-p[r%2]);j=d>m;p[r%2]=[p[r%2]+f*d,f*s][j];r=-~r%4;d=(d-m)*j
print"%.4f "*2%tuple(p)

যদিও বেশ দীর্ঘ, এটি অবশ্যই কাজ করে। এখানে I / O এর উদাহরণ রয়েছে:

[0, 0], 100 --> 0.0000 0.0000
[1, 1], 81.42 --> -0.4200 1.0000
[42.234, 234.12], 2303.34 --> -234.1200 80.0940
[-23, -39.234], -234.3 --> 39.2340 -21.8960

এটি অনলাইনে ব্যবহার করে দেখুন বা পরীক্ষার কেসগুলি চালান


নেই s=max(x,y,-x,-y)কাজ করে?
নিল

@ নীল এটি করে, ধন্যবাদ একটি গুচ্ছ!
কেড

(s>0)*(d>0)হয় s>0<d। আউটপুট হতে পারে "%.4f "*2%tuple(p)if s:d=d%(8*s)হতে পারে d%(s*8or 1)(r+1)হতে পারে ~-r1*(x>-s)ঠিক হতে পারে (x>-s)abs(y)==abs(x)হতে পারেy*y==x*x
xnor

@ এক্সনর বাহ, ধন্যবাদ! আমি যে পাতাগুলি পরিবর্তন করেছি কেবল তার জন্য (x>-s)প্রথম বন্ধনী এবং ~-rহ্রাসের প্রয়োজন নেই, তাই আমি ব্যবহার করেছি -~r
কেড

3

জাভাস্ক্রিপ্ট (ES6), 147 বাইট

f=(x,y,d,s=Math.max(x,y,-x,-y),c=(d/8%s+s)%s*8,v=0,w=x+y>0?1:-1,b=(v?x:y)*w+c-s)=>c?b>0?f(v?s*w:x,v?y:s*w,d,s,b,!v,v?w:-w):[x+c*w*v,y+c*w*!v]:[x,y]

ব্যাখ্যা: বর্গক্ষেত্রের সীমানার মধ্যে রেখে নির্দেশিকা ভেক্টর যুক্ত করার চেষ্টা করে কাজ করে। যে কোনও ওভারশুটটি পুনরাবৃত্তভাবে 90 ° দ্বারা আন্টিকলোকের দিকে ঘোরানো দিক দিয়ে ফিরে আসে ° দিকটি প্রকৃতপক্ষে উল্লম্ব পতাকা vএবং একটি ইউনিট ব্যবহার করে এনকোড করা হয়েছে wযাতে ভেক্টর (1, 0), (0, 1), (-1, 0) এবং (0, -1) v0, 1, 0 এর সাথে এনকোড থাকে , wযথাক্রমে 1 এবং 1, 1, -1, -1। দিকনির্দেশক ভেক্টর প্রথমে উপযুক্ত দিক নির্দেশ নাও করতে পারে তবে এটি কখনই পিছনের দিকে নির্দেশ করে না তাই শেষ পর্যন্ত এটি ব্যবহারযোগ্য দিকের দিকে ঘোরে।

f=(x,y,d,                   Input parameters
 s=Math.max(x,y,-x,-y),     Calculate half the side of the square
 c=(d/8%s+s)%s*8,           Reduce the distance modulo the perimeter
 v=0,                       Initial vertical flag
 w=x+y>0?1:-1,              Initial direction
 b=(v?x:y)*w+c-s)=>         Will we overshoot the corner?
  c?b>0?f(v?s*w:x,v?y:s*w,  Advance to the next corner
          d,s,b,!v,v?w:-w): Rotate the direction
        [x+c*w*v,y+c*w*!v]: Advance the remaining amout
    [x,y]                   Nothing to do, zero input

এটি হতে পারে কারণ আমার ব্রাউজারটি (অপেরা 40.0.2308.81), তবে দেখে মনে হচ্ছে এটির চারপাশের ত্রুটি রয়েছে f(42.234, 234.12, 2303.34) -> [-234.12, 80.09399999999988]যার অর্থ এটির 4 ডিজিটের যথার্থতা নেই। কিছু আউটপুট বিন্যাস যোগ করা কি এটি ঠিক করে দেবে? ভাল উত্তর যদিও! :)
কেড

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