วันศุกร์ที่ 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ส่งออกจะ ok สำหรับตัวอย่างแรก?
JB

คุณหมายความว่าเราสามารถตัดสินใจได้ว่าเราต้องการใช้วันที่เป็นอาร์กิวเมนต์หรือมาจาก STDIN หรือว่าเราต้องการสนับสนุนทั้งคู่
sepp2k

@ sepp2k คุณสามารถตัดสินใจได้ว่าคุณไม่จำเป็นต้องให้การสนับสนุนทั้งคู่ผู้ใช้ต้องการวิธีป้อนวันที่
Daniel Standage

@JB ใช่เพราะมีโซลูชั่นอื่น ๆ ที่ตอบสนองความต้องการทั้งหมดฉันจะไม่ยอมรับการตอบสนองของคุณในฐานะที่เป็นทางออกแม้ว่ามันจะสั้นที่สุดก็ตาม นั่นไม่ได้หมายความว่าการตอบสนองของคุณไม่ได้ให้ข้อมูล ... แต่ใช่แล้วการจัดการกับรูปแบบวันที่ที่ไม่สอดคล้องกันนั้นน่าผิดหวัง
Daniel Standage

อันนี้เป็นไปไม่ได้กับ golfscript เพราะมันไม่รู้วันที่วันนี้ * นอกจากนี้ยังไม่มีไลบรารีวันที่ดังนั้นน่าจะเป็นคำตอบที่ค่อนข้างใหญ่ (* คุณสามารถใช้ทับทิม EVAL จะได้รับมัน แต่แล้วเช่นกันอาจจะใช้ lib วันทับทิมเกินไป)
gnibbler

คำตอบ:


6

Windows PowerShell, 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

นี่เป็นบิตที่มีความละเอียดอ่อน locale; หากเครื่องของคุณล้มเหลวให้ลองตั้งค่ารูปแบบวันที่ของคุณเป็น ISO-8601 ล่วงหน้า :-)

โอ้และสามารถแปลงเป็น 65 ไบต์เช่นเดียวกับรุ่น 72 ไบต์

ประวัติความเป็นมา:

  • 2011-02-17 00:33 (92) ความพยายามครั้งแรก
  • 2011-02-17 00:35 (85) ได้รับการปรับปรุงวันที่เริ่มต้น
  • 2011-02-17 00:37 (79) เปรียบเทียบผลิตภัณฑ์แทนที่จะเป็นรายวันและรายสัปดาห์ ถูกขโมยมาจาก Ventero
  • 2011/02/17 00:40 (76) forดึงสายครั้งแรกใน การเปรียบเทียบเป็นการลบแทนที่จะ-eqบันทึกอีกสองไบต์
  • 2011-02-17 00:53 (75) dateสตริงรูปแบบUnix สั้นกว่าเล็กน้อย
  • 2011-02-17 11:42 (74) เปลี่ยนกลับเป็นรูปแบบวันที่ที่เป็นค่าเริ่มต้น แต่yyy-MM-dพอเพียง (ตั้งแต่ปีนั้นยาวกว่าสามตัวอักษรเสมอและวันนั้นคือ 13 เสมอขอบคุณ Ty Auvil สำหรับสิ่งนี้

ทำไมคุณจะผ่าน "วันที่ $ args" เพื่อiex? ลองเพียง (วันที่ $ args) แทน
Iszi

@Iszi: ใช้เพื่อดำเนินการ "หากผู้ใช้ไม่มีวันที่เริ่มต้นให้ใช้วันนี้เป็นวันที่เริ่มต้น" กฎ. หากคุณอาเรย์ว่างหรือ$nullจะGet-Dateคุณจะได้รับข้อผิดพลาดไม่ได้วันที่ปัจจุบัน "date $args"|iexอย่างไรก็ตามแก้ไขให้เป็นวันที่ที่กำหนดใน$args หรือวันที่ปัจจุบันซึ่งเป็นสิ่งที่เราต้องการที่นี่
Joey

4

ทุบตี, 75

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

นี่เป็นบิตที่มีความละเอียดอ่อน locale; ถ้ามันล้มเหลวในเครื่องของคุณลอง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

Ruby, 96 75 ตัวอักษร

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

ใช้วันที่จาก stdin ในการไม่ระบุวันที่ให้กด ctrl-d

ขอบคุณมากสำหรับความช่วยเหลือของ Ventero

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

ตัวอย่าง IO:

$ 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"
Ventero

จริงโดยใช้ห่วงแทน iterator ลดระยะเวลาในรหัส 76 require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<dตัวอักษร: และคุณสามารถอ่านวันที่จาก stdin ด้วยgetsแทนที่จะ$*[0]บันทึกอักขระอื่น (ป้อน EOF เพื่อรับพฤติกรรมเริ่มต้น)
Ventero

@Ventero: ดีมากขอบคุณ
sepp2k

3

C #, 185

ขึ้นอยู่กับวิธีแก้ปัญหา C # ของ Andrew Koesterแต่ได้รับการแก้ไขอย่างหนักระหว่างทาง ในที่สุดฉันก็มาถึงโซลูชันที่คล้ายกับโซลูชัน PowerShell ของฉัน:

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

Perl (และอื่น ๆ ), 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"

Perl 5.10 หรือสูงกว่าทำงานด้วยหรือ-E 'code here' -M5.010 fileความต้องการdate(จาก coreutils สำหรับ Linux) และcal(จาก util-linux)

วิ่งตัวอย่าง:

$ 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

ทุบตี

#!/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 ตัวอักษร C # ต้องการโหมด "ทำงานภายในฟังก์ชั่นเท่านั้น"!

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"));}}

ยกเลิกแข็งแรงเล่นกอล์ฟ:

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

D: 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());
}

