এক মাসে কাজের দিনগুলির শতাংশ


11

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

ইনপুট

আইএসও 8601 ফর্ম্যাটে এক বছর এবং মাস (YYYY-MM)। বছরটিতে সর্বদা চারটি অঙ্ক থাকে, মাসে সর্বদা দুটি অঙ্ক থাকে। প্রদত্ত বছর 1582 সালের আগে হবে না।

আউটপুট

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

নমুনা 1

Input                Output

2010-05              68

নমুনা 2

Input                Output

2010-06              73

নমুনা 3

Input                Output

1920-10              68

নমুনা 4

Input                Output

2817-12              68

এক সপ্তাহ কেটে গেছে, একটি উত্তর গৃহীত হয়েছে। কৌতূহলের জন্য, আমাদের প্রতিযোগিতায় আমরা যে আকারের জমা দিয়েছি তার আকারগুলি:

129 - জেড শেল
174 - ভিবি.নেট
222 - সি
233 - সি
300 - সি

পাশাপাশি আমাদের নিজস্ব (অচিহ্নবদ্ধ) সমাধান:

  75 - পাওয়ারশেল
  93 - রুবি
112 - বোর্ন শেল


2
আমি একজন স্নাতক ছাত্র, তাই ...echo 100
অ্যামরি

এমনকি গ্রেড শিক্ষার্থীরাও তাদের কাজের লাইনের মৌলিক সংজ্ঞাগুলি এড়াতে পারে না। এবং আমি কাজের দিনগুলি আলাদাভাবে সংজ্ঞায়িত করেছি ;-)
জোয়

উত্তর:


4

64-বিট পার্ল, 67 68

পার্ল 5.10 বা পরে সঙ্গে চালানো perl -E 'code here'বাperl -M5.010 filename

map{$d++,/^S/||$w++if$_=`date -d@ARGV-$_`}1..31;say int.5+100*$w/$d

কোড আকারে ছাড়:

  • লোকাল-সংবেদনশীল: এটি কাজের দিন হিসাবে গণ্য হয় যার dateআউটপুট মূলধন এস দিয়ে শুরু হয় LC_ALL=Cনা সন্দেহ হলে চালনা করুন ।
  • আউটপুট খাঁটি এবং ভাল-ফর্ম্যাট করা আছে তবে স্ট্যাডারের উপর "আবর্জনা" রয়েছে 31 মাসের চেয়ে কম মাসে 2> /dev/null
  • কোনও কারণে, আমার সংস্করণটি date2817-12 অবৈধ মাস হিসাবে বিবেচনা করে। কে জানত, জিএনইউর নতুন অ্যাপোক্যালাইপস রয়েছে! date2038 এর পরে তারিখগুলির জন্য একটি 64 বিট বিল্ড প্রয়োজন ((ধন্যবাদ জোই)

1
স্পষ্টতই এটি তাঁর শাসনকালে "সিফস হেমস" দ্বারা বিলুপ্ত হয়েছিল। সুত্র "পবিত্র বাইবেল এর একটি নতুন ইতিহাস"
মার্টিন ইয়র্ক

1
2038 এর পরে প্রতি বছর কি ভেঙে যায়? তারপরে ডা hand৪-বিট বিল্ডটি স্যুইচ করা তারিখের হ্যান্ডলিংয়ের সাথে কিছু ব্রেনডেড-নেসের কারণে সহায়তা করতে পারে ;-)
জো

@ জোই ঠিক এটাই। ভকভগক!
জেবি

জেবি: কেবল অনুমান ছিল এবং আমি বাস্তবে সি এর বাইরে এমন কিছু আশা করিনি যা এখনও একটি অদ্ভুত যুগের পরে সেকেন্ড গণনা করে কেবল 32-বিট পূর্ণসংখ্যা ব্যবহার করবে। যদিও সত্য কথা বলতে গেলে, আমি ঠিক এই উদ্দেশ্যে সেখানে তারিখগুলি> 2038 এর প্রয়োজনীয়তাটি রেখেছি ;-)
জয়ে

3

পিএইচপি - 135

আমি এটি পিএইচপিতে তৈরি করেছি কারণ কিছুদিন আগে চিকিত্সা করার ক্ষেত্রে আমার একই সমস্যা ছিল had

<?php $a=array(2,3,3,3,2,1,1);$t=strtotime($argv[1]);$m=date(t,$t);echo round((20+min($m-28,$a[date(w,strtotime('28day',$t))]))/$m*100)

(কিছুটা) আরও সুস্পষ্টভাবে এবং স্ট্রেন্ট হিসাবে ধ্রুবক ব্যবহার করার বিষয়ে বিজ্ঞপ্তি ছাড়াই:

