পরের শুক্রবার 13


15

সংক্ষিপ্ততম প্রোগ্রামটি কী এমনটি অনুমান করতে পারে যে পরের বার শুক্রবার মাসের 13 তম দিনে পড়বে?

  • একটি সম্পূর্ণ কার্যকারী প্রোগ্রাম হতে হবে (কেবল কোনও ফাংশন / সাবরুটিন নয়)
  • নিম্নলিখিত বিন্যাসে তারিখ অবশ্যই মুদ্রণ করতে হবে: YYYY-MM-DD
  • কমান্ড লাইন আর্গুমেন্ট হিসাবে বা এর মাধ্যমে ব্যবহারকারীকে শুরুর তারিখ সরবরাহ করার অনুমতি দিন STDIN
  • যদি ব্যবহারকারী কোনও শুরুর তারিখ না দেয় তবে আজকে শুরুর তারিখ হিসাবে ব্যবহার করুন।
  • যদি শুরুর তারিখ 13 ই শুক্রবার হয় তবে প্রোগ্রামটি পরবর্তী শুক্রবার 13 তারিখের সন্ধান করা উচিত ।

আমি যদি আজ (16 ফেব্রুয়ারী 2011) প্রোগ্রামটি চালাচ্ছিলাম তবে আমার নিম্নলিখিত আউটপুটটি পাওয়া উচিত।

$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13

2013-9-13প্রথম ফলাফলের জন্য কি কোনও আউটপুট ঠিক আছে?
জেবি

আপনার অর্থ কি আমরা সিদ্ধান্ত নিতে পারি যে আমরা তারিখটি আর্গুমেন্ট হিসাবে নিতে চাই বা এসটিডিনের কাছ থেকে বা আমাদের উভয়কেই সমর্থন করা দরকার?
sepp2k

@ sepp2k আপনি সিদ্ধান্ত নিতে পারেন, আপনার উভয়কেই সমর্থন করার দরকার নেই, ব্যবহারকারীর কেবল একটি তারিখ ইনপুট করার জন্য একটি উপায় প্রয়োজন।
ড্যানিয়েল স্ট্যান্ডেজ

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

ভাল এটি গল্ফস্ক্রিপ্টের মাধ্যমে সত্যই সম্ভব নয় কারণ এটি আজকের তারিখটি জানে না। এটিতে একটি তারিখ পাঠাগার নেই তবে সম্ভবত এটি বেশ বড় উত্তর হতে পারে। (* এটি পেতে আপনি রুবি ইওল ব্যবহার করতে পারেন, তবে পরে রুবি ডেট
লিবও

উত্তর:


6

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

for($d="date $args"|iex;($d+='1').day*$d.dayofweek-65){}'{0:yyy-MM-d}'-f$d

মোটামুটি সহজবোধ্য. একটি সম্ভবত বিভ্রান্তিমূলক বিট "Get-Date $args" | Invoke-Expressionহয় বর্তমান তারিখ ( $argsখালি থাকলে) বা $argsত্রুটি না বাড়িয়ে নির্দিষ্ট তারিখটি পাওয়ার জন্য ব্যবহার ।

72-বাইট বৈকল্পিক:

for($d="date $args"|iex;($d+=9).day*$d.dayofweek-65){}'{0:yyy-MM-d}'-f$d

যুগে যুগে লাগে, যদিও ... এটি প্রতিটি পুনরাবৃত্তির পুরো দিন দ্বারা তারিখের সময় বাড়িয়ে দেয় না পরিবর্তে কেবল 900 ন্যানোসেকেন্ডে। তবে দুটি বাইট সংক্ষিপ্ত।

67-বাইট বৈকল্পিক:

for($d="date $args"|iex;($d+='1').day*$d.dayofweek-65){}'{0:d}'-f$d

এটি কিছুটা লোকাল-সংবেদনশীল; যদি এটি আপনার মেশিনে ব্যর্থ হয় তবে আগে থেকে আপনার তারিখের ফর্ম্যাটটি ISO-8601 এ সেট করার চেষ্টা করুন। :-)

ওহ, এবং এটি 72 বাইট সংস্করণের মতো 65 বাইটে তৈরি করা যেতে পারে।

