বিলিয়ার্ড বলের সংঘর্ষ


24

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

ইনপুটটি 8 টি সংখ্যা নিয়ে গঠিত: প্রথম বলের কেন্দ্র p0x,p0y,v0x,v0y,p1x,p1y,v1x,v1yকোথায় p0x,p0y, v0x,v0yএর বেগ এবং একইভাবে p1x,p1y,v1x,v1yদ্বিতীয় বলের জন্য। আপনি যে কোনো অনুক্রমে ইনপুট গ্রহণ এবং একটি 2x2x2 অ্যারে, হয়তো বা একটি 2x2 অ্যারের জন্য কোন সুবিধাজনক উপায় গঠিত, যেমন পারেন pএবং দুই দৈর্ঘ্য-2 জন্য অ্যারে v0এবং v1। জাই জোড়ার পরিবর্তে জটিল সংখ্যাগুলি (যদি আপনার ভাষা তাদের সমর্থন করে) নেওয়া ভাল। যাইহোক, কার্টেসিয়ান ছাড়া অন্য কোনও সমন্বিত সিস্টেমে আপনার ইনপুট নেওয়া উচিত নয়, যেমন পোলার অনুমোদিত নয়।

মনে রাখবেন, যে বিলিয়ার্ড বলের ব্যাসার্ধ মধ্যে অর্ধেক দূরত্ব p0x,p0yএবং p1x,p1yতাই এটি ইনপুটের একটি সুনির্দিষ্ট অংশ হিসেবে দেওয়া না।

এমন কোনও প্রোগ্রাম বা ফাংশন লিখুন যা কোনও সুবিধাজনক কার্তেসিয়ান উপস্থাপনায় 4 নম্বর আউটপুট করে বা ফেরত দেয়: সংঘর্ষের পরেের মানগুলি v0x,v0y,v1x,v1y

সংঘর্ষের চিত্র

একটি সম্ভাব্য অ্যালগরিদম হ'ল:

  • উভয় কেন্দ্রের মধ্য দিয়ে যায় এমন সাধারণ লাইনটি সন্ধান করুন

  • দুটি কেন্দ্রের মধ্যবর্তী মধ্যবিন্দু দিয়ে প্রবাহিত স্পর্শক রেখাটি সন্ধান করুন এবং এটি সাধারণ রেখার জন্য লম্ব

  • সমন্বয় ব্যবস্থা পরিবর্তন করুন v0x,v0yএবং v1x,v1yতাদের স্পর্শকাতর এবং স্বাভাবিক উপাদানগুলিতে v0t,v0nএবং ভেঙে দিনv1t,v1n

  • এর স্পর্শকীয় উপাদানগুলি সংরক্ষণ করে v0এবং এর সাধারণ উপাদানগুলি অদলবদল করেv1

  • মূল সমন্বয় সিস্টেমে ফিরে যান

পরীক্ষাগুলি (ফলাফল পাঁচ দশমিক স্থানে গোল করে):

   p0x   p0y   v0x   v0y   p1x   p1y   v1x   v1y ->      v0x'       v0y'       v1x'       v1y'
