সম্ভাবনা বিতরণের জন্য একটি এপিআই প্রয়োগ করুন


9

ভূমিকা

এই চ্যালেঞ্জে, আপনার কাজটি হ'ল সাধারণ কার্যকারিতা সংকলন কার্যকর করা যা একসাথে সাধারণ সম্ভাবনা বিতরণের জন্য একটি ব্যবহারযোগ্য মিনি-গ্রন্থাগার গঠন করে। লোকেরা এখানে ব্যবহার করতে পছন্দ করে এমন আরও কয়েকটি গুরূত্বপূর্ণ ভাষার কিছু সমন্বিত করতে, নিম্নলিখিত প্রয়োগগুলি গ্রহণযোগ্য:

  1. নামযুক্ত ফাংশনগুলির (বা নিকটবর্তী সমতুল্য) সংকলন সংজ্ঞায়িত করে একটি কোড স্নিপেট।
  2. নাম প্রকাশিত বা বেনাম ফাংশনগুলিতে (বা নিকটতম সমতুল্য) মূল্যায়নের মত প্রকাশের সংকলন।
  3. একক অভিব্যক্তি যা বেশ কয়েকটি নামযুক্ত বা বেনাম ফাংশন (বা নিকটতম সমমান) এর মূল্যায়ন করে।
  4. কমান্ড লাইন, এসটিডিআইএন বা নিকটতম সমতুল্য এবং এসটিডিআউট বা নিকটতম সমতুল্যে আউটপুট গ্রহণ করে এমন স্বাধীন প্রোগ্রামগুলির সংকলন।

কাজগুলি

আপনি চাইলে সংক্ষিপ্ত নাম ব্যবহার করে নিম্নলিখিত ফাংশনগুলি বাস্তবায়ন করবেন।

  1. uniformইনপুট হিসেবে নেয় দুই ফ্লোটিং পয়েন্ট সংখ্যার aএবং b, এবং আয় অভিন্ন বন্টন [a,b]। আপনি ধরে নিতে পারেন a < b; কেস a ≥ bঅপরিজ্ঞাত
  2. blendইনপুট হিসাবে তিনটি সম্ভাব্যতা বিতরণ হিসাবে গ্রহণ করে P, Qএবং R। এটা একটা সম্ভাব্যতা বিতরণের ফেরৎ S, যা মান স্বপক্ষে x, yএবং zথেকে P, Qএবং Rযথাক্রমে, এবং উৎপাদনের yযদি x ≥ 0, এবং zযদি x < 0
  3. overইনপুট হিসাবে একটি ভাসমান পয়েন্ট নম্বর fএবং সম্ভাব্যতা বিতরণ হিসাবে গ্রহণ করে এবং সম্ভাব্যতাটি Pএনে দেয় যে x ≥ fএলোমেলো সংখ্যার জন্য xআঁকা P

রেফারেন্সের জন্য, overনিম্নলিখিত হিসাবে সংজ্ঞায়িত করা যেতে পারে (সিউডোকোডে):

over(f, uniform(a, b)):
    if f <= a: return 1.0
    else if f >= b: return 0.0
    else: return (b - f)/(b - a)

over(f, blend(P, Q, R)):
    p = over(0.0, P)
    return p*over(f, Q) + (1-p)*over(f, R)

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

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

এই পরীক্ষাগুলির ক্ষেত্রে দশমিক পয়েন্টের পরে আপনার আউটপুট মানগুলি কমপক্ষে দুটি অঙ্কে সঠিক হওয়া উচিত।

over(4.356, uniform(-4.873, 2.441)) -> 0.0
over(2.226, uniform(-1.922, 2.664)) -> 0.09550806803314438
over(-4.353, uniform(-7.929, -0.823)) -> 0.49676329862088375
over(-2.491, uniform(-0.340, 6.453)) -> 1.0
over(0.738, blend(uniform(-5.233, 3.384), uniform(2.767, 8.329), uniform(-2.769, 6.497))) -> 0.7701533851999125
over(-3.577, blend(uniform(-3.159, 0.070), blend(blend(uniform(-4.996, 4.851), uniform(-7.516, 1.455), uniform(-0.931, 7.292)), blend(uniform(-5.437, -0.738), uniform(-8.272, -2.316), uniform(-3.225, 1.201)), uniform(3.097, 6.792)), uniform(-8.215, 0.817))) -> 0.4976245638164541
over(3.243, blend(blend(uniform(-4.909, 2.003), uniform(-4.158, 4.622), blend(uniform(0.572, 5.874), uniform(-0.573, 4.716), blend(uniform(-5.279, 3.702), uniform(-6.564, 1.373), uniform(-6.585, 2.802)))), uniform(-3.148, 2.015), blend(uniform(-6.235, -5.629), uniform(-4.647, -1.056), uniform(-0.384, 2.050)))) -> 0.0
over(-3.020, blend(blend(uniform(-0.080, 6.148), blend(uniform(1.691, 6.439), uniform(-7.086, 2.158), uniform(3.423, 6.773)), uniform(-1.780, 2.381)), blend(uniform(-1.754, 1.943), uniform(-0.046, 6.327), blend(uniform(-6.667, 2.543), uniform(0.656, 7.903), blend(uniform(-8.673, 3.639), uniform(-7.606, 1.435), uniform(-5.138, -2.409)))), uniform(-8.008, -0.317))) -> 0.4487803553043079