ইতিহাস:

  • 2011-02-17 00:33 (92) প্রথম প্রচেষ্টা।
  • 2011-02-17 00:35 (85) একটি প্রাথমিক তারিখ পাওয়ার উন্নত।
  • 2011-02-17 00:37 (79) পৃথকভাবে সপ্তাহের দিন ও দিনের পরিবর্তে পণ্যটির তুলনা করুন। স্বীকৃত ভেন্টোরো থেকে চুরি।
  • 2011-02-17 00:40 (76) প্রথম রেখাকে টেনে আনুন for। তুলনা ঠিক বিয়োগের পরিবর্তে -eqযার ফলে আরও দুটি বাইট সংরক্ষণ করা হয়।
  • 2011-02-17 00:53 (75) ইউনিক্স dateফর্ম্যাট স্ট্রিংটি কিছুটা খাটো।
  • 2011-02-17 11:42 ()৪) ডিফল্ট তারিখের প্যাটার্নে ফিরে গেছে তবে yyy-MM-dযথেষ্ট হয়েছে (যেহেতু বছরটি সর্বদা তিনটি অক্ষরের চেয়ে দীর্ঘ হয় এবং দিনটি সর্বদা ১৩) for

আপনি কেন "তারিখ $ আরগস" দিয়ে যাচ্ছেন iex? পরিবর্তে কেবল (তারিখ $ অর্গস) চেষ্টা করুন।
ইসজি

@ ইসজি: এটি "যদি ব্যবহারকারী কোনও শুরুর তারিখ না দেয় তবে আজকে শুরুর তারিখ হিসাবে ব্যবহার করুন" প্রয়োগ করতে ব্যবহৃত হয়। নিয়ম. আপনি যদি খালি অ্যারে পাস করেন বা $nullআপনি Get-Dateএকটি ত্রুটি পাবেন, বর্তমান তারিখ নয়। "date $args"|iexযাইহোক, প্রদত্ত তারিখ $args বা বর্তমান তারিখের সাথে সমাধান করা হয় , যা আমরা এখানে চাই।
জোয়

4

বাশ, 75

until set `date +%F -d$1+day`
date -d$1|grep -q '^F.* 13'
do :
done
echo $1

এটি কিছুটা লোকাল-সংবেদনশীল; যদি এটি আপনার মেশিনে ব্যর্থ হয় তবে আগেই চেষ্টা exportকরার চেষ্টা করুন LC_ALL=C

$ bash fri13th.sh 2013-05-09
2013-09-13                                             
$ bash fri13th.sh 2007-06-29
2007-07-13                                             
$ bash fri13th.sh 2007-07-13
2008-06-13
$ bash fri13th.sh
2011-05-13

4

রুবি, 96 75 টি অক্ষর

require"date"
d=Date.parse(gets||"thu")+1
d+=1 while d.wday*d.day!=65
$><<d

স্টিডিন থেকে তারিখ নেয় T তারিখ নির্দিষ্ট না করতে ctrl-d টিপুন।

ভেন্টোরোর সহায়তার জন্য অনেক ধন্যবাদ।

Ungolfed:

require "date"
# Date.parse("thu") will return this week's thursday
date = Date.parse(gets || "thu")+1
date += 1 while d.wday * d.day != 5 * 13
$stdout << date

নমুনা আইও:

$ ruby fr13th.rb
2013-05-09
2013-09-13
$ ruby fr13th.rb
2007-06-29
2007-07-13
$ ruby fr13th.rb
2007-07-13
2008-06-13
$ ruby fr13th.rb
2011-05-13

1
d.wday*d.day==65সংক্ষিপ্ত 4 অক্ষর এবং আপনার Date.today.to_sসাথে প্রতিস্থাপন করতে সক্ষম হওয়া উচিত"thu"
ভেন্টোরো

বাস্তবিক একটি লুপ কোনো ইটারেটরে পরিবর্তে 76 অক্ষর কোড shortens ব্যবহার করছে: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d। এবং আপনি স্টিডিন থেকে তারিখটি অন্য অক্ষর সংরক্ষণের getsপরিবর্তে পড়তে পারেন $*[0](ডিফল্ট আচরণ পেতে ইওএফ প্রবেশ করুন)।
ভেন্টোরো

@ ভেন্টো: খুব সুন্দর, ধন্যবাদ
sepp2k

