নির্বাচনের সময়!


13

সময় এসেছে ... ভোট গণনা করার!

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

এই পদ্ধতির জন্য বিতরণ করার জন্য নির্দিষ্ট সংখ্যক আসন রয়েছে এবং এটি এর মতো হয়ে গেছে:

  1. প্রতিটি দলকে একটি পরিবর্তনশীল নম্বর বরাদ্দ করা হয়, যা এটি পেয়েছে ভোটের সংখ্যা থেকে শুরু হয়।
  2. তারপরে প্রথম আসনটি সেই দলের কাছে দেওয়া হয় যার ভেরিয়েবলের সর্বাধিক মূল্য রয়েছে এবং তারপরে সেই দলের জন্য সেই মানটি তাদের মোট ভোটের সংখ্যা হয়ে যায় বিভক্ত 1+seats, গোল করে, সেখানে seatsইতিমধ্যে রয়েছে আসন সংখ্যা কোথায় (তাই পাওয়ার পরে? প্রথমত, তাদের ভোটগুলি 2 দ্বারা ভাগ করা হয়, এবং দ্বিতীয় আসন পাওয়ার পরে 3 দ্বারা)।
  3. এরপরে দলগুলোর ভোট আবার তুলনা করা হয়। সমস্ত আসন নির্ধারিত না হওয়া পর্যন্ত প্রক্রিয়াটি অব্যাহত থাকে।

সর্বাধিক সংখ্যাটি যদি দুটি বা ততোধিক দলের মধ্যে একটি টাই হয় তবে তা এলোমেলোভাবে সমাধান করা হবে (এটি এলোমেলোভাবে হতে হবে, এটি তালিকার দুটিতে প্রথম হতে পারে না)।

ইনপুট

আপনি একটি নম্বর পাবেন Nযা উপলব্ধ আসনগুলির সংখ্যা এবং প্রতিটি পক্ষ প্রাপ্ত ভোটের একটি তালিকা, আপনি যে কোনও ফরম্যাটে পছন্দ করুন indicate উদাহরণ:

25
12984,7716,13009,4045,1741,1013

আউটপুট

আপনার প্রতিটি দলের প্রাপ্ত আসনগুলির একটি তালিকা আউটপুট করা উচিত। উপরের উদাহরণে এটির মতো কিছু হবে

8,5,9,2,1,0

সেগুলি ইনপুটটিতে থাকা পক্ষের মতো একই ক্রমে হওয়া উচিত।

উদাহরণ

5
3,6,1

outputs: 2,3,0

135
1116259,498124,524707,471681,359705,275007,126435

outputs: 45,20,21,19,14,11,5

বোনাস

-20% বোনাস যদি পক্ষগুলির নাম ইনপুট হিসাবে নেয় এবং তাদের আউটপুট দেয়, উদাহরণস্বরূপ:

25
cio:12984,pcc:7716,irc:13009,icb:4045,cub:1741,bb:1013

outputs

cio:8
pcc:5
irc:9
icb:2
cub:1
bb:0

আমি মনে করি আমরা ইতিমধ্যে এরকম কিছু করেছি
edc65

আমি সন্ধানে অভিন্ন কিছু খুঁজে পেলাম না ... তবে আপনি যদি কিছু খুঁজে পান তবে আমি এটি পরিবর্তন করব বা প্রশ্নটি সরিয়ে ফেলব, কোনও সমস্যা নেই!
rorlork

@rcrmn আপনার শেষ উদাহরণটিতে কিছু ভুল আছে। হতে পারে আপনি পরিবর্তে 153 মোট আসন 135. বোঝানো
Tyilo

@ টিইলো ঠিক! আমি আমার পরীক্ষামূলক প্রোগ্রামে এটি ভুল লিখেছি এবং ডাবল-চেকিং ছাড়াই উত্তরগুলি অনুলিপি করেছি। এটি এখন স্থির। ধন্যবাদ!
rorlork

1
ধন্যবাদ @ জাকুবে, আমি যে প্রোগ্রামটি গণনা করতাম তাতে সমস্যা ছিল যা লেবেলযুক্ত আসনে আউটপুট অর্ডার করেছিল। ডেনিস আপনি যে কোনও ক্রমে এটি ফিরিয়ে দিতে পারবেন, যেহেতু লেবেলটি সনাক্তকারী হিসাবে কাজ করে। আপনার যদি এটি সহজ হয় তবে আপনার কেবলমাত্র অক্ষর রয়েছে তা ধরে নিতে পারেন।
rorlork

উত্তর:


6

সিজেএম, 35.2 28.8 28.0 26.4

