সস্তা, দ্রুত, ভাল - সাধারণ ফ্যাক্টর (দুর্দান্ত) [বন্ধ]


10

সস্তা, দ্রুত, ভাল দ্বারা অনুপ্রাণিত হয়ে আমরা একটি অ্যালগরিদম বাস্তবায়ন করতে যাচ্ছি যার মধ্যে ঠিক দুটি রয়েছে।

ম্যাথ

দুই অশূন্য পূর্ণসংখ্যার দেওয়া একটি এবং , GCF বৃহত্তম পূর্ণসংখ্যা যে ভাগ উভয় একটি এবং বাকি ছাড়া। কোফিসিয়েন্টস Bézout পূর্ণসংখ্যার জোড়া হয় (X, Y) যেমন যে কুঠার + দ্বারা = ঘ । Bézout সহগগুলি অনন্য নয়। উদাহরণস্বরূপ, প্রদত্ত:

a = 15, b = 9

আমাদের আছে

d =  3
x =  2
y = -3

যেহেতু 15*2 + 9*(-3) = 30 - 27 = 3

জিসিএফ গণনা করার একটি সাধারণ উপায় এবং একজোড়া বেজআউট সহগগুলি ইউক্লিডের অ্যালগরিদম ব্যবহার করছে , তবে এটি কোনও উপায় নয় the

কোড

আপনার প্রোগ্রামটি ইনপুট হিসাবে দুটি পূর্ণসংখ্যার নেওয়া উচিত। এটি আউটপুট / সর্বাধিক সাধারণ ফ্যাক্টর এবং একজোড়া বিউজআউট সহগকে ফিরিয়ে আনবে।

উদাহরণ ইনপুট:

15 9

উদাহরণ আউটপুট

3 (2, -3)

আউটপুটটি কোনও ক্রম এবং বিন্যাসে হতে পারে তবে এটি অবশ্যই পরিষ্কার হওয়া উচিত যে কোনটি জিসিএফ এবং কোনটি সহগ রয়েছে।

আন্ডারহ্যান্ডড

আপনার প্রোগ্রামটি সস্তা, দ্রুত এবং ভাল হওয়ার সম্ভাবনা রয়েছে। দুর্ভাগ্যক্রমে, এটি একবারে দু'জনেই হতে পারে।

  • যখন এটি সস্তা না হয় , প্রোগ্রামটির অতিরিক্ত পরিমাণে সিস্টেম সংস্থান ব্যবহার করা উচিত।
  • যখন এটি দ্রুত না হয় , প্রোগ্রামটির অতিরিক্ত সময় নেওয়া উচিত।
  • যখন এটি ভাল না হয় , প্রোগ্রাম আউটপুটটি ভুল হওয়া উচিত।

প্রোগ্রামটি তিনটিই (ভাল, না করা) করতে সক্ষম হওয়া উচিত। কোনটি যখন আপনার উপর নির্ভর করে-এটি সময়, সংকলক, কোন ইনপুট আরও বড় ইত্যাদি উপর ভিত্তি করে তৈরি হতে পারে কিছু অতিরিক্ত নোট:

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

এটি একটি জনপ্রিয়তা প্রতিযোগিতা, তাই বেশিরভাগ আপভোট জিতেছে!

সম্পাদনা

স্পষ্ট করার জন্য, আমি এমন প্রোগ্রামগুলি সন্ধান করছি যা "দ্রুত এবং সস্তা" এবং "সস্তা এবং ভাল" এবং বিভিন্ন ক্ষেত্রে "দ্রুত এবং ভাল" হতে পারে, কেবল সেগুলির মধ্যে একটি করে না।


1
এটির মতো একটি আসল চ্যালেঞ্জ পেয়ে ভাল লাগল। :)
Ypnypn

প্রোগ্রামটি কি একবারে ঠিক দুটি হতে হবে বা এটি যদি কিছু ক্ষেত্রে কেবল ভাল এবং অন্যদের মধ্যে সস্তা এবং দ্রুত (তবে ভাল না) থাকে তবে তা ঠিক আছে?
ডেনিস

1
আমি তিনটি কেস খুঁজছি, প্রতিটিতে একেবারে দুটি করে।
হোভারকাচ

প্রোগ্রামটি ভাল না হলে এর আউটপুটটি ভুল হওয়া উচিত? তারপরে কোন কিছুর সঠিকভাবে গণনা করার কী লাভ?
রিকার্ডো এ