<?php
date_default_timezone_set('America/New_York');
$additionalDays = array(2, 3, 3, 3, 2, 1, 1);
$timestamp = strtotime($argv[1]);
$daysInMonth = date('t', $timestamp);
$limit = $daysInMonth - 28;
$twentyNinthDayIndex = date('w', strtotime("+28 days", $timestamp));
$add = $additionalDays[$twentyNinthDayIndex];
$numberOfWorkDays = 20 + min($limit, $add);
echo round($numberOfWorkDays / $daysInMonth * 100);
?>

এক মাসে কাজের দিনগুলির সংখ্যা গণনা করার জন্য এটি খুব সাধারণ অ্যালগরিদম দ্বারা সম্ভব হয়েছে: 29 তম, 30 তম এবং 31 তম সাপ্তাহিকতার জন্য পরীক্ষা করুন (যদি সেই তারিখগুলি বিদ্যমান থাকে) এবং 20 টি যুক্ত করুন।


দুর্দান্ত অ্যালগরিদম, দরিদ্র গল্ফিং। সমসাময়িক পিএইচপি ৫.৩.৫ ব্যবহার করে এবং -Rএই পদ্ধতিটি 86 63 বাইট (.7৩..7%) $a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0; পর্যন্ত গল্ফ করা
তিতাস

80 বাইট:<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
টাইটাস

2

পাইথন 152 অক্ষর

from calendar import*
y,m=map(int,raw_input().split('-'))
c=r=monthrange(y,m)[1]
for d in range(1,r+1):
 if weekday(y,m,d)>4:c-=1
print '%.f'%(c*100./r)


2

উইন্ডোজ পাওয়ারশেল, 80

$x=$args;1..31|%{"$x-$_"|date -u %u -ea 0}|%{$a++
$b+=!!($_%6)}
[int]($b*100/$a)

আপনি কি [int]সত্যিই রাউন্ড নিশ্চিত ? আমি এটা মেঝে বিশ্বাস করতে চাই।
zenak

@ জ্নাক: পাওয়ারশেল সি বা সি-প্রাপ্ত ভাষা নয়। এটি .NET এর ডিফল্ট রাউন্ডিং মোড ব্যবহার করে যা nearest নিকটতম এমনকি পূর্ণসংখ্যার বৃত্তাকার is এটি চেষ্টা করে দেখুন: [int]1.5এবং [int]2.5ফলন উভয়ই 2। এই সঠিক আচরণটি প্রায়শই সেই কার্যগুলিতে সমস্যার সৃষ্টি করে যেখানে মেঝে বিভাজন প্রয়োজনীয় (যার পরে অতিরিক্ত প্রয়োজন [Math]::Floor()), তবে এই ক্ষেত্রে এটি ক্ষতিগ্রস্থ হয় না এবং even এমনকি সমান «কেবলমাত্র এমন সংখ্যার জন্য প্রযোজ্য .5যেখানে শেষ হয় না এখানে।
জোয়

আপনি যদি নিশ্চিত হন তবে আমি আপনাকে বিশ্বাস করি। আমি কেবল এটি পরিবর্তে সি # এর মতো কাজ করার প্রত্যাশা করেছি এবং ঘরে বসে পরীক্ষা করার জন্য আমার কাছে এমন কোনও উইন্ডোজ মেশিন নেই।
zenak

@ জ্নাক: না, অবশ্যই সি # এর মতো কাজ করে না। [int]পাওয়ারশেলের মতো কিছু সাধারণত কাস্ট :-) এর চেয়ে বেশি রূপান্তর। অন্যান্য [int[]][char[]]'abc'কাজকর্মের মতো কাজগুলি যা আপনি অন্যান্য অনেক ভাষায় কাজ করতে পারবেন না।
জোয়

Necrobump তবে $input-> $argsএকটি বাইট সংরক্ষণ করে।
ভেস্কাহ

1

ডি: 186 অক্ষর

auto f(S)(S s){auto d=Date.fromISOExtendedString(s~"-28"),e=d.endOfMonth;int n=20;while(1){d+=dur!"days"(1);if(d>e)break;int w=d.dayOfWeek;if(w>0&&w<6)++n;}return rndtol(n*100.0/e.day);}

আরও সুস্পষ্টভাবে:

auto f(S)(S s)
{
    auto d = Date.fromISOExtendedString(s ~ "-28"), e = d.endOfMonth;
    int n = 20;

    while(1)
    {
        d += dur!"days"(1);

        if(d > e)
            break;

        int w = d.dayOfWeek;

        if(w > 0 && w < 6)
            ++n;
    }

    return rndtol(n * 100.0 / e.day);
}

1

পাইথন - 142

from calendar import*
y,m=map(int,raw_input().split('-'))
f,r=monthrange(y,m)
print'%.f'%((r-sum(weekday(y,m,d+1)>4for d in range(r)))*100./r)