q2*~,m*mr{~)f/1=~}$<:(f{1$e=1\tp}

এই সম্পূর্ণ প্রোগ্রামটি 33 বাইট দীর্ঘ এবং বোনাসের জন্য যোগ্যতা অর্জন করে।

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

উদাহরণ রান

$ cjam seats <<< '[["cio"12984]["pcc"7716]["irc"13009]["icb"4045]["cub"1741]["bb"1013]]25'
["cio" 8]
["pcc" 5]
["irc" 9]
["icb" 2]
["cub" 1]
["bb" 0]

কিভাবে এটা কাজ করে

q2*~   e# Repeat the input from STDIN twice. Evaluate.
       e# STACK: Array seats Array seats
,      e# Range: seats -> [0 ... seats-1]
m*     e# Take the cartesian product of the array from the input and the range.
mr     e# Shuffle the array. This makes sure tie breakers are randomized.
{      e# Sort by the following key:
  ~    e#     Dump: [["party" votes] number] -> ["party" votes] number
  f/   e#     Divide each: ["party" votes] number -> ["party"/number votes/number]
  1=   e#     Select: ["party"/number votes/number] -> votes/number
  ~    e#     Bitwise NOT.
}$     e#
<      e# Keep only the elements that correspond to seats.
:(     e# Shift each array.
       e# RESULT: S := [[number] ["party" votes] [number] ["party" votes] ...]
f{     e# For each A := ["party" votes]:
       e#     Push S.
  1$   e#     Push a copy of A.
  e=   e#     Count the occurrences of A in S.
  1\t  e#     Replace the vote count with the number of occurrences.
  p    e#     Print.
}      e#

6

পাইথ, 36 বাইট - 20% = 28.8

J<_hCo/@eCQhNheN.S*UQUvzvz.e,b/JkhCQ

এটি বোনাসের জন্য যোগ্যতা অর্জন করে।

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার জোতা

ব্যাখ্যা:

                                       implicit: z = 1st input (as string)
                                                 Q = 2nd input (evaluated)

                      vz               evaluate z (#seats)
                     U                 generate the list [0,1,...,seats-1]
                   UQ                  generate the list [0,1,...,len(Q)-1]
                  *                    Cartesian product of these lists
                .S                     shuffle (necessary for break ties randomly)
     o                                 order these tuples N by:
        eCQ                               list of votes
       @   hN                             take the N[0]th vote count
      /      heN                          and divide by N[1]+1
   hC                                  extract the party index of the tuples
  _                                    reverse the list
 <                      vz             take the first #seats elements
J                                      and store them in J

                          .e     hCQ   enumerated map over the names of the parties
                                       (k = index, b = name):
                            ,             generate the pair:
                             b/Jk            name, J.count(k)
                                       print implicitely

Jঅপ্রয়োজনীয় আপনি এ থেকে মুক্তি পেতে পারেন এবং 2 বাইট সংরক্ষণ করতে পারেন।
isaacg

এছাড়াও, আপনি অদলবদল যদি zএবং Q, এবং তারপর সংরক্ষণ করুন Cvzথেকে K, আপনি অন্য বাইট সংরক্ষণ করতে পারবেন।
isaacg

@ আইস্যাক নাহ, এটি খুব গুরুত্বপূর্ণ। পরিবর্তিত হওয়ার কারণে ভাবটি বিভিন্ন ফলাফল পেতে পারে .eএবং এটি গণনা বিভ্রান্ত করে।
জাকুব

1
আসলে, দ্বিতীয় টিপটিও কাজ করে না, দুঃখিত, কারণ আমি এটি মিস করেছি UQ
isaacg

2
উত্তরটি হিসাবে এটি পোস্ট করুন
জাকুব

5

জাভাস্ক্রিপ্ট, 210 বাইট

v=(a,b,c,d,e,f,g)=>{d=Object.assign({},b),c={};for(g in b)c[g]=0;for(;a--;)e=0,f=Object.keys(d),f.forEach(a=>e=d[a]>e?d[a]:e),f=f.filter(a=>d[a]===e),f=f[~~(Math.random()*f.length)],d[f]=b[f]/-~++c[f];return c}

মন্তব্য:

  • ES6 এর সমর্থন সহ একটি আধুনিক ব্রাউজার / ইঞ্জিন প্রয়োজন। ফায়ারফক্সে পরীক্ষিত।
  • খুব গুরুত্বপূর্ণ /-~++অপারেটর ব্যবহার করে :)

ব্যবহারের উদাহরণ:

v(25, {cio:12984,pcc:7716,irc:13009,icb:4045,cub:1741,bb:1013})

1
আপনার সমস্ত পরিবর্তনশীলকে আর্গুমেন্ট হিসাবে ঘোষণা করার প্রয়োজন নেই not
nderscore

2
হ্যাঁ, তবে আমি সম্ভাব্য বৈশ্বিক সুযোগকে দূষিত করা এড়াতে চেয়েছিলাম
ব্যবহারকারীর 2951302

1
জেএস গল্ফ গোবলির সুযোগকে দূষিত করার বিষয়ে :)
nderscore

2
আমি আপনার পদ্ধতিটি 168 বাইটে নামিয়েছি। চলক নামগুলি ম্যাঙ্গাল করার জন্য দুঃখিত F=(N,X)=>{for(t=[o={}],[t[o[j]=0,j]=X[j]for(j in X)];N--;t[z=y[new Date%y.length]]=X[z]/-~++o[z])m=0,y=[(m=m<t[j]?t[j]:m,j)for(j in X)],y=y.filter(j=>t[j]==m);return o}
nderscore

4

পাইথ - 54 বাইট

AGZQ=kZK*]0lZVGJhOfqeTh.MZZ.e(kb)Z XJK1 XZJ/@kJ+@KJ1;K

ইনপুট ফর্ম্যাট (স্টিডিন):

[25,[12984,7716,13009,4045,1741,1013]]

আউটপুট ফর্ম্যাট (stdout):

[8, 5, 9, 2, 1, 0]

চলকগুলি ব্যবহৃত:

G = total number of seats
K = array of seats currently assigned to each party
k = number of votes for each party
Z = k/(K+1)
J = which party should have the next seat

ব্যবহার করুন vzএবং Qপরিবর্তে Gএবং Z। এইভাবে আপনি অ্যাসাইনমেন্টটি সংরক্ষণ করবেন A
জাকুব

2

পার্ল, 110

#!perl -pa
$n=pop@F;@x=map
0,@F;/a/,$x[$'/$n]++for(sort{$b-$a}map{map{($'/$_|0).rand.a.$i++}//..$n}@F)[0..$n-1];$_="@x"

ইনপুট স্পেসটি আসন গণনার সাথে পৃথক হয়েছে last

আমাকে চেষ্টা করুন

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