3

সি #, 185

অ্যান্ড্রু কয়েস্টারের সি # সমাধানের উপর ভিত্তি করে , তবে ভারীভাবে পরিবর্তিত হয়েছে। আমি অবশেষে আমার পাওয়ারশেলের সমাধানের মতো সমাধানে পৌঁছেছি:

using System;class
P{static void
Main(string[]a){var
n=a.Length>0?DateTime.Parse(a[0]):DateTime.Now;for(;(n=n.AddDays(1)).Day*(int)n.DayOfWeek!=65;);Console.Write("{0:yyy-MM-d}\n",n);}}

2

পার্ল (এবং অন্যান্য), 114

for(($y,$m,$d)=(shift//`date +%F`)=~/\d+/g,$d>12&&$m++;$m
>12&&($y++,$m=1),`cal $m $y`!~/14$/m;$m++){}say"$y-$m-13"

5.10 বা পরে পার্ল, সঙ্গে চালানো -E 'code here'বা -M5.010 file। প্রয়োজন date(লিনাক্সের জন্য কোর্টিল থেকে) এবং cal(ইউজার-লিনাক্স থেকে)

নমুনা রান:

$ perl -M5.010 fr13.pl 2013-05-09
2013-9-13
$ perl -M5.010 fr13.pl 2007-06-29
2007-07-13
$ perl -M5.010 fr13.pl 2007-07-13
2008-6-13
$ perl -M5.010 fr13.pl
2011-5-13

আমি নিশ্চিত নই যে অক্টোবরের আগে মাসের জন্য শূন্যস্থানটি কখন রাখা হয়। স্পষ্টতই এটি হারিয়ে গেছে যখন বছরটি গড়িয়ে পড়ে; উত্তরটি ঠিক পরের মাসে এলেই তা রাখা হয়েছিল বলে মনে হয়। আসুন সেই অপরিজ্ঞাত আচরণটি বলি - আরে, এটি গল্ফ করছে!


2

BASH

#!/bin/bash
from=$1
if [ "$from" = "" ]; then
from=`date +%Y-%m-%d`
fi
i=1
while [ "$isFri" = "" ] || [ "$is13" = "" ]
do
isFri=`date -d "${from} ${i} days" | grep Fri`
is13=`date -d "${from} ${i} days" +%Y-%m-%d | grep "\-13"`
((i++))
done
((i--))
date -d "${from} ${i} days" +%Y-%m-%d

ব্যবহার করুন:

$ date -d "2011-02-16 2 days" +%Y-%m-%d
2011-02-18

নমুনা I / O

:~/aman> ./fr13th.sh
2011-05-13
:~/aman> ./fr13th.sh 2013-05-09
2013-09-13
:~/aman> ./fr13th.sh 2007-06-29
2007-07-13
:~/aman> ./fr13th.sh 2007-07-13
2008-06-13

2

সি শার্প

240 টি অক্ষর। সি # এর জন্য "কেবলমাত্র একটি ফাংশনের অভ্যন্তরে রান" মোড দরকার!

using System;class P{static void Main(string[] a){var n=DateTime.Now;if(a.Length>0)DateTime.TryParse(args[0],out n);while(true){n=n.AddDays(1);if((n.Day==13)&&(n.DayOfWeek==(DayOfWeek)5))break;}Console.WriteLine(n.ToString("yyyy-MM-dd"));}}

আন golfed:

using System;

class P
{
    static void Main(string[] a)
    {
        var n = DateTime.Now;
        if (a.Length > 0) DateTime.TryParse(args[0], out n);
        while (true)
        {
            n = n.AddDays(1);
            if ((n.Day == 13) && (n.DayOfWeek == (DayOfWeek)5)) break;
        }
        Console.WriteLine(n.ToString("yyyy-MM-dd"));
    }
}

টেস্ট আউটপুট

\Debug> f13.exe 2013-05-09
2013-09-13

\Debug> f13.exe 2007-06-29
2007-07-13

\Debug> f13.exe 2007-07-13
2008-06-13

\Debug> f13.exe
2011-05-13

2

ডি: 227 অক্ষর

import std.datetime,std.stdio;void main(string[]a){auto d=a.length<2?cast(Date)(Clock.currTime()):Date.fromISOExtendedString(a[1]);for(;d.dayOfWeek!=DayOfWeek.fri||d.day!=13;d+=dur!"days"(1)){}writeln(d.toISOExtendedString());}

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

import std.datetime, std.stdio;

void main(string[] a)
{
    auto d = a.length < 2 ? cast(Date)(Clock.currTime()) : Date.fromISOExtendedString(a[1]);

    for(; d.dayOfWeek != DayOfWeek.fri || d.day != 13; d += dur!"days"(1)) {}

    writeln(d.toISOExtendedString());
}

মজার অংশটি হ'ল ডি এর std.datetime এই ধরণের কোডটি লিখতে খুব সহজ করে তোলে, এটি অবিশ্বাস্যভাবে ভার্জোজ - মূলত ফাংশনের নামগুলির কারণেও। সুতরাং, কোডটির ব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা খুব বেশি তবে এটি কোড গল্ফযোগ্যতা বরং কম rather


2

পাইথন - 166 অক্ষর

স্টিডিনের কাছ থেকে পড়ে, তাই আজকের তারিখটি চাইলে আপনাকে ফাঁকা রেখা খাওয়াতে হবে

from datetime import*
D=datetime
e=timedelta(1)
I=raw_input()
d=e+(I and D.strptime(I,"%Y-%m-%d")or D.now())
while(d.weekday()+1)*d.day-65:d+=e
print d.strftime("%F")

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

@ ড্যানিয়েল, এটি মিস করেছেন। 26 স্ট্রোক পরে ...
gnibbler

অতীত থেকে ব্লাস্ট :) আমরা যদি আমাদের সমাধানগুলিতে যোগদান করি তবে আমরা একটি সহযোগী 144 টি চর পেতে (নীচে দেখুন!) :)
রবার্তো

