কে ভোট দেয় তা নয়; এই যে ভোট গণনা [বন্ধ]


33

দৃশ্যপট

আপনি এমন একটি দেশে বাস করেন যেখানে রাষ্ট্রপতি নির্বাচন হচ্ছে। প্রতিটি ভোটার একটি ভোট পান, এবং তাই এখানে দৃ firm়ভাবে জড়িত দ্বি-দলীয় ব্যবস্থা রয়েছে। (তৃতীয় পক্ষের উপস্থিতি রয়েছে, তবে খুব কমই কোনও ভোট পান)।

সর্বশেষ মতামত জরিপটি একটি মারাত্মক উত্তাপের মধ্যে দৌড় দেখায়:

  • 49%: আলবার্তো আরবুস্তো
  • 49%: জর্গে সাংগ্রে
  • 2%: বিভিন্ন নাবালক প্রার্থী

প্রোগ্রাম প্রয়োজনীয়তা

ভোট গণনা সফ্টওয়্যারটির অংশ লেখার জন্য আপনাকে সরকার নিয়োগ দিয়েছে। আপনাকে স্ট্যান্ডার্ড ইনপুট-এ দেওয়া হবে, এক লাইনের প্রতি ভোটের একটি সীমানাবিহীন তালিকা, এর মতো:

Alberto Arbusto
Jorge Sangre
Jorge Sangre
Alberto Arbusto
Jorge Sangre
Alberto Arbusto
Alberto Arbusto
Jorge Sangre
Juan Perez
Jorge Sangre
Alberto Arbusto
Alberto Arbusto
…

এবং, এটি সমস্ত ভোট পড়ার পরে, প্রতিটি প্রার্থী কতটা ভোট পেয়েছিল তার সংক্ষিপ্তসার দেয়, ভোটের সংখ্যার দ্বারা সাজানো ক্রম অনুসারে সাজানো হয়েছে:

492 Jorge Sangre
484 Alberto Arbusto
 18 Juan Perez
  6 Mickey Mouse

আন্ডারহ্যান্ডড অংশ

আপনি একজন পার্টিসিয়ান হ্যাক, যিনি দুটি প্রধান প্রার্থীর মধ্যে একটিতে চুরি করতে চান (আপনি কোনটি নির্বাচন করতে পারেন)। সুতরাং, আপনার প্রোগ্রামটি ইচ্ছাকৃতভাবে আপনার প্রিয় প্রার্থীর প্রতি নিয়মতান্ত্রিক পক্ষপাতিত্ব সহ ভুল ভোট গণনা প্রিন্ট করতে হবে ।

অবশ্যই, আপনাকে অবশ্যই এটি করা উচিত এমন কোনও ব্যক্তি যাতে আপনার কোড বা এর আউটপুট দেখছেন কোনও ব্যক্তি সম্ভবত ভুল আচরণটি স্বীকৃতি দিতে পারে না।


2
প্রোগ্রাম পরিচালিত ব্যক্তিকে কীভাবে তিনি পক্ষপাতদুষ্ট করতে চান তা কীভাবে বেছে নেওয়া যায়? এই 1 : চ্যালেঞ্জকে কম বিস্তৃত করে তোলে (একটি ভাল জিনিস), 2 : উত্তরগুলি আরও আকর্ষণীয় করে তোলে (আইএমও)
জাস্টিন

1
...you can choose which one...যার নাম প্রথম, আমি কি তাকে বেছে নিতে পারি?
ব্যবহারকারী 80551

2
"পক্ষপাতদুষ্ট" দ্বারা আপনি বোঝাতে চেয়েছেন যে আমরা যে প্রার্থীকে পছন্দ করি তাকে অবশ্যই নির্বাচিত করতে হবে, বা থার প্রোগ্রামটি কেবল ইনপুট ফাইলে থাকা প্রার্থীর চেয়ে তার পক্ষে বেশি আউটপুট এবং বেশি সংখ্যক ভোট দেবে?

3
এই ফর্ম্যাটে ভোট গণনা করার জন্য একটি নিখরচায়িত প্রোগ্রামটি আক্ষরিক অর্থেই কেবল হবে sort|uniq -c... এই

1
@ আলেসান্দ্রো: কেবল ইনপুটে যা আছে তার চেয়ে কেবল তার পক্ষে বেশি সংখ্যক ভোট (এবং / অথবা তার প্রতিপক্ষের পক্ষে কম সংখ্যক ভোট) আউটপুট করা দরকার। নির্বাচনটি এত নিকটবর্তী বলে ধরে নেওয়া হচ্ছে যে একটি ছোট্ট ত্রুটি এটি সুইং করতে পারে।
dan04

উত্তর:


32

scala

দীর্ঘজীবী আলবার্তো আরবুস্তো!