ক্যালেন্ডার বিটের জন্য fR0DDY ধন্যবাদ।


1

রুবি, 124 119 111

require 'date'
e=Date.civil *$*[0].split(?-).map(&:to_i),-1
p ((e+1<<1..e).count{|d|d.cwday<6}*1e2/e.day).round

কারণে -1 'দিন' যুক্তি আগে ও বছর এবং মাস splatting করতে রুবি 1.9 প্রয়োজন ?-জন্য "-"। রুবি ১.৮ এর জন্য আমাদের অবশ্যই দুটি অক্ষর যুক্ত করতে হবে:

require 'date'
e=Date.civil *$*[0].split('-').map(&:to_i)<<-1
p ((e+1<<1..e).count{|d|d.cwday<6}*1e2/e.day).round

সম্পাদনা : @ ডগবার্টের সহায়তার ভিত্তিতে পাঁচটি অক্ষর শেভ করুন
সম্পাদনা : @ স্টেনস্লাগের সহায়তার ভিত্তিতে আরও আটটি অক্ষর শেভ করুন


আপনি ডি কে তারিখ নির্ধারণ করছেন কেন?
ডগবার্ট

@ ডগবার্ট ওফস! হোল্ডওভার এমন এক সময় থেকে যখন আমার দুটি তারিখ ছিল ivil ধন্যবাদ!
ফ্রোগজ

'-'?-রুবি ১.৯
ডগবার্ট

@ ডগবার্ট নিস আমি এটাও ফেলে দেব। আমি মনে করি সপ্তাহের দিনগুলি বেছে নেওয়ার জন্য আরও একটি ছোট উপায় থাকতে হবে, তবে আমি এটি এখনও পাইনি।
ফ্রোগজ

e + 1 << 1 ee.day + 1 এর তুলনায় তিনটি খাটো
স্টেনস্লাগ

1

পিএইচপি 5.2, 88 বাইট

যদিও আমি ইতিমধ্যে 85 বাইটে জিনাকের দ্রবণটি গল্ফ করেছি (আমি কেবল আরও একটি পেয়েছি), এটি আমার নিজের: এখানে আমি আরও তিনটি বাইট নিঃসরণ
করতে পারব সন্দেহ।

$a=_4444444255555236666304777411;echo$a[date(t,$t=strtotime($argn))%28*7+date(N,$t)]+67;

এসটিডিআইএন থেকে ইনপুট নেয়: সাথে চালান echo <yyyy>-<mm> | php -nR '<code>'

স্ট্রিংগুলি $aপ্রতি মাসে ( date(t)) এবং মাসের প্রথম দিনের সপ্তাহের দিনগুলি ( date(N): সোমবার = 1, রবিবার = 7) কাজের দিনের শতাংশের শতাংশের পরিমাণ - 67; strtotimeইনপুটটিকে ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করে; কোডের বাকি অংশটি হ্যাশিং করে।

পুরানো পিএইচপি 5 এর জন্য +1 বাইট: Nসাথে wএবং $a=_...;সাথে প্রতিস্থাপন করুন $a="..."
পিএইচপি 4 এর জন্য অন্য +3 বাইট: .-1পরে sertোকান $argn

-5 বা পিএইচপি 5.5 জন্য বাইট পরে (চ্যালেঞ্জ postdates):
সরান সবকিছু আগে echoএবং প্রতিস্থাপন $aসঙ্গে "4444444255555236666304777411"


ভাল ... এক বাইট: %7পরিবর্তে %28
তিতাস

0

রিবোল - 118 113

w: b: 0 o: d: do join input"-01"while[d/2 = o/2][if d/7 < 6[++ w]++ b d: o + b]print to-integer round w / b * 100

Ungolfed:

w: b: 0 
o: d: do join input "-01"
while [d/2 = o/2] [
    if d/7 < 6 [++ w]
    ++ b
    d: o + b
]
print to-integer round w / b * 100

0

সি #, 158 বাইট

s=>{var d=DateTime.Parse(s);int i=0,t=DateTime.DaysInMonth(d.Year,d.Month),w=0;while(i<t)w-=-(int)d.AddDays(i++).DayOfWeek%6>>31;return Math.Round(1e2*w/t);};

বেনামে পদ্ধতি যা প্রয়োজনীয় শতাংশ প্রদান করে।

অসম্পূর্ণ, মন্তব্য করা পদ্ধতি এবং পরীক্ষার কেস সহ সম্পূর্ণ প্রোগ্রাম:

using System;