4
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করার পক্ষে ভোট দিচ্ছি কারণ এটি একটি [আন্ডারহ্যান্ডড] চ্যালেঞ্জ, যা এক বছর আগে অন-টপিক ছিল, কিন্তু এখন সম্প্রদায়ের sensকমত্য দ্বারা বিষয়বস্তুতে পরিণত হয়নি ।
জেমস

উত্তর:


2

সি

এটি সস্তা এবং দ্রুত। চোখের পলকে আপনি জিসিডি পাবেন। তবে যে লোকটি এটি করেছে সে "বেজিয়ার সহ-কিছু" সম্পর্কে কোনও ধারণা ছিল না, সুতরাং সে কেবল একটি এবং বি কে জিএসডি দিয়ে বিভক্ত করেছিল। (বিষয়গুলিকে আরও খারাপ করে তোলার জন্য, সেই সময়ে a এবং b তার বুদ্ধিমানভাবে বেছে নেওয়া অ্যালগরিদমের কারণে তাদের প্রাথমিক মান থেকে বেশ দূরে)

int main(int argc, char **argv){
    unsigned int a, b, tmp;
    a = (unsigned int)atoi(argv[1]);
    b = (unsigned int)atoi(argv[2]);
    for (tmp = 0; ((a | b) & 1) == 0; ++tmp){
        a >>= 1;
        b >>= 1;
    }
    while ((a & 1) == 0) 
        a >>= 1;
    do {
        while ((b & 1) == 0)
            b >>= 1;
        if (a > b){
            unsigned int t = b; 
            b = a; 
            a = t;
        }  
        b = b - a;
    } while (b != 0);
    tmp = a << tmp;
    printf("%u, (%u,%u)", tmp, a/tmp, b/tmp);
    return 0;
}

0

সি শার্প

এটি Bézout সহগের গণনা করে। আমি বর্ধিত ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করেছি ।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter your first number.");
            int firstNumber = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Enter your second number.");
            int secondNumber = Convert.ToInt32(Console.ReadLine());

            double max = Math.Max(firstNumber, secondNumber);
            double min = Math.Min(firstNumber, secondNumber);
            double s1 = 1;
            double s2 = 0;
            double t1 = 0;
            double t2 = 1;
            double quotient = 0;
            double remainder = 0;
            double[] remainders = new double[0];

            int i = 0;
            do
            {
                quotient = (int)(max / min);
                remainder = max - quotient * min;
                if (remainder > 0)
                {
                    Array.Resize(ref remainders, remainders.Length + 1);
                    remainders[i] = remainder;

                }
                if (i % 2 == 0)
                {
                    s1 = s1 - quotient * s2;
                    t1 = t1 - quotient * t2;
                }
                else
                {
                    s2 = s2 - quotient * s1;
                    t2 = t2 - quotient * t1;
                }

                if (i == 0)
                {
                    max = min;

                }
                else if (i >= 1)
                {
                    max = remainders[i - 1];
                }


                min = remainder;
                i++;
            } while (remainder > 0);

            Console.WriteLine((remainders[remainders.Length - 1]).ToString() + " " + (i % 2 == 0 ? "(" + s1 + "," + t1 + ")" : "(" + s2 + "," + t2 + ")"));
        }

    }
}

কখন এই ব্যয়বহুল, কখন ধীর এবং কখন খারাপ?
আন্ডারগ্রাউন্ডোমোনাইল

যখনই সুযোগ পাবে আমি সেই মানগুলি রাখব।
বুরা চুহাদার

0

পার্ল 5

#!/usr/bin/perl
use strict;
use warnings;

$SIG{__WARN__} = sub { exit };

print(<<INTRO);
Greatest Common Factor

    goodbye           -- exit the application
    [number] [number] -- compute gcf of both numbers

INTRO

main();
sub main {
    print "> ";
    chomp(local $_ = <STDIN>);

    print "Have a good one.\n" and exit if /goodbye/;

    my @nums = /(-?\d+)/g;
    print "invalid input\n" and return main() if @nums != 2;

    my ($gcf, @coeff) = gcf(@nums);
    unless (grep abs($_) > 99, $gcf, @coeff) {
        select $\,$\,$\, rand for 1..10;
    }

    local $" = ", "; #"
    print "gcf(@nums) = $gcf\n";
    print "bezout coefficients: @coeff\n";
    main();
}

sub gcf {
    my ($x, $y) = @_;

    my @r = ($x, $y);
    my @s = (1, 0);
    my @t = (0, 1);

    my $i = 1;
    while ($r[$i] != 0) {
        my $q = int($r[$i-1] / $r[$i]);
        for (\@r, \@s, \@t) {
            $_->[$i+1] = $_->[$i-1] - $q * $_->[$i];
        }
        $i++;
    }

    return map int(1.01 * $_->[$i-1]), \@r, \@s, \@t;
}