2

এসকিউএলাইট, 374 টি অক্ষর

(পঠনযোগ্যতার জন্য এখানে লাইন ব্রেকগুলি যুক্ত করা হয়েছে; গণনায় অন্তর্ভুক্ত নেই))

প্রযুক্তিগত সীমাবদ্ধতার কারণে বাদ দেওয়া "ব্যবহারকারীকে কোনও কমান্ড লাইন আর্গুমেন্ট হিসাবে বা STDIN এর মাধ্যমে" শুরুর তারিখ সরবরাহ করার অনুমতি দিন Requ

CREATE TABLE R(N UNIQUE);
INSERT INTO R VALUES(0);
INSERT INTO R VALUES(1);
REPLACE INTO R SELECT A.N*2048|B.N*1024|C.N*512|D.N*256|E.N*128|F.N*64|
G.N*32|H.N*16|I.N*8|J.N*4|K.N*2|L.N FROM
R A,R B,R C,R D,R E,R F,R G,R H,R I,R J,R K,R L;
CREATE TABLE F AS SELECT DATE('2000-01-13','+'||N||'months') AS D
FROM R WHERE STRFTIME('%w',D)='5';
SELECT MIN(D) FROM F WHERE D>DATE('now');

প্রথম 4 টি স্টেটমেন্ট 0 থেকে 4095 পর্যন্ত সমস্ত সংখ্যাসমৃদ্ধ একটি একক কলাম সহ একটি সারণী (আর) তৈরি করে।

5 তম বিবৃতি 2000-10-10-13 এবং 2340-12-13 এর মধ্যে 13 ই শুক্রবার সমস্ত শুক্রবারের একটি টেবিল (এফ) তৈরি করে।

6th ষ্ঠ বিবৃতি সহজভাবে বর্তমান (ইউটিসি) তারিখের পরে 13 তম শুক্রবার ফিরে আসে।


গ্রেগরিয়ান ক্যালেন্ডারে 340 বছর নয়, 400 বছরের চক্র রয়েছে। নাকি আমি এখানে কিছু মিস করছি?
জো

এটি 2000-2340 সীমার বাইরে কয়েক বছর ধরে পরিচালনা করে না। এটি কেবল একটি স্বেচ্ছাসেবী পছন্দ ছিল।
dan04

2

পিএইচপি - 103

(পাশবিক বল)

<?for($d=date_create(@$argv[1]);$d->modify('next fri')&&$d->format(@d)-13;);die($d->format("Y-m-d\n"));