class WorkingDayPercentage
{
    static void Main()
    {
        Func <string, double> f =
        s =>
        {
            var d = DateTime.Parse(s);                      // extracts a DateTime object from the supplied string
            int i = 0,                                      // index variable
                t = DateTime.DaysInMonth(d.Year, d.Month),  // number of total number of days in the specified month
                w = 0;                                      // number of working days in the month

            while (i < t)                                   // iterates through the days of the month
                w -= -(int)d.AddDays(i++).DayOfWeek%6 >> 31;// d.AddDays(i) is the current day
                                                            // i++ increments the index variable to go to the next day
                                                            // .DayOfWeek is an enum which hold the weekdays
                                                            // (int)..DayOfWeek gets the days's index in the enum
                                                            // note that 6 is Saturday, 0 is Sunday, 1 is Monday etc.
                                                            // (int)DayOfWeek % 6 converts weekend days to 0
                                                            // while working days stay strictly positive
                                                            // - changes the sign of the positive numbers
                                                            // >> 31 extracts the signum
                                                            // which is -1 for negative numbers (working days)
                                                            // weekend days remain 0
                                                            // w -= substracts the negative numbers
                                                            // equivalent to adding their modulus

            return Math.Round(1e2 * w / t);                 // the Math.round function requires a double or a decimal
                                                            // working days and total number of days are integers
                                                            // also, a percentage must be returned
                                                            // multiplying with 100.0 converts the expression to a double
                                                            // however, 1e2 is used to shorten the code
        };

        // test cases:
        Console.WriteLine(f("2010-05")); // 68
        Console.WriteLine(f("2010-06")); // 73
        Console.WriteLine(f("1920-10")); // 68
        Console.WriteLine(f("2817-12")); // 68
    }
}

বিকল্প ফাংশন, যা কার্যদিবসের সংখ্যাতে নেতিবাচক মান যুক্ত করে, অতিরিক্ত বাইট ব্যয় ছাড়াই বিনিময়ে সাইন পরিবর্তন করে:

s=>{var d=DateTime.Parse(s);int i=0,t=DateTime.DaysInMonth(d.Year,d.Month),w=0;while(i<t)w+=-(int)d.AddDays(i++).DayOfWeek%6>>31;return-Math.Round(1e2*w/t);};

0

ওরাকল এসকিউএল, ১১০ বাইট

select round(100*sum(1-trunc(to_char(x+level-1,'d')/6))/sum(1))from dual,t connect by level<=add_months(x,1)-x

এটি এমন একটি অনুমানের সাথে কাজ করে যে ইনপুট ডেটা যেমন টেবিলের মধ্যে dateডেটা টাইপ ব্যবহার করে সংরক্ষণ করা হয়

with t as (select to_date('2010-06','yyyy-mm') x from dual)

0

এপিএল (ডায়ালগ ইউনিকোড) , 55 বাইট এসবিসিএস

বেনামে ট্যাসিট প্রিফিক্স ফাংশন।

.5+100×2÷/(2 5)2{≢⍎⍕↓⍺↓¯2' ',cal' '@5⊢⍵⊣⎕CY'dfns'}¨⊂

 এটি সম্পূর্ণরূপে চিকিত্সা করার জন্য তারিখটি আবদ্ধ করুন

(2 5)2{ এটিতে নীচের ফাংশনটি প্রয়োগ করুন, তবে বাম যুক্তি দিয়ে [2,5]এবং 2:

⎕CY'dfns' "dfns" লাইব্রেরি অনুলিপি করুন

⍵⊣ তারিখের পক্ষে রিপোর্টটি বাতিল করুন

' '@5⊢-একটি স্থানের সাথে  5 ম অক্ষর ( ) প্রতিস্থাপন করুন

 দ্বি-উপাদান তালিকা পেতে যে চালানো

cal এটিতে ক্যালেন্ডার ফাংশনটি কল করুন

' ', এটিতে স্পেসগুলির একটি কলাম প্রিপেন্ড করুন

¯2⌽ শেষ দুটি কলাম (শনিবার) সামনের দিকে ঘোরান

⍺↓ বাম-যুক্তি সারিগুলির সংখ্যা (2, শিরোলেখ) এবং কলামগুলি (যদি নির্দিষ্ট করা হয়; 5 = শনি + সান) বাদ দিন

 লাইনের তালিকায় ম্যাট্রিক্স বিভক্ত করুন

 ফর্ম্যাট (ডাবল-স্পেসিং সন্নিবেশ সমতল)

 সম্পাদন করুন (বাকি দিন সংখ্যাগুলি একটি ফ্ল্যাট সংখ্যার তালিকায় পরিণত করে)

 ট্যালি যারা

2÷/ প্রতিটি জুটি ভাগ করুন (কেবল একটিই আছে)

100× একশ দ্বারা গুণ

.5+ একটি অর্ধেক যোগ করুন

 মেঝে

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


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