__END__

সস্তা নয়: প্রধান () পুনরাবৃত্তভাবে বলা হয় (স্ট্যাক পূরণ করা) যতক্ষণ না "গভীর পুনরাবৃত্তি" সতর্কতা পার্ল দ্বারা চালিত হয় যা __WARN__ হ্যান্ডলারের কারণে অ্যাপ্লিকেশনটি প্রস্থান করবে।

দ্রুত নয়: যখন gcf () অ্যালগরিদমগুলি সঠিক ফলাফল দেয়, কোডটি কেবল কয়েক সেকেন্ডের জন্য স্থির থাকে (প্রধান ()) (নির্বাচন করুন)।

ভাল নয়: 99 এর উপরে সমস্ত ফলাফল (বা -99 এর নীচে) ভুল।

সব মিলিয়ে এতটা সৃজনশীল নয়; আরও মার্জিত উত্তর প্রত্যাশায়।


0

পাইথন

#!/usr/bin/python
def gcd(x, y):
    l = 0
    if x < y:
        l = x
    else:
        l = y
    for g in reversed(range(l + 1)):
        if x%g == 0 and y%g == 0 and g > 1:
            return g
        else:
            if g == 1:
                return 1

def bezout(x,y,g):
    c1 = 0
    c2 = 0
    k = 0
    if x < y:
        k = y
    else:
        k = x
    for _k in range(k):
        tc = (gcd(x,y) - x*_k)%y
        if tc == 0:
            c1 = _k
            c2 = (gcd(x,y) - y*_k)/x
            return (c1, c2)

gc = gcd(15,9)
be, bf = bezout(9,15,gc)
print("%d (%d, %d)" % (gc, be, bf))

এটি সস্তা এবং দ্রুত তবে এটি ব্যপারে খারাপ যে পরিসীমাটি বৃহত্তম ইনপুটটিতে সংযুক্ত করা হয়েছে যাতে এটি কোনও সংখ্যার সহগ খুঁজে না পায়।

ধাঁধা ভাল।


0

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

সস্তা না

প্রচুর সিস্টেম সংস্থান ব্যবহার করে।

function gcf(a, b) {
    var result = 1;
    for (var i = 1; i < 100000000 * a && i < 100000000/* Do it a few extra times, just to make sure */ * b; i++) {
        if (a % i == 0 && b % i == 0) {
            result = i;
        }
    }
    return [result, a / result, b / result];
}

দ্রুত না

অতিরিক্ত ব্যর্থতা হিসাবে ঠিক যেমন কলব্যাক ব্যবহার করুন।

function gcf(a, b) {
    setTimeout(function() {
        var result = 1;
        for (var i = 1; i < 2 * a && i < 2 * b; i++) {
            if (a % i == 0 && b % i == 0) {
                result = i;
            }
        }
        alert(result.toString() + " (" + (a / result).toString() + ", " + (b/result).toString() + ")");
    }, 10000);
}

ভাল না

এর gcf(10, 10)নিরাপদ ডিস্কের স্থানের সীমাবদ্ধতা to

function gcf(a, b) {
    var gcfTable = [[1,1,1,1,1,1,1,1,1,1],[1,2,1,2,1,2,1,2,1,2],[1,1,3,1,1,3,1,1,3,1],[1,2,1,4,1,2,1,4,1,2],[1,1,1,1,5,1,1,1,1,5],[1,2,3,2,1,6,1,2,3,2],[1,1,1,1,1,1,7,1,1,1],[1,2,1,4,1,2,1,8,1,2],[1,1,3,1,1,3,1,1,9,1],[1,2,1,2,5,2,1,2,1,10]];
    return [gcfTable[a - 1][b - 1], a / gcfTable[a - 1][b - 1], b / gcfTable[a - 1][b - 1]];
}

এটি কখন সস্তা এবং দ্রুত তবে ভাল হয় না?
হোভারকাচ

এই উত্তরটি সস্তা, ভাল তবে দ্রুত নয়।
পটাসিয়াম আয়ন

চ্যালেঞ্জ হ'ল এমন একটি প্রোগ্রাম লিখুন যা প্রতিটি পরিস্থিতিতে "সস্তা নয়", "দ্রুত নয়", এবং বিভিন্ন পরিস্থিতিতে "ভাল না"।
হোভারকাচ

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