পরের 29 শে ফেব্রুয়ারির সপ্তাহের দিন


14

একটি ফাংশন লিখুন যা একটি তারিখ নেয় এবং পরবর্তী তারিখের 29 শে ফেব্রুয়ারির সপ্তাহের দিনটি ফেরত দেয়।

  • ইনপুটটি ISO বর্ধিত বিন্যাসের একটি স্ট্রিং: YYYY-MM-DD (উদাঃ 27 শে মে, 2010 হবে "2010-05-27")।

  • আউটপুটটি একটি স্ট্রিং যা সপ্তাহের দিনের নাম (যেমন "সোমবার")) মূলধন কোনও বিষয় নয়, তবে পুরো নামটি ইংরেজিতে দিন।

  • প্রদত্ত তারিখটি যদি ২৯ শে ফেব্রুয়ারি হয়, তবে পরবর্তী ফেব্রুয়ারি ২৯ শে সপ্তাহের দিনটি ফিরিয়ে দিন ।

  • প্রলেপটিক গ্রেগরিয়ান ক্যালেন্ডারের জন্য গণনাগুলি ব্যবহার করুন (সুতরাং, এটি সম্পূর্ণ দৈর্ঘ্যের জন্য গ্রেগরিয়ান লিপ বছরের গণনা ব্যবহার করে)। জুলিয়ান ক্যালেন্ডার বা যখন জুলিয়ান থেকে গ্রেগরিয়ানে স্যুইচটি ঘটেছিল সে সম্পর্কে চিন্তা করবেন না। সব কিছুর জন্য গ্রেগরিয়ানকে ধরে নিই।

  • ফাংশনটি কমপক্ষে "0001-01-01" - "2100-01-01" এর ব্যাপ্তির জন্য কাজ করা উচিত।

  • আপনার পছন্দসই ভাষা যে স্ট্যান্ডার্ড লাইব্রেরি সরবরাহ করে তা বিনা দ্বিধায় ব্যবহার করুন তবে তৃতীয় পক্ষের গ্রন্থাগারগুলি ব্যবহার করবেন না যদি না আপনি সেই কোডটি আপনার সমাধানের অংশ হিসাবে অন্তর্ভুক্ত না করতে চান।

  • সংক্ষিপ্ততম কোড (সর্বাধিক অক্ষরের) জয়।

উদাহরণ:

  • func("0001-01-01") -> "Sunday"
  • func("1899-12-03") -> "Monday"
  • func("1970-01-01") -> "Tuesday"
  • func("1999-07-06") -> "Tuesday"
  • func("2003-05-22") -> "Sunday"
  • func("2011-02-17") -> "Wednesday"
  • func("2100-01-01") -> "Friday"

(এবং না, আপনাকে ফাংশনটির নাম রাখতে হবে না func)

সংকেতগুলি:

  • মনে রাখবেন যে ২০১০ সালে শেষ হওয়া বছরগুলি যা 400 দ্বারা বিভাজ্য নয় তা লিপ বছর নয়।
  • 1 লা জানুয়ারী, 0001 সোমবার।

উত্তর:


7

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

মোটামুটি সহজবোধ্য.

filter f{for($d=date $_;($d+='1').day*$d.month-58){}$d.dayofweek}

যথারীতি, আমরা শেষ পর্যন্ত দীর্ঘ সময় অপেক্ষা করতে ইচ্ছুক হলে আমরা দুটি বাইট মুণ্ডন করতে পারি:

filter f{for($d=date $_;($d+=9).day*$d.month-58){}$d.dayofweek}

টেস্ট:

> '0001-01-01','1899-12-03','1970-01-01','1999-07-06','2003-05-22','2011-02-17','2100-01-01'|f
Sunday
Monday
Tuesday
Tuesday
Sunday
Wednesday
Friday

ইতিহাস:

  • 2011-02-18 00:06 (65) প্রথম প্রচেষ্টা।

এটি কাজ করার জন্য কোন পথে প্রয়োজনীয়? আমার পথে আমার জ্ঞানউইনের তারিখ রয়েছে, যা এটি ভেঙে যাচ্ছে।
পিটার টেলর