2
সেগুলি তৈরি করার জন্য কি আমরা অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করতে পারি?
মুতাদোর

@ অ্যান্ড্রু মুটা আমি ভুলে গিয়েছিলাম যে ম্যাথমেটিকা ​​সম্ভবত এই সমস্তগুলির জন্য বিল্ট-ইনস রেখেছেন ... তবে আমি যতক্ষণ না তারা বিধিগুলি অনুসরণ করে ততক্ষণ তাদের অনুমতি দেব going
জাগারব

ব্রেইনফাকে ভাসমান পয়েন্ট ডেটা উপস্থাপন করার বিষয়ে আপনার পরামর্শ কী?
flawr

@ ফ্লোয়ার যে ভাষাগুলির নেটিভ ফ্লোটিং পয়েন্ট সংখ্যা নেই, আপনি ধারাবাহিক মানের মধ্যে সর্বাধিক 0.001 পার্থক্য থাকা -10.0 এবং 10.0 (একচেটিয়া) এর মধ্যে ভাসমানগুলির জন্য কোনও সুবিধাজনক এনকোডিং ব্যবহার করতে পারেন। পরীক্ষার ক্ষেত্রে ফলাফল আউটপুট 0.01 এর মধ্যে সঠিক হওয়া উচিত।
Zgarb

উত্তর:


1

সিজেম, 58 বাইট

{[\]}:U;
{[@]}:B;
{_,2={~1$-@@-\/0e>1e<}{6Yb@f*\.{O})[_1@-].*:+}?}:O;

এগুলি পোস্টফিক্স অপারেটর যা স্ট্যাকের উপর কাজ করে: 2.0 1.0 3.0 U Oহয় over(2, uniform(1, 3))

স্কোর গণনা

{[\]}এটি ফাংশনটি নিজেই হয়, :U;এটি নামটিতে নির্ধারণ করে Uএবং এটি পপ করে। মূলত এটি ফাংশনের অংশ নয়, সুতরাং স্কোর গণনা বিধি 2 দ্বারা, আমাকে কেবল গণনা করতে হবে {[\]}Bএকইভাবে সংজ্ঞায়িত করা হয়।

যাইহোক, Oপুনরাবৃত্তিযোগ্য, এবং যদি আমি কোনও নাম নির্দিষ্ট না করি তবে পুনরাবৃত্তি করার কোনও উপায় নেই। সুতরাং এখানে, আমি :O;অংশ গণনা ঝুঁকতে হবে । তারপরে আমার স্কোর 5+5+48=58মোট বাইটস।

ব্যাখ্যা

Uদুটি আর্গুমেন্ট পপ আপ এবং বিপরীত ক্রম একজোড়া করে তোলে: a b => [b a]

Bতিন আর্গুমেন্ট পপ আপ এবং আবর্তিত অনুক্রমে ট্রিপল তোলে: a b c => [b c a]

Oএর কাঠামোটি নিম্নরূপ:

{             }:O;   Define O as this function:
 _,2=        ?       If the argument list's length is 2:
     {~Γ}            Append the list to the stack and execute subprogram Γ.
         {~Δ}        Else, do the same, but execute subprogram Δ.

Subprogram Γ অভিন্ন ডিস্ট্রিবিউশন হ্যান্ডলগুলি:

Executed ops      Explanation   Stack contents
============      ===========   ==============
                  Initial       f; b; a
1$                Copy b        f; b; a; b
  -               Difference    f; b; (a-b)
   @@             Rotate x2     (a-b); f, b
     -            Difference    (a-b); (f-b)
      \/          Flip divide   (f-b)/(a-b)
        0e>       Clamp low     max(0, (f-b)/(a-b))
           1e<    Clamp high    min(1, max(0, (f-b)/(a-b)))

Subprogram Δ মিশ্র ডিস্ট্রিবিউশন হ্যান্ডলগুলি:

Executed ops              Explanation    Stack contents
============              ===========    ==============
                          Initial        f; [Q R P]
6Yb                       Push [1,1,0]   f; [Q R P]; [1 1 0]
   @                      Rotate         [Q R P]; [1 1 0]; f
    f*                    Multiply each  [Q R P]; [f f 0]
      \                   Swap           [f f 0]; [Q R P]
       .{O}               Pairwise O     [q r p]
           )              Uncons         [q r] p
            [_1@-]        [p, 1-p]       [q r] [p 1-p]
                  .*:+    Dot product    q*p+r*(1-p)

2

রুবি, 103

u=b=->*a{a}
o=->f,d{d[2]?(p=o[0,d[0]])*o[f,d[1]]+(1-p)*o[f,d[2]]:(f<a=d[0])?1:(f>b=d[1])?0:(b-f)/(b-a)}

সংজ্ঞায়িত তিন lambdas, u, b, এবং ouএবং bকেবল যথাক্রমে দ্বি-উপাদান এবং ত্রি-উপাদান অ্যারে তৈরি করুন। oধরে নেওয়া হয় একটি দ্বি-উপাদান অ্যারেটি অভিন্ন বিতরণ এবং একটি ত্রি-উপাদান একটি তিনটি বিতরণের একটি মিশ্রণ। পরবর্তী ক্ষেত্রে এটি নিজেকে পুনরাবৃত্তি বলে।


2

ম্যাটল্যাব, 73

ম্যাটল্যাবে সামান্য "ফাংশনাল প্রোগ্রামিং" এর জন্য সময়। এটি 3 বেনামে ফাংশন। ইউনিফর্ম এবং মিশ্রণগুলিকে উদাহরণ হিসাবে একইভাবে বলা হয়, তবে overযুক্তিগুলির জন্য অদলবদল করা উচিত। overপ্রথম দুটি রিটার্ন ফাংশন থেকে আমার আসলেই দরকার নেই , তবে আনুষ্ঠানিকতা fevalহিসাবে একটি ফাংশন যা কোনও ফাংশনকে কল করতে পারে।

%uniform
@(a,b)@(x)(x<b)*min(1,(b-x)/(b-a))
%blend
@(P,Q,R)@(x)P(0)*(Q(x)-R(x))+R(x)
%over
@feval

এখন ম্যাটল্যাবের পার্সিং এবং মূল্যায়ন সিস্টেমটি কমপক্ষে বলতে গেলে কিছুটা খারাপ। এটি আপনাকে কোনও ক্রিয়াকলাপ থেকে ফিরে আসা কোনও ফাংশনটিতে সরাসরি কল করতে দেয় না। পরিবর্তে, প্রথমে ফলাফলটি পরিবর্তনশীলে সংরক্ষণ করতে হবে। চতুর্থ উদাহরণ নিম্নরূপ করা যেতে পারে:

x=uniform(-5.233,3.384);y=uniform(2.767,8.329);z=uniform(-2.769,6.497);over(blend(x,y,z),0.738)

যাইহোক, fevalসমস্ত ফাংশন কল করে এটির কাছাকাছি যাওয়া সম্ভব । যদি নিম্নলিখিত সংজ্ঞাগুলি ব্যবহার করা হয়, তবে উদাহরণগুলি যেমন লেখা হয় ঠিক তেমন মূল্যায়ন করা যায়।

uniform=@(a,b)@(x)(x<b)*min(1,(b-x)/(b-a))
blend=@(P,Q,R)@(x)feval(P,0)*(feval(Q,x)-feval(R,x))+feval(R,x)
over=@(x,f)feval(f,x)

ফাংশন তৈরি করে ফাংশন ... কতটা বিকৃত!
লুইস মেন্ডো

1

গণিত, 129 116 বাইট