Ungolfed:

<?
$d = new DateTime(@$argv[1]);
while ($d->modify('next fri')) {
        if ($d->format('d') == 13) {
                die($d->format("Y-m-d\n"));
        }
}

টেস্ট:

$ php 979.php 2013-05-09
2013-09-13
$ php 979.php 2007-06-29
2007-07-13
$ php 979.php 2007-07-13
2008-06-13
$ php 979.php 
2011-05-13

1
আপনি পরিবর্তন করে 1 টি অক্ষর বাঁচাতে !=পারেন -। এছাড়াও আপনি $d->modify('next fri')লুপের ইনক্রিমেন্ট বিভাগে 2 অক্ষর বাঁচাতে পারবেন ।
HoLyVieR

লুপের আগে আমাকে পরবর্তী শুক্রবার পরিবর্তন করতে হবে, যদি প্রদত্ত তারিখটি ইতিমধ্যে শুক্রবার হয় 13 :-) (বা এমনকি 13)
আর্নাড লে ব্ল্যাঙ্ক

ব্যবহার করুন -rএবং আপনার ট্যাগ লাগবে না। এর সাথে ডিফল্ট কনফিগারেশন ব্যবহার করুন -nএবং আপনার দরকার নেই @\nঅপ্রয়োজনীয় echoপরিবর্তে dieঅন্য বাইট সংরক্ষণ করুন। ক্লাসের strtotimeপরিবর্তে Dateআরও একটি বা দু'জন সঞ্চয় করতে পারে।
টাইটাস

2

সি #, 206 194 টি অক্ষর

হালনাগাদ

সমস্যাটি কিছুটা আলাদা করা, তাই আমি আমার অন্য প্রচেষ্টাটি এখানে পুরোপুরি ছেড়ে দিয়েছি।

using System:class p{static void Main(string[]a){var n=a.Length>0?DateTime.Parse(a[0]):DateTime.Now;for(;(n=n.AddDays(5-(int)n.DayOfWeek).AddDays(7)).Day!=13;);Console.Write("{0:yyy-MM-d}",n);}}

এখানে, আমি "বর্তমান" সপ্তাহের শুক্রবার খুঁজে পাচ্ছি এবং তারপরে আমি 13 এর একটি খুঁজে না পাওয়া পর্যন্ত 7 দ্বারা বৃদ্ধি পাচ্ছি a কয়েকটি অক্ষর শেভ করার জন্য আমি লুপ এবং আউটপুট বিন্যাসের জন্য জোয়েরও ব্যবহার করেছি।

Ungolfed:

using System;
class p
{
    static void Main(string[] a)
    {
        var n = a.Length > 0 ? DateTime.Parse(a[0]) : DateTime.Now;

        for (; (n = n.AddDays(5 - (int)n.DayOfWeek).AddDays(7)).Day != 13; ) ;

        Console.Write("{0:yyy-MM-d}", n);
    }
}

মূল:

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

using System;class p{static void Main(string[]a){var n=a.Length>0?DateTime.Parse(a[0]):DateTime.Now;do n=n.AddDays(1);while(!(n.Day==13&&n.DayOfWeek+""=="Friday"));Console.Write(n.ToString("yyyy-MM-dd"));}}

Ungolfed:

using System;
class p
{
    static void Main(string[] a)
    {
        var n = a.Length > 0 ? DateTime.Parse(a[0]) : DateTime.Now;
        do
        {
            n = n.AddDays(1);
        } while (!(n.Day == 13 && n.DayOfWeek + "" == "Friday"));

        Console.Write(n.ToString("yyyy-MM-dd"));
    }
}

2

আর, 113 টি অক্ষর

f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))

উদাহরণ রান:

> f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))
1: 2007-06-29
2: 
Read 1 item
2007-07-13

> f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))
1:
Read 0 items
2013-12-13

> f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))
1: 2013-12-13
2: 
Read 1 item
2014-06-13

2

পার্ল 6 , 69 বাইট