import scala.io.Source
import java.util.concurrent.atomic.LongAdder

object Votes extends App {
  val votes = Source.stdin.getLines.toIndexedSeq
  val registeredCandidates = Seq(
    "Alberto Arbusto",
    "Juan Perez",
    "Mickey Mouse",
    "Jorge Sangre"
  )

  val summaries = registeredCandidates map (Summary.apply(_, new LongAdder))

  var currentCandidate: String = _

  for (vote <- votes.par) {
    currentCandidate = vote
    summaries.find(s => s.candidate == currentCandidate).map(_.total.increment)
  }

  for (summary <- summaries.sortBy(-_.total.longValue)) {
    println(summary)
  }
}

case class Summary(candidate: String, total: LongAdder) {
  override def toString = s"${total.longValue} ${candidate}"
}

আলবার্তো আরবুস্তো জোর্স স্যাংগ্রির চেয়ে প্রায় সর্বদা সামনের দিকে এগিয়ে আসবে, সরবরাহের জন্য পর্যাপ্ত পরিমাণ ভোট (10,000 ডলার) প্রদান করা হবে। ভোটে নিজেরাই ফাঁকি দেওয়ার দরকার নেই।

একটি দৌড় শর্ত আছে। এবং প্রথম তালিকায় আলবার্তো আরবস্তোকে রেখে, আমরা তার দৌড়ে বিজয়ী হওয়ার সম্ভাবনা বাড়িয়েছি।

পার্শ্ব দ্রষ্টব্য: এই কোডটি একটি প্রকল্পে আমি যে "কাস্টম" সংযোগ পুলের মুখোমুখি হয়েছি তার উপর ভিত্তি করে। অ্যাপ্লিকেশনটি কেন ক্রমাগত সংযোগের বাইরে ছিল তা নির্ধারণ করতে আমাদের কয়েক সপ্তাহ লেগেছে।


12
আমি এটির মত দুর্ভাগ্যজনক অস্বীকারযোগ্যতার কারণে এটি পছন্দ করি।
dan04

16

চুনি

vote_counts = $<.readlines.group_by{|s|s}.collect{ |name, votes| [votes.count, name] }

formatted_count_strings = vote_counts.map do |row,
  formatter = PrettyString.new|"%#{formatter[1][/[so]/]||'s'} %s"%
  [row,formatter]
end

sorted_count_strings = formatted_count_strings.sort_by(&:to_i).reverse

puts sorted_count_strings

জর্জে স্যাংগ্রে তার ভোটের গণনায় যথেষ্ট উত্সাহ পাবে (উদাহরণস্বরূপ, 492 ভোট 754 হিসাবে রিপোর্ট করা হবে)। আলবার্তোর ভোট সঠিকভাবে জানানো হবে।

আপনারা যেমন অনুমান করতে পারেন, কে ভোট গণনা করেন তা নয় তবে কে ভোটের বিন্যাস করেন। আমি এটি অস্পষ্ট করার চেষ্টা করেছি ( PrettyString.newআসল জিনিস নয় এবং কখনই ডাকা হয় না), তবে formatterএটি আসলে নামের স্ট্রিং। নামের দ্বিতীয় অক্ষরটি যদি 'ও' হয়, তবে ভোট গণনা দশমিকের পরিবর্তে অষ্টালে মুদ্রিত হবে।


9

সজোরে আঘাত

(এটি কি স্পেসিফিকেশন পূরণ করে?)

uniq -c|sort -rk2,2|uniq -f1|sort -gr

সর্বদা হিসাবে, বৈধ আউটপুট নিশ্চিত করতে এটি অতিরিক্ত সতর্কতা গ্রহণ করে।

uniq -cপ্রতিটি লাইনের যতবার সংঘটিত হয় তার উপসর্গ করে f এটি মূলত সমস্ত কাজ করে।

যদি uniq -cকিছু ভুল হয় তবে আমরা এখন এর ফলাফলকে বিপরীত ক্রমে প্রার্থীদের নাম অনুসারে বাছাই করি, তারপরে uniq -f1যেকোন সদৃশ প্রার্থীকে অপসারণের জন্য (প্রথম ক্ষেত্রটি [ভোটের সংখ্যা] উপেক্ষা করে সদৃশ লাইনগুলি প্রিন্ট করবেন না) মাধ্যমে চালান । পরিশেষে আমরা sort -gr"জেনারেল নিউমেরিক" এবং "বিপরীত" অর্ডার (ভোটের সংখ্যার ভিত্তিতে অবতরণ ক্রম) বাছাই করতে ব্যবহার করি।

uniq -cএকটানা ইভেন্টগুলি গণনা করে, পুরো ফাইলের উপরে ঘটনাকে নয়। বিজয়ী সর্বাধিক পরপর ভোট পেয়ে প্রার্থী হবেন।