ส่วนที่สนุกคือในขณะที่ D's std.datetime ทำให้โค้ดประเภทนี้เขียนได้ง่ายมาก แต่ก็มีรายละเอียดที่ไม่น่าเชื่อ - เนื่องจากชื่อฟังก์ชั่นที่แม่นยำ (และยาว) ดังนั้นความสามารถในการใช้งานและการบำรุงรักษาของรหัสจึงสูงมาก แต่รหัสความสามารถในการเล่นกอล์ฟค่อนข้างต่ำ


2

Python - 166 ตัวอักษร

อ่านจาก stdin ดังนั้นคุณต้องป้อนบรรทัดว่างหากคุณต้องการวันที่ในปัจจุบัน

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")

นอกจากว่าฉันขาดอะไรบางอย่างที่ไม่ได้ตอบสนองความต้องการที่ 4 (ถ้าไม่มีวันที่ให้เริ่มจากวันนี้)
Daniel Standage

@Daniel พลาดไปหนึ่งอัน 26 จังหวะในภายหลัง ...
gnibbler

ระเบิดจากอดีตขออภัย :) ถ้าเราเข้าร่วมการแก้ปัญหาของเราเราจะได้รับการทำงานร่วมกัน 144 ตัวอักษร (ดูด้านล่าง!) :)
Roberto

2

SQLite, 374 ตัวอักษร

(เพิ่มตัวแบ่งบรรทัดที่นี่เพื่อความสะดวกในการอ่านไม่รวมอยู่ในการนับ)

ความต้องการ "อนุญาตให้ผู้ใช้ระบุวันที่เริ่มต้นไม่ว่าจะเป็นอาร์กิวเมนต์บรรทัดคำสั่งหรือผ่าน STDIN" เนื่องจากข้อ จำกัด ทางเทคนิค

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 คำแรกสร้างตาราง (R) ด้วยคอลัมน์เดียวที่มีจำนวนเต็มทั้งหมดตั้งแต่ 0 ถึง 4095

คำสั่งที่ 5 สร้างตาราง (F) ของวันศุกร์ที่ 13 ระหว่างปี 2000-10-13 และ 2340-12-13

คำสั่งที่ 6 ส่งคืนวันศุกร์แรกที่ 13 หลังจากวันที่ปัจจุบัน (UTC)


ปฏิทินเกรโกเรียนมีรอบ 400 ปีไม่ใช่ 340 ปี หรือฉันกำลังพลาดบางสิ่งที่นี่
Joey

มันไม่ได้จัดการปีนอกช่วง 2000-2340 นั่นเป็นเพียงทางเลือกโดยพลการ
dan04

2

PHP - 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 ตัวละครโดยการเปลี่ยนไป!= -นอกจากนี้คุณยังสามารถบันทึกได้ถึง 2 ตัวอักษรโดยเลื่อนขึ้น$d->modify('next fri')ในส่วนเพิ่มของลูป
HoLyVieR

ฉันจำเป็นต้องปรับเปลี่ยนเป็นวันศุกร์หน้าก่อนวงในกรณีที่วันที่กำหนดเป็นวันศุกร์ 13 :-) (หรือแม้กระทั่งเพียง 13)
Arnaud Le Blanc

ใช้-rและคุณไม่จำเป็นต้องใช้แท็ก ใช้การกำหนดค่าเริ่มต้นด้วย-nและคุณไม่จำเป็นต้อง@ใช้ \nไม่จำเป็น echoแทนการdieบันทึกไบต์อื่น strtotimeแทนที่จะเป็นDateคลาสสามารถประหยัดหนึ่งหรือสองอย่าง
ติตัส

2

C #, 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);}}

ที่นี่ฉันค้นหา "ปัจจุบัน" ในวันศุกร์ของสัปดาห์และเพิ่มขึ้นอีก 7 จนกว่าฉันจะพบที่ 13 ฉันยังใช้ Joey's สำหรับการวนซ้ำและการจัดรูปแบบผลลัพธ์เพื่อโกนอักขระบางตัว

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);
    }
}

เดิม:

นี่คล้ายกับของ Andrew ข้างต้น แต่มีความแตกต่างมากพอที่ฉันตัดสินใจโพสต์คำตอบแยกต่างหากมากกว่าแสดงความคิดเห็นและแนะนำการแก้ไข

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

R, 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

Perl 6 , 69 ไบต์

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

ลองออนไลน์!