$_=Date.new(@*ARGS[0]//Date.today);.++while .day*.day-of-week-65;.say

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

কেবলমাত্র -5-এর জন্য @ ASCII- কে ধন্যবাদ


অবৈধ, কেসটি পরিচালনা করতে হবে যখন ব্যবহারকারী কোনও যুক্তি সরবরাহ করে না, এছাড়াওday-of-week==5
ASCII- কেবল

@ এএসসিআইআই-কেবলমাত্র স্থির
ভেন

ওহ হ্যাঁ, এটি একটি সম্পূর্ণ প্রোগ্রাম হতে হবে, কোনও ফাংশন নয়
ASCII- কেবল

থেকে লিঙ্ক করতে চাইতে পারেন এই (এমনকি ভাল, সেখানে যান, Esc -> গুলি -> ছ একটি দারুণভাবে ফর্ম্যাট পোস্ট)
হওয়া ASCII শুধুমাত্র


1

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

F13=function(x){
    z=function(x){return (''+x).replace(/^(.)$/,'0$1')}
    D=x?new Date(x):new Date(),Z=864e5,X=D.getDay()%7,X+=+D+(X?Z*(5-X):0);
    do{
        X+=Z*7;
        D=new Date(X);
    }while(D.getDate()!=13)
    return D.getFullYear()+"-"+z(D.getMonth()+1)+"-"+z(D.getDate());
}

PS: হ্যাঁ, আমি জানি, আমি প্রথম নিয়মটি ভঙ্গ করেছি (কেবল কোনও ফাংশন হতে পারে না)

এর উপর পরীক্ষা জাভাস্ক্রিপ্ট শেল

F13("2013-05-09") // 2013-09-13
2013-09-13
F13("2007-06-29") // 2007-07-13
2007-07-13
F13("2007-07-13") // 2008-06-13
2008-06-13
F13() //2011-05-13
2011-05-13

+1 এসটিডিআইএন বিধিটিকে সমর্থন করে অভিজাত সাধারণ উদ্দেশ্যে ভাষা লড়াই করুন।
চালক

1

টি-এসকিউএল 359 285 253 অক্ষর

CREATE PROCEDURE f13(@d DateTime=null)AS
SET @d=ISNULL(@d,GETDATE())
;WITH d AS
(SELECT @d+1 d
UNION ALL SELECT d+1 FROM d
WHERE DATEPART(dw,d)<>6 OR DAY(d)<>13)SELECT CAST(d AS DATE) FROM d
WHERE DATEPART(dw,d)=6 AND DAY(d)=13
OPTION (MAXRECURSION 999)

আমি টি-এসকিউএল পদ্ধতিটি ব্যবহার করে আমার অ-চালাক ভার্বোস ডেট ফাংশন দিয়ে এসকিউএলাইট সলিউশনে কেবল স্ম্যাকটি রেখে দিতে চেয়েছিলাম।

আপডেট: আমার আসল আশঙ্কা যে এক দিনের ইনক্রিমেন্ট করা এক মাসের ইনক্রিমেন্টের চেয়ে বেশি জায়গা নেবে তা খুব ভুল ছিল ।

পরীক্ষার ফলাফল (এসএসএমএস):

f13 '2013-05-09';
GO

f13 '2007-06-29';
GO

f13 '2007-07-13';
GO

f13;
GO
--

d
----------
2013-09-13

d
----------
2007-07-13

d
----------
2008-06-13

d
----------
2011-05-13

1

অন্য জাভাস্ক্রিপ্ট, 153

আমি অন্য জাভাস্ক্রিপ্টের উত্তর পোস্ট করেছি কারণ আমি প্রথম মন্তব্য করতে পারি না ...

a=new Date(process.argv[2]||Date.now());for(b=1;b;b=a.getDate()!=13||!/^F/.test(a))a.setTime(a.getTime()+864e5);console.log(a.toISOString().substr(0,10))

নোডজেএস দিয়ে কার্যকর করুন:

$ node fr13th
2013-12-13

$ node fr13th 2007-06-29
2007-07-13

$ node fr13th 2013-05-09
2013-09-13

1

পাইথন ৩.৩, ১66 টি অক্ষর

import datetime as d
t=input()
t=d.date(*map(int,t.split()))if t!=""else d.date.today()
while 1:
 t+=d.timedelta(1)
 if t.day==13and t.weekday()==4:
  print(t);break

ইনপুটটি ফর্ম্যাটে রয়েছে 2013 1 1,

>>> ================================ RESTART ================================
>>> 
2013 1 1
2013-09-13

বা কেবল আজকের তারিখটি ব্যবহার করতে এন্টার টিপুন (এই আউটপুটটির জন্য 2013/12/11 হবে)

>>> ================================ RESTART ================================
>>> 

2013-12-13

(আসলে আমার সমাধান এবং @ গিগাবলারের মিশ্রণ রয়েছে যা ১৪৪ টি চরিত্রের গণনা করে)

import datetime as d
t=input()
t=d.date(*map(int,t.split()))if t!=""else d.date.today()
while t.day*t.weekday()-65:
 t+=d.timedelta(1)
print(t)

খুব সুন্দর লাইনটি while t.day*t.weekday()-65:@ জিনিবলারের সমাধান থেকে।


1

জাপট, 35 বাইট

ÐUªKs3 ¯A
@e ¶5©D¶Uf}a@f1Uf Ä
s3 ¯A