[-34.5,-81.8, 34.7,-76.1, 96.2,-25.2, 59.2,-93.3] [  49.05873, -69.88191,  44.84127, -99.51809]
[ 36.9, 77.7,-13.6,-80.8, -7.4, 34.4, 15.1,-71.8] [   5.57641, -62.05647,  -4.07641, -90.54353]
[-51.0, 17.6, 46.1,-80.1, 68.6, 54.0,-35.1,-73.9] [ -26.48927,-102.19239,  37.48927, -51.80761]
[-21.1,-52.6,-77.7, 91.5, 46.0, 94.1, 83.8, 93.7] [ -48.92598, 154.40834,  55.02598,  30.79166]
[ 91.3, -5.3, 72.6, 89.0, 97.8, 50.5, 36.2, 85.7] [  71.73343,  81.56080,  37.06657,  93.13920]
[-79.9, 54.9, 92.5,-40.7,-20.8,-46.9,-16.4, -0.9] [  47.76727,  36.35232,  28.33273, -77.95232]
[ 29.1, 80.7, 76.9,-85.1,-29.3,-49.5,-29.0,-13.0] [  86.08581, -64.62067, -38.18581, -33.47933]
[ 97.7,-89.0, 72.5, 12.4, 77.8,-88.2, 31.5,-34.0] [  33.42847,  13.97071,  70.57153, -35.57071]
[-22.2, 22.6,-61.3, 87.1, 67.0, 57.6,-15.3,-23.1] [ -58.90816,  88.03850, -17.69184, -24.03850]
[-95.4, 15.0,  5.3, 39.5,-54.7,-28.5, -0.7,  0.8] [  21.80656,  21.85786, -17.20656,  18.44214]
[ 84.0,-26.8,-98.6,-85.6,-90.1, 30.9,-48.1, 37.2] [ -89.76828, -88.52700, -56.93172,  40.12700]
[ 57.8, 90.4, 53.2,-74.1, 76.4,-94.4,-68.1,-69.3] [  51.50525, -57.26181, -66.40525, -86.13819]
[ 92.9, 69.8,-31.3, 72.6,-49.1,-78.8,-62.3,-81.6] [-123.11680, -23.48435,  29.51680,  14.48435]
[-10.3,-84.5,-93.5,-95.6, 35.0, 22.6, 44.8, 75.5] [ -11.12485,  99.15449, -37.57515,-119.25449]
[ -3.9, 55.8,-83.3,  9.1, -2.7,-95.6, 37.7,-47.8] [ -82.84144, -48.75541,  37.24144,  10.05541]
[-76.5,-88.4,-76.7,-49.9, 84.5, 38.0,  4.2, 18.4] [   6.52461,  15.43907, -79.02461, -46.93907]
[ 64.2,-19.3, 67.2, 45.4,-27.1,-28.7, 64.7, -4.3] [  59.66292,  44.62400,  72.23708,  -3.52400]
[  9.8, 70.7,-66.2, 63.0,-58.7, 59.5, 83.7,-10.6] [  68.07646,  84.95469, -50.57646, -32.55469]
[ 62.9, 46.4, 85.0, 87.4, 36.3,-29.0,-63.0,-56.3] [  23.53487, -86.82822,  -1.53487, 117.92822]
[ -5.5, 35.6, 17.6,-54.3, -2.2, 66.8,-15.2, 11.8] [  24.15112,   7.63786, -21.75112, -50.13786]

সবচেয়ে কম জয়। কোনও ফাঁক নেই।


ডায়াগ্রামের পটভূমির রঙ ঠিক করতে সাহায্য করার জন্য @ আনুশকে ধন্যবাদ

উত্তর:


16

পাইথন 3 , 67 66 বাইট, 53 বাইট

def f(p,v,q,w):p-=q;d=((v-w)/p).real*p;return v-d,w+d

এটি অনলাইন চেষ্টা করুন!

-1 বাইট @nn ধন্যবাদ

-13 বাইট @ নীল ধন্যবাদ

এই ফাংশনটি fচারটি জটিল সংখ্যা ইনপুট হিসাবে নেয় এবং দুটি জটিল সংখ্যা দেয়। নিরবচ্ছিন্ন সংস্করণটি নীচে দেখানো হয়েছে।

Ungolfed

def elastic_collision_complex(p1, v1, p2, v2):
    p12 = p1 - p2
    d = ((v1 - v2) / p12).real * p12
    return v1 - d, v2 + d

এটি অনলাইন চেষ্টা করুন!