@ পিটার: এটির সাথে সংঘাত হতে পারে date। PATH থেকে কেবল GNUWin32 সরান এবং এটি কাজ করা উচিত। বা এতে পরিবর্তন dateকরুন Get-Date(সেই ধরণের ফ্যালব্যাক আচরণ কেবল তখনই কাজ করে যখন কোনও আদেশ পাওয়া যায় না - পরীক্ষা করতে, কেবল ব্যবহার করতে gcm date)। যাইহোক, GNUWin32 হিসাবে এই স্ক্রিপ্টটির সাথে একটি বিশেষ সমস্যা কোনও স্ট্যান্ডার্ড উইন্ডোজ ইনস্টলেশনের অংশ নয় বলে আমি বিবেচনা করি না।
জোয়

আমি জিজ্ঞাসা করার কারণটি ছিল কারণ আমি ইতিমধ্যে get-dateত্রুটি বার্তাটি ব্যবহার করার চেষ্টা করেছি এবং পেয়েছি এর জন্য কী Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.PS2 বা। নেট 4 বা কিছু প্রয়োজন?
পিটার টেলর

@ পিটার: আমি পাওয়ারশেল ভি 2 চেষ্টা করেছিলাম। পাওয়ারশেল ২.০ রানটাইমের সাথে সংযুক্ত থাকায় .NET 4 এর মধ্যে খেলবে না। যাই হোক না কেন, পিএসওজেক্টটি ফিরে আসা উচিত নয় Get-Dateতবে ক System.DateTime
জোয়

এটা খুব অদ্ভুত। ডেটটাইমে সংজ্ঞায়িত না হওয়া $d=Get-Date "0400-01-01"; $d++সম্পর্কে একটি ত্রুটি বার্তা দেয় ++। একই প্রতিস্থাপন ++সঙ্গে +=1বা +="1"বা +='1'PSObject সম্পর্কে ত্রুটি বার্তা দেয়। এবং শুধু +"1"কাজ করে।
পিটার টেলর

5

রুবি 1.9, 85 টি অক্ষর

f=->a{require"date";d=Date.parse(a,0,0)+1;d+=1until d.day*d.month==58;d.strftime"%A"}

সোজা সমাধান। সাথে ফাংশন কল করুন f[args]

  • সম্পাদনা করুন (87 -> 97) টেস্টকেস স্থির করে 0001-01-01
  • সম্পাদনা 2: (97 -> 91) তারিখ.পার্স পাশাপাশি ক্যালেন্ডার সংস্কারের তারিখ নির্দিষ্ট করার অনুমতি দেয়।
  • 3 সম্পাদনা করুন: (91 -> 87) একটি ফাংশনের পরিবর্তে ল্যাম্বডা ব্যবহার করুন। ধন্যবাদ ডগবার্ট !
  • 4 সম্পাদনা করুন: (87 -> 85) অপ্রয়োজনীয় স্থান সরিয়ে ফেলুন। আবার ধন্যবাদ, ডগবার্ট !

4
"0001-01-01" এর জন্য টেস্টকেস ব্যর্থ। রুবির তারিখটি খুব শক্তিশালী, এটি জুলিয়ানের তারিখগুলিকে বিবেচনায় নেয়।
স্টেনস্ল্যাগ

@ Ventero ডিএফ * কি করে? আগে কখনও দেখিনি।
স্টেনস্ল্যাগ

@ স্টেনস্লাগ: ধন্যবাদ, এই টেস্টকেসটি ঠিক করেছি। def*শুধু একটি ফাংশন বলা সংজ্ঞায়িত *। এইভাবে আমার defএবং ফাংশন নামের মধ্যে কোনও স্থানের দরকার নেই ।
ভেন্টোরো

1
পরিবর্তে আপনি কেবল একটি ল্যাম্বডাকে সংজ্ঞায়িত করতে পারেন না? a = -> {...}
উইল ই কোয়েট

1
এছাড়াও, স্ট্রফটাইমের পরে কোনও জায়গার দরকার নেই।
উইল ই। কোয়েট

3

টি এসকিউএল 166 185 টি অক্ষর