-8 বাইটস কেবলমাত্র এএসসিআইআইকে ধন্যবাদ!

চেষ্টা করে দেখুন!


অবৈধ আউটপুট ফর্ম্যাট ...
ASCII- কেবল


হ্যাঁ, আমি এটি নিয়ে কাজ করছি :) স্পষ্টতই toISOStringইউটিসিতে রূপান্তর করে যা তারিখটি পরিবর্তন করে
ডানা

কিভাবে এটি তারিখ পরিবর্তন করে? কি Kস্থানীয় সময় যেমন দোকান সময়?
ASCII- কেবল

1
ফিক্সড, 39 (অবশ্য ধরণ এটা ইউটিসি (AFAICT আজ জন্য সঠিক ফলাফলের আউটপুট) এবং যে আমার জন্য ভাল যথেষ্ট বেশি আমি ইতিমধ্যে am সময়ের অঞ্চলগুলোকে সঙ্গে জগাখিচুড়ি করতে চান না।।)
হওয়া ASCII শুধুমাত্র

1

সুইফট 4 , 310 বাইট

import Foundation
let (u,f)=(Calendar.current,DateFormatter())
f.dateFormat="yyyy-MM-dd"
var t={(x:Date)->Int in let c=u.dateComponents([.weekday,.day],from:x);return c.weekday!*c.day!},d=readLine().map{f.date(from:$0)!} ?? Date()
while t(d) != 65{d=u.date(byAdding:.day,value:1,to:d)!}
print(f.string(from:d))

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

-4 ট্যাগটাকো ধন্যবাদ।

হায়রে ...:

  • তারিখ / ক্যালেন্ডারের জন্য ফাউন্ডেশন প্রয়োজন।
  • সুইফট Intএর হিসাবে ব্যবহার করার অনুমতি দেয় নাBool
  • শর্টহ্যান্ড এনাম সিনট্যাক্স সহায়ক, যদিও তেমন কিছু নয়।
  • চারপাশে স্থান প্রয়োজন ??
  • != এছাড়াও ব্যবধান প্রয়োজন, পাছে এটি একটি মোড়ক হিসাবে ব্যাখ্যা করা।

0

VB.net (96c *)

প্রবেশ

Function NextFridayThe13th(d As Date) As Date
  While d.DayOfWeek<>DayOfWeek.Friday
    d=d.AddDays(1)
  End While
  While d.Day<>13
    d=d.AddDays(7)
  End While
  Return d
End Function
  • আমি মনে করি vb.net এর জন্য কোডগলফ গণনাটি অন্তর্ভুক্ত করা উচিত নয় ফাংশনের স্বাক্ষর , সমাপনী ফাংশন এবং রিটার্ন । সুতরাং এটি কেবল এটি অভ্যন্তরীণ বাস্তবায়ন সম্পর্কে করে।

আমার স্কোরিংটি তাই ভেঙে গেছে

While d.DayOfWeek<>DayOfWeek.Friday    '35c
d=d.AddDays(1)                         '13c  48c
End While                              ' 9c  57c
While d.Day<>13                        '15c  72c
d=d.AddDays(7)                         '14c  86c
End While                              ' 9c  95c
Return d                               ' 1c  96c

0

রেবোল, 136

d: any[do system/script/args now]until[d: d + 1 all[d/day = 13 d/weekday = 5]]print format/pad[4"-"-2"-"-2]reduce[d/year d/month d/day]