16
কীভাবে কোনও বিশেষ প্রার্থীকে পক্ষপাতিত্ব করে না। আপনি কেবল নির্বাচনের বিজয়ী অবস্থার পরিবর্তন করেছেন। (এইভাবে যদি নির্বাচনের প্রকৃত সিদ্ধান্ত হয় তবে এই বিশৃঙ্খলা হবে)। আপনি যথাক্রমে ভোট দেওয়ার আয়োজনে
বিশালাকার

1
@ ক্র্যাঙ্কার প্রশ্নের মন্তব্যে প্রশ্নকর্তা বলেছেন যে কোনওভাবে ফাইলের প্রথম নামটি বেছে নেওয়া ভাল , তাই সম্ভবত

9

সি শার্প

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        var candidates = new SortedDictionary<string, int>();
        string candidate;
        using (var sr = new StreamReader("candidates.txt"))
        {
            while ((candidate = sr.ReadLine()) != null)
            {
                if (candidates.ContainsKey(candidate)) 
                    candidates[candidate]++;
                else 
                    candidates.Add(candidate, 1);
            }
        }

        // order by the votes
        var votes = candidates.OrderByDescending(k => k.Value).Select(x => x.Value);

        Console.WriteLine("Candidate | Votes"); 
        for (int i = 0; i < candidates.Count; i++)
        {   
            Console.WriteLine(candidates.ElementAt(i).Key + " " + votes.ElementAt(i));
        }

        Console.ReadKey();
    }
}

টেক্সট ফাইলে প্রথম প্রার্থী সর্বদা জিতবে!

এটি আলবার্তো আরবস্তোকে বিজয়ী করে তুলবে !

পরীক্ষার্থীদের নাম অভিধানে বর্ণমালা অনুসারে অর্ডার করা হয়, তবে ভোট সংখ্যা দ্বারা আদেশ করা হয়।


সুতরাং এটি কেবল বর্ণানুক্রমিকভাবে প্রথম প্রার্থীর হাতে নির্বাচন দেবে, বা আমাদের পছন্দসই প্রার্থীকে পছন্দ করার জন্য এটি কারসাজি করা যায়?
জেমস_পিক

এটি প্রার্থীদের বর্ণমালা অনুসারে বাছাই করে না। এটি কেবল ভোটগুলি বাছাই করে। আপনি যে কোনও প্রার্থীকে জিততে হেরফের করতে পারেন। কেবলমাত্র পাঠ্য ফাইলে তিনিই প্রথম হন তা নিশ্চিত করুন।
মাই

তবে আইআইইউসি প্রার্থীদের বর্ণমালা অনুসারে বাছাই SortedDictionary করবে
জেমস_পিক

আচ্ছা বুঝলাম. এখানে কোনও ভুল হতে পারে। আমাকে আবার এটি পরীক্ষা করতে দিন।
মাই

1
@ জেমস_পিক: Dictionary<TK,TV>শ্রেণীর হ্যাশ টেবিল , প্রয়োগ হিসাবে, সূচকগুলি প্রকৃত আইটেমগুলির ব্যাকিং অ্যারেতে সংরক্ষণ করে। একজন Dictionary<TK,TV> যা থেকে কোন আইটেম কি কখনো মুছে ফেলা হয় , যাতে তারা যোগ করা হয় নি উপাদান গনা হবে; এই জাতীয় আচরণ নির্দিষ্ট করা হয়নি, তবে এটি যথেষ্ট স্থানে ছিল আমি এমএসকে কখনও এটি পরিবর্তন করার প্রত্যাশা করব না।
সুপারক্যাট

7

সি

#include <stdio.h>

#define NCANDIDATES 4
static const char * const cand_list[NCANDIDATES] = {
    "Alberto Arbusto",
    "Juan Perez",
    "Mickey Mouse",
    "Jorge Sangre"
};

#define BUFFER_SIZE 100