u=UniformDistribution@{##}&;b=If[x<0,z,y]~TransformedDistribution~{x\uF3D2#,y\uF3D2#2,z\uF3D2#3}&;o=Probability[x>=#,x\uF3D2#2]&

u, bএবং oহয় uniform, blendএবং overমান ফাংশন উপর respectively.Wrapper। এসটি \uF3D23-বাইট চরিত্রের সাথে প্রতিস্থাপন করুন । কেবল ফিরে আসে 0এবং 11, 4, এবং 7 এর ক্ষেত্রে।


1

পাইথন, 146 বাইট

u=lambda*a:a
b=u
x=lambda f,a,b:[int(f<=a),(b-f)/(b-a)][a<f<b]
y=lambda f,p,q,r:o(0,p)*o(f,q)+(1-o(0,p))*o(f,r)
o=lambda f,p:[x,y][len(p)-2](f,*p)

হিস্ট্রোক্রেটের রুবি উত্তর হিসাবে একই কৌশল, তবে পাইথনে। জেড-কম্বিনেটর ছাড়াই পুনরাবৃত্তি করা (যা ব্যয়বহুল হবে), xএবং yসহায়তাকারী ফাংশন হিসাবে সংজ্ঞায়িত করা হয় যা over2- এবং 3-দৈর্ঘ্যের আর্গুমেন্ট টিপলস ( uniformএবং blendযথাক্রমে আর্গুমেন্ট) এর জন্য মূল্যায়ন করে ।

আদর্শের উপর পরীক্ষার মামলাগুলি


0

মতলব, 104 বাইট

আমি আশা করি এটি এখনও বৈধ, কারণ এটি কেবলমাত্র [-10,10] সমর্থন সহ বিতরণের জন্য কাজ করে যা এমন ভাষাগুলির জন্য প্রয়োজনীয় যেগুলির কোনও ভাসমান পয়েন্ট সমর্থন নেই। সমর্থন ভেক্টর এবং নির্ভুলতা সহজেই কেবলমাত্র সংখ্যার পরিবর্তন করে সামঞ্জস্য করা যায়। u,o,bজন্য uniform,blend,over। পিডিএফটি কেবল একটি পৃথক ভেক্টর হিসাবে উপস্থাপিত হয়। আমি মনে করি এই পদ্ধতিটি সহজেই অন্য ভাষায় স্থানান্তরিত হতে পারে।

D=1e-4;X=-10:D:10;
u=@(a,b)(1/(b-a))*(a<X&X<b);
o=@(x,d)sum(d.*(X>x))*D;
b=@(p,q,r)o(0,p).*q+(1-o(0,p)).*r;

আপনি যদি প্রথমে এই ফাংশনগুলি সংজ্ঞায়িত করেন এবং তারপরে কেবল এই কোডটি আটকে দিন তবে আপনি সেগুলি পরীক্ষা করতে পারেন:

[o(4.356, u(-4.873, 2.441)) , 0.0;
o(2.226, u(-1.922, 2.664)) , 0.09550806803314438;
o(-4.353, u(-7.929, -0.823)) , 0.49676329862088375;
o(-2.491, u(-0.340, 6.453)) , 1.0;
o(0.738, b(u(-5.233, 3.384), u(2.767, 8.329), u(-2.769, 6.497))) , 0.7701533851999125;
o(-3.577, b(u(-3.159, 0.070), b(b(u(-4.996, 4.851), u(-7.516, 1.455), u(-0.931, 7.292)), b(u(-5.437, -0.738), u(-8.272, -2.316), u(-3.225, 1.201)), u(3.097, 6.792)), u(-8.215, 0.817))) , 0.4976245638164541;
o(3.243, b(b(u(-4.909, 2.003), u(-4.158, 4.622), b(u(0.572, 5.874), u(-0.573, 4.716), b(u(-5.279, 3.702), u(-6.564, 1.373), u(-6.585, 2.802)))), u(-3.148, 2.015), b(u(-6.235, -5.629), u(-4.647, -1.056), u(-0.384, 2.050)))) , 0.0;
o(-3.020, b(b(u(-0.080, 6.148), b(u(1.691, 6.439), u(-7.086, 2.158), u(3.423, 6.773)), u(-1.780, 2.381)), b(u(-1.754, 1.943), u(-0.046, 6.327), b(u(-6.667, 2.543), u(0.656, 7.903), b(u(-8.673, 3.639), u(-7.606, 1.435), u(-5.138, -2.409)))), u(-8.008, -0.317))) , 0.4487803553043079]

মতলব এফপি সমর্থন আছে, তাই আমি মনে করি এটি অবৈধ হবে।
LegionMammal978

আমি এটি অনুমতি দিতে দ্বিধাগ্রস্থ, যেহেতু মতলব ভাসমান পয়েন্ট সংখ্যাটি স্থানীয়ভাবে সমর্থন করে। যদি আপনি প্রতিস্থাপন করতে পারেন Xএবং এর Dসাথে MIN_FLOATএবং MAX_FLOAT(বা যা মাতলাব তাদের ডাকবে), তবে এটি একটি বৈধ পন্থা।
Zgarb

হ্যাঁ, আপনি আটকাতে পারবেন realmax/ realmin, আপনি এমন ভেক্টরও তৈরি করতে পারেন যা আপনার পর্যাপ্ত স্মৃতিশক্তি থাকলে সমস্ত ভাসমান পয়েন্ট নম্বর ছুঁড়ে দেয়।
flawr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.