CREATE PROCEDURE f29 (@d DATETIME) AS
DECLARE @i int
SET @i=YEAR(DATEADD(M,-2,@d)+3)
SET @i=@i+(4-@i%4)
IF @i%100=0 AND @i%400<>0 SET @i=@i+4
SELECT DATENAME(W,CAST(@i AS CHAR)+'-2-29')

আমি টি-এসকিউএল তারিখ ফাংশন নিয়ে ইতিমধ্যে জগাখিচুড়ি করছি, তাই আমি বুঝতে পেরেছি কেন ...

আসল সমাধানটি ভুল ছিল ...

কৌশলটি কাজ করার জন্য আসলে আমার যা করতে হবে তা এখানে :

CREATE PROCEDURE f29 (@d DATE) AS
DECLARE @i int
SET @i = YEAR(@d)
BEGIN TRY 
SET @i=YEAR(DATEADD(D, 3, DATEADD(M,-2,@d)))
END TRY
BEGIN CATCH
END CATCH
SET @i=@i+(4-@i%4)
IF @i%100=0 AND @i%400<>0 SET @i=@i+4
SELECT DATENAME(W,CAST(@i AS CHAR)+'-2-29')

প্রদত্ত যে আমি 0001-01-01 থেকে 2 মাস বিয়োগ করে একটি ওভারফ্লো তৈরি করি যদিও আমি সঠিক ডেটাটাইপ ব্যবহার না করেই এই প্রশ্নের জন্য সংক্ষিপ্ত এবং বৈধ কিছু তৈরি করা ছেড়ে দিই । O_o। ট্রিক্সসি প্রশ্নোত্তর।
mootinator

আমি এই টি এসকিউএল সমাধানগুলি দেখতে পছন্দ করি। :)
স্টিভ

3

সি #, 176

Func<String,String>f=(d)=>{DateTime n;for(n=DateTime.Parse(d).AddDays(307);!(DateTime.IsLeapYear(n.Year));n=n.AddYears(1)){}return new DateTime(n.Year,2,29).ToString("dddd");};

আপনি একটি সাধারণ ফাংশন সংজ্ঞা ব্যবহার করে 8 বাইট সংরক্ষণ করতে পারেন:string f(string d){...}
জয়ে

.ToString("dddd")ইংরাজীতে নয়, বর্তমান লোকালে তারিখটি মুদ্রণ করে।
জোয়ি