ขอบคุณ @ ASCII เท่านั้นสำหรับ -5


ไม่ถูกต้องต้องจัดการกับกรณีเมื่อผู้ใช้ไม่ได้ให้ข้อโต้แย้งday-of-week==5
ASCII-only

@ ASCII-fixed เท่านั้น
Ven

โอ้ใช่มันต้องเป็นโปรแกรมที่สมบูรณ์ไม่ใช่ฟังก์ชั่น
เท่านั้น

อาจต้องการที่จะเชื่อมโยงกับสิ่งนี้ (ดียิ่งขึ้นไปที่นั่น esc -> s -> g สำหรับโพสต์ที่จัดรูปแบบเป็นอย่างดี)
ASCII-only


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: ใช่ฉันรู้ว่าฉันทำผิดกฎข้อแรก (ไม่ใช่แค่ฟังก์ชั่น)

ทดสอบบนjavascript shell

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 ต่อสู้กับภาษาวัตถุประสงค์ชั้นนำที่นิยมกฎ STDIN
mootinator

1

T-SQL 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)

ฉันแค่อยากจะวาง Smack ลงบนโซลูชัน SQLite ด้วยฟังก์ชั่น Date Verbose ที่ไม่ฉลาดของฉันโดยใช้โพรซีเดอร์ T-SQL

อัปเดต: ความกลัวเริ่มแรกของฉันที่เพิ่มขึ้นหนึ่งวันจะใช้พื้นที่มากกว่าการเพิ่มขึ้นหนึ่งเดือนนั้นไม่ถูกต้องมาก

ผลการทดสอบ (SSMS):

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

อีก Javascript, 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))

ดำเนินการกับ nodeJS:

$ node fr13th
2013-12-13

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

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

1

Python 3.3, 166 ตัวอักษร

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

หรือเพียงแค่กด Enter เพื่อใช้วันที่วันนี้ (จะเป็น 2013/12/54 สำหรับผลลัพธ์นี้)

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

2013-12-13

(อันที่จริงแล้วมีการผสมผสานระหว่างทางออกของฉันกับ @gnibbler ที่นับ 144 ตัวอักษร)

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:มาจากโซลูชันของ @ gnibbler


1

Japt, 35 ไบต์

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

-8 ไบต์ขอบคุณ @ASCIIOnly!

ลองมัน!


รูปแบบผลลัพธ์ไม่ถูกต้อง ...
เท่านั้น


ใช่ฉันกำลังทำอยู่ :) เห็นได้ชัดว่าtoISOStringแปลงเป็น UTC ซึ่งเปลี่ยนวันที่
dana

มันเปลี่ยนวันได้อย่างไร? ไม่Kเวลาที่เก็บไว้เป็นเวลาท้องถิ่น?
ASCII เท่านั้นเท่านั้น

1
คงที่39 (ดีแล้วมันออกผลลัพธ์ที่ถูกต้องสำหรับวันนี้ที่ UTC (AFAICT) และดีพอสำหรับฉันไม่ต้องการยุ่งกับเขตเวลามากกว่าที่ฉันเป็นอยู่แล้ว)
ASCII-only

1

Swift 4 , 310 bytes

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 ขอบคุณ TagTaco

อนิจจา...:

  • ต้องการรากฐานสำหรับวันที่ / ปฏิทิน
  • Swift ไม่อนุญาตให้Intใช้เป็นBoolที่จะนำมาใช้เป็น
  • ไวยากรณ์ชวเลข enum เป็นประโยชน์แม้ว่าจะไม่มาก
  • ต้องมีพื้นที่รอบ ๆ ??พื้นที่จะต้องไปรอบ ๆ
  • != ยังต้องเว้นระยะเพื่อมิให้ตีความได้ว่าเป็นการแกะ

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
  • ฉันคิดว่า CodeGolf นับสำหรับ 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

Rebol, 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

Java 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

หมายเหตุ: รูปแบบเริ่มต้นของ Java yyyy-MM-ddเมื่อพิมพ์ที่มีอยู่แล้ว


0

05AB1E , 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 ไม่มี builtins ใด ๆ สำหรับวัตถุ Date หรือการคำนวณ builtin เพียงอย่างเดียวเกี่ยวกับวันที่มีคือวันนี้ปี / เดือน / วัน / ชั่วโมง / นาที / วินาที / microseconds

ดังนั้นเนื่องจากรหัสเกือบทั้งหมดที่คุณเห็นคือการคำนวณด้วยตนเองเพื่อไปยังวันถัดไปและการคำนวณวันในสัปดาห์

ส่วนใหญ่มาจากคำตอบ 05AB1E ของฉันในการท้าทายนับถอยหลังวันทำงาน (ซึ่งเป็นเหตุผลที่ฉันแก้ไขหนึ่งชั่วโมงที่ผ่านมาเมื่อฉันเจอข้อผิดพลาด .. )

อินพุตเป็นสตริงในรูปแบบdd-MM-yyyy(แต่เอาต์พุตอยู่ในรูปแบบyyyy-MM-ddเนื่องจากเป็นหนึ่งในกฎของการท้าทาย)

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

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.