int
main(int argc, char **argv)
{
    int votes[NCANDIDATES];
    int candidate;
    size_t name_start;
    int i;
    int j;
    int place;
    int max;
    size_t bytes;
    char buffer[BUFFER_SIZE];

    /*
    Make sure input is read in text mode, so we don't have to
    worry about whether line endings are LF or CRLF.
    */
    freopen(NULL, "rt", stdin);

    /* Initialize vote tally. */
    for (candidate = 0; candidate < NCANDIDATES; candidate++) {
        votes[candidate] = 0;
    }

    /* Read and process vote file. */
    do {
        /* Read a block of data. */
        bytes = fread(buffer, 1, BUFFER_SIZE, stdin);

        /* Loop over the data, finding and counting the votes. */
        name_start = 0;
        for (i = 0; i < bytes; i++) {
            if (buffer[i] == '\n') {
                /* Found name. */
                buffer[i] = '\0'; // nul-terminate name so strcmp will work
                /* Look up candidate. */
                for (j = 0; j < NCANDIDATES; j++) {
                    if (strcmp(&buffer[name_start], cand_list[j]) == 0) {
                        candidate = j;
                        break;
                    }
                }
                /* Count vote. */
                ++votes[candidate];

                /* Next name starts at next character */
                name_start = i + 1;
            }
        }
    } while (bytes > 0);

    /* Output the candidates, in decreasing order of votes. */
    for (place = 0; place < NCANDIDATES; place++) {
        max = -1;
        for (j = 0; j < NCANDIDATES; j++) {
            if (votes[j] > max) {
                candidate = j;
                max = votes[j];
            }
        }
        printf("%8d %s\n", votes[candidate], cand_list[candidate]);
        votes[candidate] = -1; // Remove from consideration for next place.
    }

    return 0;
}

ফেভারস জোর্হে সাংগ্রে।

এলোমেলোভাবে উত্পন্ন ভোট ফাইলগুলির সাথে পরীক্ষার সময়ও, যখন আলবার্তো আরবুস্তো প্রকৃত ভোটের চেয়ে ১.৪% বেশি (জোর্স স্যাংগ্রির জন্য ৪৯.৩% বনাম ৪৮.৩%) পান, আমার মানুষ হোর্হে সাঙ্গ্রে সাধারণত গণনা জিতে থাকে।

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


5

পাইথন

from collections import defaultdict

def count_votes(candidate, votes=defaultdict(int)):
    with open('votes.txt') as f:
        for line in f:
            votes[line.strip()] += 1

    return votes[candidate]

if __name__ == '__main__':
    candidates = [
        'Mickey Mouse',
        'Juan Perez',
        'Alberto Arbusto',
        'Jorge Sangre'
    ]

    results = {candidate: count_votes(candidate) for candidate in candidates}

    for candidate in sorted(results, key=results.get, reverse=True):
        print results[candidate], candidate

ভোটের গণনা তালিকাটির শেষের দিকে প্রার্থীদের পক্ষে দেবে।

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


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

0

tr | সেড | ডিসি

tr ' [:upper:]' '\n[:lower:]' <votes |\
sed -e '1i0sa0ss0sp' -e \
    '/^[asp]/!d;s/\(.\).*/l\1 1+s\1/
    ${p;c[Alberto Arbusto: ]P lap[Jorge Sangre: ]P lsp[Juan Perez: ]P lpp
    }' | dc

এটি আমার বন্ধু আলবার্তোকে প্রতিবার দুবার গণনা করে।

"ওহ - tr? ঠিক আছে, কারণ কম্পিউটারগুলি বড় হাতের অক্ষরের সাথে খুব বেশি ভাল না - সেগুলি যদি ছোট ছোট হয় তবে ভাল .... হ্যাঁ, আমি জানি, কম্পিউটারগুলি পাগল crazy"

আউটপুট

Alberto Arbusto: 12
Jorge Sangre: 5
Juan Perez: 1

জোর্স সানগ্র্রেতে জুয়ান পেরেজের ভোট দেওয়ার জন্য এখানে আরও একটি সংস্করণ দেওয়া হয়েছে:

tr '[:upper:]' '[:lower:]' <votes |\
sed -e '1i0sj0sa1so' -e \
    's/\(.\).*/l\1 1+s\1/
    ${p;c[Alberto Arbusto: ]P lap[Jorge Sangre: ]P ljp[Others: ]P lop
    }' | dc

আউটপুট

Alberto Arbusto: 6
Jorge Sangre: 6
Others: 1

0

জাভাস্ক্রিপ্ট

    function Election(noOfVoters) {
    candidates = ["Albert", "Jorge", "Tony", "Chip"];
    votes = [];

    for (i = 1; i <= noOfVoters; i++) {

        votes.push(prompt("1 - Albert, 2 - Jorge, 3 - Tony , 4 - Chip"))

    }
    votes.sort();
    WinningOrder = count(votes);

    var placement = [];

    for (x = 0; x < candidates.length; x++) {
        placement.push(x + " place with " + WinningOrder[x] + " votes is " + candidates[x] + "\n");
    }
    placement.reverse();
    alert(placement)
}


function count(arr) {
    var a = [],
        b = [],
        prev;

    arr.sort();
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] !== prev) {
            a.push(arr[i]);
            b.push(1);
        } else {
            b[b.length - 1]++;
        }
        prev = arr[i];
    }

    b.sort();

    return b;
}

প্রার্থীদের তালিকার শেষ ব্যক্তি সর্বদা জিতবেন।

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