165 অক্ষর => স্ট্রিং এফ (স্ট্রিং ডি) {ভরা এন = ডেটটাইম. পার্স (ডি)। অ্যাডডয়েস (307); যখন (! (নতুন ডেটটাইম (এন। ইয়ার, ২,২৯৯))। ডেওফিউক.টোস্ট্রিং (); Step
স্টিফান শিনকেল ২

আরও 127 টি অক্ষরে উন্নতি হয়েছে:string f(string d){var n=DateTime.Parse(d).AddDays(1);return DateTime.IsLeapYear(n.Year)&&n.DayOfYear==60?n.DayOfWeek+"":f(n+"");}
প্যাট্রিক ওয়েস্টারলন্ড

3

বাশ, 96 বাইট

ধন্যবাদ পিটার ... উচ্চ গল্ফযুক্ত সংস্করণ, 96 বাইট:

i=1;until [ `date -d"$1 $i days" +%m-%d` = "02-29" ];do((i++));done
date -d "${1} ${i} days" +%A

পুরানো সংস্করণ, 229 বাইট

#!/bin/bash
from=$1
i=1
while [ "$isFeb" = "" ] || [ "$is29" = "" ]
do
isFeb=`date -d "${from} ${i} days" | grep Feb`
is29=`date -d "${from} ${i} days" +%Y-%m-%d | grep "\-29"`
((i++))
done
((i--))
date -d "${from} ${i} days" +%A

নমুনা I / O

:~/aman>./29Feb.sh 0001-01-01
Sunday
:~/aman>./29Feb.sh 1899-12-03
Monday
:~/aman>./29Feb.sh 1970-01-01
Tuesday

যদি কোনো ডিফল্ট সময় জোন সেট করা হয় টি জেড সেট করতে পারে, আমি শিখেছি cyberciti.biz/faq/... যখন কিছু অনলাইন আইডিই এই করছেন
আমন ZeeK ভার্মা

1
আপনি এই গল্ফ যাচ্ছে? ; পি আপনি চূড়ান্ত লাইনের আগে সবকিছু প্রতিস্থাপন করতে পারেনi=0;d=;until [ `date -d"$1 $i days" +%m-%d` = "02-29" ];do((i++));done
পিটার টেলর

:-) যেহেতু আমরা ইতিমধ্যে আমার কাঁচা নেচে বাশকে ছাড়িয়ে নিয়ে আলোচনা করেছি! ... কিছু কারণে আমি বাশকে খুব বেশি ভাবি না ... এগুলি ত্রুটি প্রবণ! .. আপনার পরামর্শের জন্য ধন্যবাদ .. আপডেট হয়েছে!
আমান জেক ভার্মা

1
চার অক্ষরের পরিবর্তনশীল নাম ব্যবহারের জন্য বাশ দিয়ে কাঁচা হওয়া কোনও অজুহাত নয়: পি
পিটার টেলর

হ্যাঁ স্যার, আমি আপনার বক্তব্য পেয়েছি।
আমান জিক ভার্মা

2

পার্ল, কোনও তারিখের পাঠাগার নেই: 160 159 155

sub f {($ y, $ m) = split / - / /, @ _ ​​[0], 2;; y ++ if ($ m> '02 -28 '); $ y = ($ y + 3)% 400 >> 2; $ Y + + = $ Y && ($ Y% 25); @ R = (Tues, Wednes, বৃহস্পতিবার, শুক্র, Satur, সূর্য, সোম); @ R [(5 * $ Y - ($ Y / 25 & 3))% 7] "দিন।";}

এই তারিখের পাঠাগারগুলির আসল উপকারিতা দিনগুলির নাম দৈর্ঘ্যকে অন্য কাউকে ছাড়িয়ে দিচ্ছে।

অন্যদিকে, আমি মনে করি এটি এখন পর্যন্ত একমাত্র সমাধান যা লোকাল নির্বিশেষে কাজ করে।


2

তারিখ এবং কিছু বেস আঠালো (90)

কাজ:

f(){ while :;do $(date -d$1+1day +'set - %F %A 1%m%d');(($3==10229))&&break;done;echo $2;}

পরীক্ষামূলক:

$ for x in 0001-01-01 1899-12-03 1970-01-01 1999-07-06 2003-05-22 2011-02-17 2100-01-01 ; do f $x ; done
Sunday
Monday
Tuesday
Tuesday
Sunday
Wednesday
Friday

1

ডি: 175 অক্ষর

S f(S)(S s){auto d=Date.fromISOExtString(s)+days(1);while(d.month!=Month.feb||d.day!=29)d+=days(1);return["Sun","Mon","Tues","Wednes","Thurs","Fri","Sat"][d.dayOfWeek]~"day";}

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

S f(S)(S s)
{
    auto d = Date.fromISOExtString(s) + days(1);

    while(d.month != Month.feb || d.day != 29)
        d += days(1);

    return ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Sat"][d.dayOfWeek] ~ "day";
}

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


1

জাভা 8 - 252 অক্ষর

Golfed:

import java.time.*;
import java.time.format.*;
public class S{public static void main(String[] a){LocalDate d=LocalDate.parse(a[0]).plusDays(1);while(d.getMonthValue()!=2||d.getDayOfMonth()!=29){d=d.plusDays(1);}System.out.println(d.getDayOfWeek());}}

Ungolfed:

import java.time.*;
import java.time.format.*;
public class S {
    public static void main(String[] a) {
        LocalDate d = LocalDate.parse(a[0]).plusDays(1);

        while(d.getMonthValue()!=2 || d.getDayOfMonth()!=29) {
            d = d.plusDays(1);
        }
        System.out.println(d.getDayOfWeek());
    }
}

আমি ডাউনভোটগুলি গ্রহণ করি তবে আপনি দয়া করে "নেক্রোটি আসল" ব্যাখ্যা করতে পারেন এবং আপনার প্রশ্নটি ব্যাখ্যা করা এমন একটি FAQ এর লিঙ্ক করতে পারেন? আমি জিতব ভাবিনি তবে জাভা কীভাবে করতে পারে তা দেখার জন্য এটি আকর্ষণীয় হবে বলে মনে করলাম, esp। প্রদত্ত জাভা ৮. আমি কোড গল্ফকে "ওয়েট ক্লাস" বনাম প্রত্যক্ষ প্রতিযোগিতা হিসাবে দেখছি। জাভা খুব কমই রুবি বা পাইথনকে সরাসরি মারবে।
মাইকেল ইস্টার

ওপি 3 য় পক্ষের গ্রন্থাগারগুলিকে নিষিদ্ধ করেছে, তাই ২০১১-এ জাভা সলিউশন অপ্রীতিকর হবে, কারণ জনপ্রিয় জোডা টাইম লাইব্রেরিটি কেউ ব্যবহার করতে পারে না। তবে জাভা 8 (মার্চ 2014 এ প্রকাশিত) তে জেএসআর -310 ডেটটাইম লাইব্রেরি রয়েছে - en.wikedia.org/wiki/… । আমার কারণ হ'ল আমি ভেবেছিলাম জাভা 8 মজাদার, এবং কিছু পাঠকের পক্ষে সম্ভাব্য আকর্ষণীয়। (আপনি যদি এগুলির মধ্যে না হন তবে জরিমানা: পোস্টের জন্য এখনও একটি কারণ রয়েছে))
মাইকেল ইস্টার

1

রিবোল - 78

f: func[d][system/locale/days/(until[d: d + 1 d/day * d/month = 58]d/weekday)]

Ungolfed:

f: func [d] [
    system/locale/days/(
        until [
            d: d + 1
            d/day * d/month = 58
        ]
        d/weekday
    )
]

ব্যবহারের উদাহরণ (রিবোল কনসোলে):

>> f 0001-01-01
== "Sunday"

>> f 2100-01-01
== "Friday"

1

পিএইচপি, 104 বাইট

function f($s){for($y=$s-(substr($s,5)<"02-29");!date(L,$t=strtotime(++$y."-2-1")););return date(l,$t);}

ভাঙ্গন

for($y=$s-;                 // "-" casts the string to int; decrement year if ...
    (substr($s,5)<"02-29")  // ... date is before feb 29
    !date(L,                        // loop while incremented $y is no leap year
        $t=strtotime(++$y."-2-1")   // $t=feb 01 in that year (same weekday, but shorter)
    );
);
return date(l,$t);          // return weekday name of that timestamp

date(L): 1লিপ ইয়ারের জন্য, 0অন্যথায়
date(l): সপ্তাহের দিনের সম্পূর্ণ পাঠ্য উপস্থাপনা


0

জিএনইউ কোর্টিলস, 71 বাইট

f(){
seq -f "$1 %gday" 2921|date -f- +'%m%d%A'|sed 's/0229//;t;d;:;q'
}

পরবর্তী 8 বছরের লিনিয়ার সন্ধান (2096-02-29 দেওয়া সবচেয়ে খারাপ ক্ষেত্রে)। শেড ২৯ শে ফেব্রুয়ারির সাথে মেলে এমন প্রথম লাইনের সন্ধান এবং আউটপুট দেয়।

আমি আশ্চর্য হয়েছি যে এটি t;d;:;qপরীক্ষা করার চেয়ে সংখ্যার চেয়ে কম /[01]/d;qকমান্ডের দ্বিগুণ হয়েও অঙ্কগুলি রয়ে গেছে কিনা তা পরীক্ষা করে দেখার চেয়ে কম ছিল than

টেস্ট

আমি কঠিন কোণার ক্ষেত্রে পরীক্ষার জন্য একটি অতিরিক্ত লাইন যুক্ত করেছি:

for i in 0001-01-01.Sunday 1899-12-03.Monday \
    1970-01-01.Tuesday     1999-07-06.Tuesday \
    2003-05-22.Sunday      2011-02-17.Wednesday 2100-01-01.Friday \
    2000-02-28.Tuesday     2000-02-29.Sunday    2000-03-01.Sunday   2096-02-29.Friday
do
    printf "%s => %s (expected %s)\n" ${i%.*} $(f ${i%.*}) ${i#*.}
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.