Ungolfed:

d: any [do system/script/args  now]

until [
    d: d + 1 
    all [d/day = 13 d/weekday = 5]
]

print format/pad [4 "-" -2 "-" -2] reduce [d/year d/month d/day]

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

$ rebol friday13th.reb 2013-05-09
2013-09-13
$ rebol friday13th.reb
2014-06-13

0

জাভা 8, 200 197 বাইট

interface M{static void main(String[]a){java.time.LocalDate z=null,r=a.length<1?z.now():z.parse(a[0]);for(;(r=r.plusDays(1)).getDayOfWeek().getValue()*r.getDayOfMonth()!=65;);System.out.print(r);}}

ব্যাখ্যা:

এটি এখানে চেষ্টা করুন (বর্তমান তারিখটি ব্যবহার করার জন্য যুক্তিটি সরিয়ে দিন)।

interface M{                        // Class
  static void main(String[]a){      //  Mandatory main-method
    java.time.LocalDate z=null,     //   LocalDate to reduce bytes when using static calls
     r=a.length<1?                  //   If no argument is given:
        z.now()                     //    Start at the current date
       :                            //   Else:
        z.parse(a[0]);              //    Start at the date of the first argument
    for(;(r=r.plusDays(1))          //   Before every iteration, go to the next day
                                    //   Loop as long as:
         .getDayOfWeek().getValue()
                                    //    the 1-indexed day of the week (Friday = 5)
         *r.getDayOfMonth()         //    multiplied by the day of the month
        !=65;                       //    is not 65
                                    //    (5 and 13 are primes, so only 5*13 results in 65)
    );                              //   End of loop
    System.out.print(r);            //   Print the result Friday the 13th
  }                                 //  End of main-method
}                                   // End of class

দ্রষ্টব্য: মুদ্রণ ইতিমধ্যে যখন জাভার ডিফল্ট ফর্ম্যাট yyyy-MM-dd


0

05 এ বি 1 ই , 141 বাইট

gĀi'-¡ëžežfžg)}V[Y`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()O7%6QYн13Q*#}YRεDgi0ì]'-ý

05AB1E তারিখের অবজেক্টস বা গণনার জন্য কোনও বিল্টিন নেই। এটির তারিখগুলি সম্পর্কিত একমাত্র বিল্টিন হ'ল আজকের বছর / মাস / দিন / ঘন্টা / মিনিট / সেকেন্ড / মাইক্রোসেকেন্ড।

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

কার্য দিবস কাউন্টডাউন চ্যালেঞ্জের বেশিরভাগ ক্ষেত্রে আমার 05AB1E উত্তর থেকে প্রাপ্ত (যে কারণে আমি যখন বাগটি পেলাম তখন প্রায় এক ঘন্টা আগে আমি এটি সম্পাদনা করেছি ..)

ইনপুট হ'ল ফর্ম্যাটের একটি স্ট্রিং dd-MM-yyyy(তবে আউটপুট ফর্ম্যাটে রয়েছে yyyy-MM-dd, কারণ এটি চ্যালেঞ্জের অন্যতম নিয়ম rules

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

gĀi        # If an input is given:
   '-¡    '#  Split it by "-"
  ë        # Else:
   že      #  Push today's day
     žf    #  Push today's month
       žg  #  Push today's year
         ) #  Wrap them into a single list
  }V       # After the if-else statement: pop and store it in variable `Y`
[          # Start an infinite loop
 Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
           #  Go to the next day
           #  (see my linked The Work Day Countdown answer for an explanation)
 Y`UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()O7%
           #  Calculate the day of the week (0 = Saturday, 1 = Sunday, ..., 6 = Friday)
           #  (see my linked The Work Day Countdown answer for an explanation)
 6Q        #  Check if the day of the week is a Friday
 Yн        #  Push the days of the current date
   13Q     #  Check if it's the 13th
 *         #  And if both checks are truthy:
  #        #   Stop the infinite loop
}YR        # After the infinite loop: push the resulting date-list, and reverse it
ε          # Map each value to:
 Dgi       #  If it's only a single digit:
    0ì     #   Prepend a leading "0"
]          # Close both the if-statement and map
 '-ý      '# Join the result by "-"
           # (and output the result implicitly)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.