গণনার সূত্রটি উইকিতে 2D-ভেক্টর সূত্রের ভিত্তিতে উদ্ভূত । যেহেতু মি1=মি2 , সূত্রটি { v 1 = ভি 1 - ডি ভি ভি 2 = ভি 2 + ডি ভিতে সরল করা যেতে পারে

{বনাম1'=বনাম1-বনামবনাম2'=বনাম2+ +বনাম

যাক এক্স12=এক্স1-এক্স2 এবং বনাম12=বনাম1-বনাম2 , আমরা

বনাম=বনাম12,এক্স12এক্স122এক্স12=আর(বনাম12এক্স12¯)এক্স12এক্স12¯এক্স12=আর(বনাম12এক্স12¯এক্স12এক্স12¯)এক্স12=আর(বনাম12এক্স12)এক্স12

Ungolfed অনুষ্ঠানে p12, v1 - v2, dমিলা এক্স12 , Y12 , এবং বনাম যথাক্রমে।


1
সাবাশ! এই পদ্ধতিরটি রামিলিজের পার্ল6 উত্তর থেকে পৃথক দেখাচ্ছে যা জটিল সংখ্যাও ব্যবহার করে। নীলের জেএস উত্তরের মতো আপনি যদি প্রতিস্থাপন r=p-qকরেন p-=qএবং এর pপরিবর্তে আরও ব্যবহার করেন তবে আপনি বাইট সংরক্ষণ করতে পারেনr
এনজিএন

1
@ জিএন, এটি আলাদা দেখায় তবে এটি একই, যেমন জোয়েল সঠিকভাবে নোট করে। আমি সেই ফর্মুলাটি এমন একটি ফর্মটিতে লিখেছিলাম যা পার্ল 6 গল্ফিংয়ের পক্ষে ভাল ছিল এবং জোয়েল সম্ভবত পাইথনের জন্য আরও ভাল ব্যবহার করেছিল। যাইহোক, আমি ভাবিনি যে পৃথক পৃথকভাবে জটিল সংখ্যা ব্যবহার করে কোনও সমাধান আসবে। ভাল করেছ!
রামিলিজ

3
চমৎকার তবে আপনি যদি প্রশ্নটিতে অ্যালগরিদম ব্যবহার করেন তবে এটি কেবল 53 বাইট লাগবে ...
নিল

1
@ নীল আপনার ইঙ্গিতের জন্য ধন্যবাদ গণনা এখন ব্যাপকভাবে সরল।
জোয়েল

3
আমি আপনার সমস্ত দুর্দান্ত সমাধান এবং বিস্তারিত ব্যাখ্যা পছন্দ করছি!
xnor

11

জাভাস্ক্রিপ্ট (নোড.জেএস) , 90 88 বাইট

(m,n,o,p,q,r,s,t,u=(q-=m)*q+(r-=n)*r,v=o*q+p*r-s*q-t*r)=>[o-(q*=v/u),p-(v*=r/u),s+q,t+v]

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার স্যুট অন্তর্ভুক্ত। ব্যাখ্যা: q,rকেন্দ্রগুলির মধ্যে পার্থক্য ভেক্টর হিসাবে পুনরুত্পাদন করা হয় এবং uএটির দৈর্ঘ্যের বর্গক্ষেত্র। vএর ডট পণ্যে পার্থক্য নেই o,pএবং s,tসঙ্গে q,rতাই হয়, v/uস্কেলিং ফ্যাক্টর জন্য q,rযে থেকে স্থানান্তরিত বেগ পরিমাণ দেয় o,pকরার s,t। সম্পাদনা করুন: @ আরনল্ডকে 2 বাইট সংরক্ষণ করা হয়েছে


আমি আশা করিনি যে এত দ্রুত কেউ অ্যালগরিদমকে সহজতর করবে, ভাল করে! আপনার সমাধানটির এখানে একটি দৃশ্যায়ন রয়েছে (আর্নল্ডের উন্নতির সাথে)
এনজিএন

@ngn ভুল লিঙ্ক?
নীল

@ নীল গিটল্যাবের পাইপলাইন লগ বলছে এটি থাকা উচিত। Ctrl + F5? তীরগুলি লাল বলটি নিয়ন্ত্রণ করে। শিফ্ট ত্বরণ। ফায়ারফক্স এবং ক্রোমিয়াম পরীক্ষিত। সতর্কতা: শব্দ।
এনএনজি

@ জিএন আহ, এখন কাজ করছেন, ধন্যবাদ! (এর আগে আমি একটি ৪০৪ পেয়েছি Also এছাড়াও, আমি একটি ব্যক্তিগত ট্যাব ব্যবহার করছিলাম, তাই ডিফল্টরূপে আমার কোনও শব্দ ছিল না, যদিও আমি এটি অনুপ্রবেশকারী হিসাবে খুঁজে পাইনি And "কী ...)
নিল

8

পার্ল 6 ,75 64 63 61 বাইট

11 বাইট থেকে স্যুইচ করে সংরক্ষণ করা mapহয়েছে for, mapদেখার জন্য মধ্যবর্তী ভেরিয়েবলগুলিতে জিনিসগুলি রাখার প্রয়োজনীয়তার সাথে বিতরণ করা হয়েছে।

পরিবর্তন করে 1 বাইট সংরক্ষণ করা ($^a-$^c)².&{$_/abs}হয়েছে ($^a-$^c).&{$_/.conj}

2 বাইট @ নয়েলহোফের জন্য ধন্যবাদ সংরক্ষণ করেছে।

{(.($^b+$^d,{$_/.conj}($^a-$^c)*($b-$d).conj)/2 for *-*,*+*)}

এটি অনলাইন চেষ্টা করুন!


ব্যাখ্যা

যখন মূল পোস্টটি বলেছিল যে ইনপুটটি জটিল সংখ্যা হতে পারে, তখন এটি প্রতিরোধ করা খুব কঠিন ছিল ... সুতরাং এর জন্য 4 টি জটিল সংখ্যা লাগে (অবস্থান 1, বেগ 1, অবস্থান 2, বেগ 2) এবং জটিল সংখ্যা হিসাবে বেগটি দেয়।

=পি1-পি0

বনাম0/বনাম1/

বনাম0'=(বনাম1+ +আমিবনাম0),বনাম1'=(বনাম0+ +আমিবনাম1)
বনাম0'=(বনাম1+ +আমিবনাম0)=[12(বনাম1+ +বনাম1)+ +12(বনাম0-বনাম0)]= =2(বনাম0+ +বনাম1-বনাম0-বনাম1)=12(বনাম0+ +বনাম1-(বনাম0-বনাম1))
বনাম1'বনাম0বনাম1
বনাম1'=12[বনাম0+ +বনাম1+ +(বনাম0-বনাম1)]

এবং এটাই. সমস্ত প্রোগ্রামটি কেবল এই গণনাটি হয়, কিছুটা গল্ফ করেছে।


খুব ঠান্ডা!
এনএনজি

পার্ল সম্পর্কে আমি বেশি কিছু জানি না, তবে আমি মনে করি আপনি কয়েকটি বাইট সংরক্ষণ করতে দুটি কনজুগেট কম্পিউটেশনকে একের সাথে একীভূত করতে পারেন।
জোয়েল

1
@ জোয়েল - দুঃখের বিষয়, আমি নিশ্চিত যে আমি পারব না। প্রথম সংঘবদ্ধটি অভিনয় করছে ($^a-$^c)(এবং কেবলমাত্র একটি ল্যাম্বডারের অভ্যন্তরে) যা দ্বিতীয়টি কাজ করে ($b-$d)। সুতরাং তারা সত্যিই মিলিত হতে পারে না। আমি এমন একটি ফাংশন তৈরি করতে পারি যা কেবল কল করবে .conj, তবে এটি কেবলমাত্র বাইট যুক্ত করবে (কারণ আমি ভার্ভিয়েবলটি ভারীভাবে ব্যবহার করি $_, যার মধ্যে এমন দুর্দান্ত সম্পত্তি রয়েছে যা আপনি এটি নির্দিষ্ট না করেই পদ্ধতিতে কল করতে পারেন: .conjপরিবর্তে $_.conj)।
Ramillies

@ র্যামিলিস ব্যাখ্যাটির জন্য ধন্যবাদ।
জোয়েল

Magn এর দৈর্ঘ্য কীভাবে প্রাসঙ্গিক? আপনি কেবল δ দ্বারা ভাগ করছেন, আসল উপাদানগুলি স্যুইচ করছেন এবং তারপরে আবার δ দিয়ে গুণাবেন lying
নীল

3

জেলি , 16 বাইট

_/×ḋ÷²S¥_/ʋ¥N,$+

এটি অনলাইন চেষ্টা করুন!

একটি ডায়াডিক লিঙ্কটি তার বাম আর্গুমেন্ট হিসাবে প্রাথমিক অবস্থানগুলির একটি তালিকা [[p0x, p0y], [p1x, p1y]]এবং তার ডান যুক্তিটি প্রাথমিক বেগের তালিকা হিসাবে গ্রহণ করে [[v0x, v0y], [v1x, v2y]]। চূড়ান্ত বেগের একটি তালিকা ফেরত দেয়[[v0x', v0y'], [v1x', v2y']]

@ নীলের জাভাস্ক্রিপ্ট উত্তরের দ্বারা ব্যবহৃত অ্যালগরিদমের ভিত্তিতে তাই সেটিকেও উত্সাহিত করতে ভুলবেন না!


3

সি (জিসিসি) , 140 132 বাইট

f(m,n,o,p,q,r,s,t,a)float*a,m,n,o,p,q,r,s,t;{q-=m;r-=n;m=q*q+r*r,n=o*q+p*r-s*q-t*r;q*=n/m;*a++=o-q;n*=r/m;*a++=p-n;*a++=s+q;*a=t+n;}

এটি অনলাইন চেষ্টা করুন!

মূলত @ নীলের জাভাস্ক্রিপ্ট উত্তরের একটি বন্দর, তবে তারপরে @ সেলিংক্যাট চালাকির সাথে পুনরায় ব্যবহার করে mএবং nঅস্থায়ী সঞ্চয়গুলি সংরক্ষণ করে 8 বাইট বন্ধ করে দিয়েছে ।




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