বিপরীতে ইঞ্জিনিয়ার পোলিংয়ের পরিসংখ্যান


22

ভূমিকা

কোনও জরিপে শতকরা শতাংশের পছন্দের সেট দেওয়া, সেই পরিসংখ্যান তৈরি করার জন্য সেখানে সর্বনিম্ন ভোটারদের অবশ্যই গণনা করতে হবে।

উদাহরণ: আপনার প্রিয় পোষা প্রাণীটি কী?

  • কুকুর: 44.4%
  • বিড়াল: 44.4%
  • মাউস: 11.1%

আউটপুট: 9(সর্বনিম্ন সম্ভাব্য # ভোটার)

চশমা

আপনার প্রোগ্রাম / ফাংশনের জন্য এখানে প্রয়োজনীয়তা রয়েছে:

  • আপনাকে ইনপুট হিসাবে শতাংশ মানের একটি অ্যারে দেওয়া হবে (স্টিডিনে, ফাংশন আর্গুমেন্ট হিসাবে, ইত্যাদি)
  • প্রতিটি শতাংশের মান হ'ল একটি দশমিক স্থানে গোল করে এমন একটি সংখ্যা (যেমন, 44.4 44.4 11.1)।
  • জরিপে সর্বনিম্ন সম্ভাব্য ভোটারদের গণনা করুন যার ফলাফলগুলি যখন এক দশমিক স্থানে (স্টাডাউট বা ফাংশন রিটার্ন মান হিসাবে) হয় তখন সেই সঠিক শতাংশটি পাওয়া যায়।
  • বোনাস : -১৫ টি অক্ষর যদি আপনি "অ-তুচ্ছ" উপায়ে সমাধান করতে পারেন (যেমন, সম্ভাব্য # ভোটারদের মধ্যে পুনরাবৃত্তি জড়িত না যতক্ষণ না আপনি কাজ করে এমন প্রথমটি খুঁজে পান)

উদাহরণ

>./pollreverse 44.4 44.4 11.1
9
>./pollreverse 26.7 53.3 20.0
15
>./pollreverse 48.4 13.7 21.6 6.5 9.8
153
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6
2000
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7
667
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7
2000
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8
401

স্কোরিং

এটি কোড-গল্ফ, তাই সংক্ষিপ্ততম অক্ষরের জয়। কোনও বোনাস মোট অক্ষর গণনা থেকে আরও বিয়োগ করা হয়।


2
আমি মনে করি এটি পরীক্ষার জন্য আরও কয়েকটি বিশ্রী মামলার সাথে করতে পারে। 26.7 53.3 20.0(15 এর 4 8 3), 48.4 13.7 21.6 6.5 9.8(74 21 33 10 15 15 এর 15) ইত্যাদি
গ্যারেথ

@ গ্যারেথ: ভাল চিন্তা আপনার পরীক্ষার কেসগুলির সাথে আপডেট হয়েছে।
মেল্লামোকব

সমস্ত ভোটের যোগফল 100% হওয়া উচিত নয়? এটি শেষ চারটি
টেস্টকেসে নেই

@ গেজেট: না এটি সর্বদা 100% এর সমান হয় না। প্রতিবার যখন কোনও গোলটি ডাউন হয় তখন আপনি মোটটি হারাবেন 0.5%এবং প্রতিবার কোনও গোল করার সময় আপনি মোটটি যোগ করবেন 0.5%। সর্বশেষ চারটি পরীক্ষার ঘটনাটি এই ঘটনাকে সর্বোত্তমভাবে কাজে লাগাতে উদ্দেশ্যমূলকভাবে নির্মিত হয়েছিল। প্রথম পরীক্ষার ফলস্বরূপ 2000, প্রথম 9 টি প্রবেশের প্রতিটি 1ভোটের প্রতিনিধিত্ব করে (এবং সবগুলি বৃত্তাকার হয় 0.5%), যেখানে সর্বশেষটি 1991ভোটের প্রতিনিধিত্ব করে (এবং এটি গোলাকার ~ 0.5%)। যদি আপনি সেই শতাংশগুলি ম্যানুয়ালি এবং 1 দশমিক জায়গায় গোল করে গণনা করেন তবে আপনি দেখতে পাবেন যে সেগুলি সমস্ত ঠিক।
মেল্লামোকব

আমি ভিবিএতে অপ্রয়োজনীয় উত্তরের সাথে লড়াই করছি (এখনও পর্যন্ত চেষ্টা করছি, কিছুই নেই) তবে আমি এতে কাজ করছি!
গাফী

উত্তর:


2

এপিএল (ডায়ালগ ক্লাসিক) , 48 43 বাইট

অ্যাডাম -5 বাইট

+/0(⊢+{(⌈/⍷⊢)⍺-⍵÷+/⍵})⍣{z≡⍎3⍕⍺÷+/⍺}⍨z←.01×⎕

স্টিডিনের কাছ থেকে সম্পূর্ণ প্রোগ্রাম ইনপুট নিচ্ছে।

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি ডিএফএন সংস্করণে রয়েছে।

Ungolfed

normalize   ÷ +/
find_max  {⍵⍷⍨⌈/⍵}
round  {⍎3⍕⍵}
increase  {find_max  - normalize ⍵}
vote_totals  {z←⍺   (⊢+increase)⍣{z  round normalize ⍺} ⍵}
h  {+/ (.01×⍵) vote_totals 0}

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

  • normalize( ÷) এর ডান আর্গুমেন্টের সমস্ত উপাদান ( ) এর যোগফল ( +/) দ্বারা ভাগ করে ।
  • round(y)( ) বিন্যাস করে এবং তারপরে y এর প্রতিটি উপাদানকে মূল্যায়ন করে y থেকে 3 দশমিক স্থানে গোল করে ।
  • find_max(y) সর্বাধিক (y) এবং অন্য কোথাও 0 পাওয়া যায় এমন 1 দিয়ে একটি অ্যারের প্রদান করে।
  • increase(x,y) x (লক্ষ্য শতাংশ) এবং y নেয় (বর্তমান ভোটের মোটের অ্যারে) এবং শতাংশটি x এর কাছাকাছি আনতে যেখানে y তে 1 যুক্ত করতে হবে তা গণনা করে।
  • vote_totals(x,y) এক্স (লক্ষ্য শতাংশ) এবং y (শুরু ভোটের মোট) গ্রহণ করে এবং বারবার চ চালায়, এক্স এর সাথে শতকরা শতাংশ না হওয়া পর্যন্ত ভোট যোগ করে।
    • বাক্য গঠনটির f ⍣ gঅর্থ সত্য fহওয়া পর্যন্ত বারবার সম্পাদন g(y,f(y))করা। এই ক্ষেত্রে আমরা উপেক্ষা করি f(y)
  • h(x) y কে 0 সেট করে (ভেক্টরাইজেশনের কারণে 0 এর অ্যারের সমতুল্য), জি কার্যকর করে এবং চূড়ান্ত ভোটের যোগফলের যোগফল দেয়।

7

পাইথন, 154

def p(x):
 n=[1]*len(x);d=2;r=lambda z:round(1000.*z/d)/10
 while 1:
    if(map(r,n),sum(n))==(x,d):return d
    d+=1
    for i in range(len(x)):n[i]+=r(n[i])<x[i]

এটি এখন শেষ উদাহরণের জন্য কাজ করে।

উদাহরণ রান:

>>> p([44.4, 44.4, 11.1])
9
>>> p([26.7, 53.3, 20.0])
15
>>> p([48.4, 13.7, 21.6, 6.5, 9.8])
153
>>> p([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 99.6])
2000
>>> p([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 98.7])
667
>>> p([0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 98.7])
2000
>>> p([0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 97.8])
401

আমি মনে করি আপনার শেষ উদাহরণে কিছু ভুল হতে পারে; সম্ভবত আপনি 99.1সর্বশেষ মান হিসাবে বোঝাতে চেয়েছিলেন
ক্রিশ্চিয়ান লুপাস্কু

2
আমি মনে করি এটি সঠিক তবে এটি বেশ বিভ্রান্তিকর। 1/2000 = 0.05%( 0.1%বৃত্তাকার) এবং 1991/2000 = 99.55%( 99.6%বৃত্তাকার) সুতরাং যদি কোনও জরিপে দশটি বিকল্প থাকে এবং তাদের মধ্যে নয়টি একবার ভোট দেয় এবং সর্বশেষটি ১৯৯১ এর ভোট পায়, তবে এটি সেই শতাংশ দেবে।
grc

তুমি ঠিক বলছো. দুর্দান্ত সমাধান, বিটিডাব্লু।
ক্রিশ্চিয়ান লুপাস্কু

আমি মনে করি আপনি এই টিপ অনুসরণ করে আরও 3 টি অক্ষর বাঁচাতে পারবেন: কোডগলফ.স্ট্যাকেক্সেঞ্জার
ক্রিশ্চিয়ান লুপাস্কু

ধন্যবাদ, w0lf। ট্যাবগুলি অন্তর্ভুক্ত করার জন্য আমি এখনই এটি আপডেট করেছি। যদি কারও অবাক হয় তবে ট্যাবগুলি চারটি স্পেস হিসাবে দেখায়।
grc

4

জে, 57 টি অক্ষর

t=:".>'1'8!:0|:100*%/~i.1001
{.I.*/"1(t{~i.#t)e."1~1!:1[1

তুচ্ছ পদ্ধতি ব্যবহার করেছেন। এটি কীবোর্ড থেকে ইনপুট নেয়। tএকটি সন্ধানের টেবিল তৈরি করে এবং দ্বিতীয় লাইনটি সারণির মধ্যে ইনপুটটির সন্ধান করে। কারও আগ্রহী হলে আমি কোডটির একটি বর্ধিত ব্যাখ্যা সরবরাহ করতে পারি।

আমি শতাংশটি ভগ্নাংশ তৈরির জন্য ব্যবহার করে এর পরে সংখ্যাটি বের করার জন্য ভগ্নাংশের সর্বনিম্ন ফর্মটি পেয়েছি, তবে ফলাফলের বৃত্তাকার সাথে এটি কার্যকর করার কোনও উপায় আমি বের করতে পারিনি।


হুঁ, এটি নতুন পরীক্ষার ক্ষেত্রে ব্যর্থ। আমাকে ঠিক করতে হবে
গ্যারেথ

4

পাইথন, 154

def r(l):
 v=0
 while 1:
  v+=1;o=[round(y*v/100)for y in l];s=sum(o)
  if s: 
    if all(a==b for a,b in zip(l,[round(y*1000/s)/10for y in o])):return s

+1 দেখতে ভাল লাগছে! ideone.com/k2Mgb । এটিকে ভেঙে দেওয়ার জন্য আমি কোনও প্যাথলজিকাল কেস খুঁজতে চেষ্টা করেছি এবং আমি পারিনি।
মেল্লামোকব

সময়-সীমা অতিক্রম করার কারণে আমি আদর্শে উত্পন্ন করতে পারছি না, তবে আপনি কী ফলাফল পেতে পারেন [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,99.6]?
মেল্লামোকব

হুম ... আধা ঘন্টা এবং প্রোগ্রামটি এখনও চলছে। আমি এটি সম্ভবত একটি ব্রেকার বলা নিরাপদ বলে মনে করি। তবে, আমি দেখতে পাচ্ছি না যে এটি কীভাবে বৈধ উত্তর হতে পারে কারণ এটি মোট 100.5% এবং 100% নয়
ব্লেজার

2
1/2000 = 0.05%( 0.1%বৃত্তাকার) এবং 1991/2000 = 99.55%( 99.6%বৃত্তাকার) সুতরাং এটি আসলে মোট 100% করে তবে গোলাকর্ষণ এটি সত্যই বিভ্রান্তিকর করে তোলে।
grc

3

ভিবিএ - 541

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

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

বেশিরভাগ কাজের ক্ষেত্রে প্রদত্ত সংখ্যার সেটটির জন্য জিসিডি সন্ধান করা জড়িত, এবং আমি তা পেয়েছি Function g(), যদিও এটি নিশ্চিত অসম্পূর্ণ এবং সম্ভবত আমার আউটপুটগুলিতে কমপক্ষে কিছু ত্রুটির একটি উত্স।

ইনপুট মানগুলির একটি স্পেস-সীমাবদ্ধ স্ট্রিং।

Const q=10^10
Sub a(s)
e=Split(s)
m=1
f=UBound(e)
For i=0 To f
t=1/(e(i)/100)
m=m*t
n=IIf(n>t Or i=0,t,n)
x=IIf(x<t Or i=0,t,x)
Next
h=g(n,x)
i=(n*x)/(h)
If Int(i)=Round(Int(i*q)/q) Then
r=i
ElseIf (n+x)=(n*x) Then
r=(1/(n*x))/h/m
ElseIf x=Int(x) Then
r=x*(f+1)
Else
z=((n+x)+(n*x)+m)*h
y=m/(((m*h)/(f+1))+n)
r=IIf(y>z,z,y)
End If
Debug.Print Round(r)
End Sub
Function g(a,b)
x=Round(Int(a*q)/q,3)
y=Round(Int(b*q)/q,3)
If a Then
If b Then
If x>y Then
g=g(a-b,b)
ElseIf y>x Then
g=g(a,b-a)
Else
g=a
End If
End If
Else
g=b
End If
End Function

পরীক্ষাগুলি (ইনপুট ==> প্রত্যাশিত / প্রত্যাবর্তিত):

Passed:  

"95 5" ==> 20/20
"90 10" ==> 10/10
"46.7 53.3" ==> 15/15
"4.7 30.9 40.4 23.8" ==> 42/42
"44.4 44.4 11.1" ==> 9/9
"26.7 53.3 20.0" ==> 15/15
"48.4 13.7 21.6 6.5 9.8" ==> 153/153
"0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 99.55" ==> 2000/2000
"0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 98.65" ==> 2000/2000
"0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 98.65067" ==> 667/667


Failed:  

"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6" ==> 2000/1000
"0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7" ==> 2000/5000
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7" ==> 667/1000
"0.14 0.14 0.14 0.14 0.14 0.14 0.14 0.14 0.14 98.65" ==> 667/10000
"0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8" ==> 401/500
"0.24 0.24 0.24 0.24 0.24 0.24 0.24 0.24 0.24 97.75" ==> 401/235
"0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 97.75561" ==> 401/14010

আপনি রূপান্তর 6 বাইট আলগা করতে Debug.Print করতেDebug.?
টেলর স্কট

2

সি # (.নেট কোর) , 286 বাইট

double M(string[]a){var p=a.Select(double.Parse).ToList();var n=p.Select(x=>1d).ToList();var c=2;for(;;){Func<double,double>f=x=>Math.Round(x*1000/c,(MidpointRounding)1)/10;if(n.Select(f).Zip(p,(x,y)=>x==y).All(z=>z)&&c==n.Sum())return c;c++;n=n.Zip(p,(x,y)=>x+(f(x)<y?1:0)).ToList();}}

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

পিটার টেলর এবং অজ্ঞতার মূর্ত প্রতীককে প্রচুর বাইট সংরক্ষণ করেছেন


আইডোন.কম এ এটি পরীক্ষা করার জন্য আমি কীভাবে এটি পরিবর্তন করতে পারি?
গ্যারেথ

আমি মনে করি আপনি }শেষে একটি অনুপস্থিত ।
grc

@ গ্যারেথ আমি আইডোন.কম এ এটি সম্পাদন করার চেষ্টা করেছি, তবে আমি মনে করি এটি 4.0 এর আগে একটি নেট নেট ফ্রেমওয়ার্ক সংস্করণ ব্যবহার করছে, কারণ এটি লিনক Zipপদ্ধতিটি স্বীকৃতি দেয় না ।
ক্রিশ্চিয়ান লুপাস্কু

@grc এটি উল্লেখ করার জন্য ধন্যবাদ। আপডেট করা হয়েছে।
ক্রিশ্চিয়ান লুপাস্কু

1
@ গাফি: না, সি # এর কঠোর টাইপিং রয়েছে (জাভা এর মতো) সুতরাং এটি অবশ্যই একটি বুলিয়ান হতে হবে। যেহেতু এর 1>0চেয়ে খাটো true, এটি পছন্দসই।
মেল্লামোকব

0

পাইথন 3 , 140 139 137 বাইট

f=lambda l,m=1,i=0,c=0,x=0:round(x*100,1)-l[i]and(x<1and f(l,m,i,c,x+1/m)or f(l,m+1))or l[i+1:]and f(l,m,i+1,c+x)or c+x-1and f(l,m+1)or m

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

প্রথম দুটি পরীক্ষার ক্ষেত্রে সঠিক উত্তর দেয় এবং অন্যদের জন্য পাইথনের পুনরাবৃত্তি সীমাতে চলে আসে। যেহেতু এটি খুব অবাক হয় না প্রতিটি চেক নতুন পুনরাবৃত্তির স্তরে তৈরি করা হয়। এটি সংক্ষিপ্ত, যদিও ...

(ব্যবহৃত ভেরিয়েবলগুলির ব্যাখ্যা টিআইও লিঙ্কে পাওয়া যাবে)

f=lambda l,m=1,i=0,c=0,x=1:round(x*100,1)-l[i]and(x and f(l,m,i,c,x-1/m)or f(l,m+1))or l[i+1:]and f(l,m,i+1,c+x)or c+x-1and f(l,m+1)or m

136 বাইটের জন্য কাজ করা উচিত , তবে ভাসমান নির্ভুলতার কারণে নয়।

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