Thứ sáu tới ngày 13


15

Chương trình ngắn nhất có thể dự đoán lần thứ sáu tới sẽ rơi vào ngày 13 của tháng là gì?

  • Phải là một chương trình hoạt động hoàn chỉnh (không chỉ là một hàm / chương trình con)
  • Phải in ngày ra theo định dạng sau: YYYY-MM-DD
  • Cho phép người dùng cung cấp ngày bắt đầu dưới dạng đối số dòng lệnh hoặc thông qua STDIN
  • Nếu người dùng không cung cấp ngày bắt đầu, hãy sử dụng ngay hôm nay làm ngày bắt đầu.
  • Nếu ngày bắt đầu là Thứ Sáu ngày 13, chương trình sẽ tìm thấy Thứ Sáu ngày 13 tiếp theo .

Nếu tôi chạy chương trình hôm nay (ngày 16 tháng 2 năm 2011) tôi sẽ nhận được kết quả đầu ra như sau.

$ ./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

Một 2013-9-13đầu ra sẽ ổn cho ví dụ đầu tiên?
JB

Bạn có nghĩa là chúng tôi có thể quyết định xem chúng tôi muốn lấy ngày làm đối số hoặc từ STDIN hoặc chúng tôi cần hỗ trợ cả hai?
sepp2k

@ sepp2k Bạn có thể quyết định, bạn không cần hỗ trợ cả hai, người dùng chỉ cần một cách để nhập ngày.
Daniel Standage

@JB Vâng, vì có một số giải pháp khác đáp ứng tất cả các yêu cầu, tôi sẽ không chấp nhận phản hồi của bạn là giải pháp ngay cả khi đó là giải pháp ngắn nhất. Điều đó không có nghĩa là phản hồi của bạn không có nhiều thông tin ... nhưng vâng, xử lý một định dạng ngày không nhất quán sẽ gây khó chịu.
Daniel Standage

Chà, điều này thực sự không khả thi với golfscript vì nó không biết ngày hôm nay *. Nó cũng không có thư viện ngày nên dù sao cũng có thể là một câu trả lời khá lớn. (* bạn có thể sử dụng ruby ​​eval để lấy nó, nhưng sau đó cũng có thể sử dụng lib ngày ruby)
gnibbler

Câu trả lời:


6

Windows PowerShell, 74

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

Khá đơn giản. Một điều có lẽ khó hiểu là việc sử dụng "Get-Date $args" | Invoke-Expressionđể lấy ngày hiện tại (nếu $argstrống) hoặc ngày được chỉ định $argsmà không gây ra lỗi.

Biến thể 72 byte:

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

Mặc dù có độ tuổi, mặc dù ... điều này không làm tăng thời gian của cả ngày mỗi lần lặp mà thay vào đó chỉ là 900 nano giây. Nhưng hai byte ngắn hơn.

Biến thể 67 byte:

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

Đây là một chút nhạy cảm địa phương; nếu máy bị lỗi, hãy thử đặt định dạng ngày của bạn thành ISO-8601 trước. :-)

Ồ, và nó có thể được tạo thành 65 byte giống như phiên bản 72 byte.

Lịch sử:

  • 2011/02/17 00:33 (92) Lần thử đầu tiên.
  • 2011/02/17 00:35 (85) Cải thiện ngày đầu tiên.
  • 2011/02/17 00:37 (79) So sánh sản phẩm thay vì ngày và ngày trong tuần. Thừa nhận bị đánh cắp từ Ventero.
  • 2011/02/17 00:40 (76) Kéo dòng đầu tiên vào for. So sánh chỉ là phép trừ thay vì -eqtiết kiệm hai byte khác.
  • 2011/02/17 00:53 (75) dateChuỗi định dạng Unix ngắn hơn một chút.
  • 2011/02/17 11:42 (74) Hoàn nguyên về mẫu ngày mặc định nhưng yyy-MM-dđủ (vì năm luôn dài hơn ba ký tự và ngày luôn là 13. Cảm ơn Ty Auvil vì điều này.

Tại sao bạn lại chuyển "ngày $ args" sang iex? Thay vào đó, hãy thử (ngày $ args).
Iszi

@Iszi: Điều này được sử dụng để thực hiện "Nếu người dùng không cung cấp ngày bắt đầu, hãy sử dụng ngay hôm nay làm ngày bắt đầu." qui định. Nếu bạn vượt qua một mảng trống hoặc $nullđể Get-Datebạn sẽ nhận được một lỗi, không phải là ngày hiện tại. "date $args"|iextuy nhiên, giải quyết theo ngày được đưa ra $args hoặc ngày hiện tại, đó chỉ là những gì chúng ta muốn ở đây.
Joey

4

bash, 75

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

Đây là một chút nhạy cảm địa phương; Nếu nó bị lỗi trên máy của bạn, hãy thử exporting LC_ALL=Ctrướ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 ký tự

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

Lấy ngày từ stdin. Để không chỉ định ngày nhấn ctrl-d.

Cảm ơn rất nhiều vì sự giúp đỡ của Venter.

Ung dung:

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

Mẫu 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==65ngắn hơn 4 ký tự. Và bạn sẽ có thể thay thế Date.today.to_sbằng"thu"
Ventero

Trên thực tế, sử dụng một vòng lặp thay vì một trình vòng lặp rút ngắn mã thành 76 ký tự : require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. Và bạn có thể đọc ngày từ stdin getsthay vì $*[0]lưu một ký tự khác (nhập EOF để có hành vi mặc định).
Ventero

@Ventero: Rất đẹp, cảm ơn.
sepp2k

3

C #, 185

Dựa trên giải pháp C # của Andrew Koester , nhưng đã được sửa đổi rất nhiều trên đường đi. Cuối cùng tôi đã đến một giải pháp tương tự như giải pháp PowerShell của mình:

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 (và những người khác), 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 trở lên, chạy với -E 'code here'hoặc -M5.010 file. Nhu cầu date(từ coreutils cho Linux) vàcal (từ linux-linux)

Chạy mẫu:

$ 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

Tôi không chắc chắn khi số 0 hàng đầu trong nhiều tháng trước tháng 10 được giữ nguyên. Nó rõ ràng đã mất khi năm tháng trôi qua; nó dường như được giữ lại khi câu trả lời chỉ là vào tháng tới. Chúng ta hãy gọi đó là hành vi không xác định - này, đây là chơi gôn!


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

KHÁI NIỆM SỬ DỤNG:

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

MẪU 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

C #

240 ký tự. C # cần chế độ "chỉ chạy bên trong chức năng"!

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

Chưa chơi gôn:

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

Đầu ra thử nghiệm

\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 Nhân vật

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ễ đọc hơn:

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

Điều thú vị là trong khi std.datetime của D làm cho loại mã này rất dễ viết, thì nó cũng rất dài dòng - chủ yếu là do các tên hàm chính xác (và do đó dài). Vì vậy, khả năng sử dụng và khả năng bảo trì của mã là rất cao, nhưng khả năng chơi mã của nó khá thấp.


2

Python - 166 ký tự

Đọc từ stdin, vì vậy bạn cần cung cấp một dòng trống nếu bạn muốn ngày hôm nay

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

Trừ khi tôi thiếu một cái gì đó, điều này không giải quyết được yêu cầu thứ 4 (nếu không có ngày nào được cung cấp, hãy bắt đầu từ hôm nay).
Daniel Standage

@Daniel, đã bỏ lỡ cái đó. 26 nét sau ...
gnibbler

Vụ nổ từ quá khứ xin lỗi :) Nếu chúng tôi tham gia các giải pháp của mình, chúng tôi sẽ nhận được 144 ký tự hợp tác (xem bên dưới!) :)
Roberto

2

SQLite, 374 ký tự

(Ngắt dòng được thêm vào đây để dễ đọc; không bao gồm trong số đếm.)

Yêu cầu "Cho phép người dùng cung cấp ngày bắt đầu dưới dạng đối số dòng lệnh hoặc thông qua STDIN" bị bỏ qua do các giới hạn kỹ thuật.

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 câu lệnh đầu tiên tạo một bảng (R) với một cột duy nhất chứa tất cả các số nguyên từ 0 đến 4095.

Tuyên bố thứ 5 xây dựng một bảng (F) của tất cả các ngày thứ Sáu ngày 13 trong khoảng thời gian 2000-10-13 đến 2340-12-13.

Tuyên bố thứ 6 chỉ đơn giản trả về thứ Sáu đầu tiên ngày 13 sau ngày hiện tại (UTC).


Lịch Gregorian có chu kỳ 400 năm chứ không phải 340 năm. Hay tôi đang thiếu một cái gì đó ở đây?
Joey

Nó không xử lý nhiều năm ngoài phạm vi 2000-2340. Đó chỉ là một sự lựa chọn tùy tiện.
dan04

2

PHP - 103

(lực lượng vũ phu)

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

Ung dung:

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

Kiểm tra:

$ 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
Bạn có thể lưu tối đa 1 ký tự bằng cách thay đổi !=thành -. Ngoài ra, bạn có thể lưu tối đa 2 ký tự bằng cách di chuyển lên $d->modify('next fri')trong phần tăng của vòng lặp.
HoLyVieR

Tôi cần sửa đổi vào thứ sáu tới trước vòng lặp, trong trường hợp ngày đã cho là thứ sáu 13 :-) (hoặc thậm chí chỉ 13)
Arnaud Le Blanc

Sử dụng -rvà Bạn không thể cần thẻ. Sử dụng cấu hình mặc định với -nvà Bạn không cần @. \nlà không cần thiếtechothay vì dielưu một byte khác. strtotimethay vì Datelớp có thể tiết kiệm một hoặc hai hơn.
Tít

2

C #, 206 194 ký tự

Cập nhật

Đây là một vấn đề hơi khác nhau, vì vậy tôi đã để lại nỗ lực khác của mình ở đây đầy đủ.

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

Ở đây, tôi đang tìm thứ Sáu "hiện tại" vào thứ Sáu và sau đó tăng thêm 7 cho đến khi tôi tìm thấy một thứ đó là 13. Tôi cũng đã sử dụng định dạng đầu ra và vòng lặp của Joey để cạo một vài ký tự.

Ung dung:

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

Nguyên:

Điều này tương tự như của Andrew ở trên, nhưng có đủ sự khác biệt tôi quyết định đăng một câu trả lời riêng thay vì bình luận và đề xuất chỉnh sửa.

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

Ung dung:

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 ký tự

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

Ví dụ chạy:

> 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 byte

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

Hãy thử trực tuyến!

Cảm ơn @ ASCII chỉ dành cho -5


Không hợp lệ, cần xử lý trường hợp khi người dùng không cung cấp đối số, cũng chỉday-of-week==5
ASCII chỉ

@ Chỉ sửa lỗi ASCII
Ven

Ồ vâng, nó cũng phải là một chương trình hoàn chỉnh, không phải là một chức năng
ASCII chỉ có

Có thể muốn liên kết đến điều này (thậm chí tốt hơn, đi đến đó, esc -> s -> g cho một bài đăng được định dạng độc đáo)
ASCII chỉ có


1

Javascript

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: yeah, tôi biết, tôi đã phá vỡ quy tắc đầu tiên (không thể chỉ là một chức năng)

Các thử nghiệm trên shell javascript

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 Chống lại ngôn ngữ mục đích chung ưu tú ủng hộ quy tắc STDIN.
mootinator

1

T-SQL 359 285 253 Ký tự

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)

Tôi chỉ muốn đặt cái đập vào giải pháp SQLite bằng hàm ngày dài không thông minh bằng thủ tục T-SQL.

Cập nhật: Nỗi sợ hãi ban đầu của tôi rằng việc tăng một ngày sẽ chiếm nhiều dung lượng hơn mức tăng một tháng là rất không chính xác.

Kết quả kiểm tra (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

Một Javascript khác, 153

Tôi đăng một câu trả lời javascript khác vì tôi không thể bình luận đầu tiên ...

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

Thực thi với 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 ký tự

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

Đầu vào có định dạng 2013 1 1,

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

hoặc chỉ cần nhấn enter để sử dụng ngày hôm nay (sẽ là 2013/12/11 cho đầu ra này)

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

2013-12-13

(thực sự có một sự pha trộn giữa giải pháp của tôi và của @gnibbler, đếm được 144 ký tự)

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)

Dòng rất hay while t.day*t.weekday()-65:là từ giải pháp của @ gnibbler's.


1

Japt, 35 byte

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

-8 byte nhờ @ASCIIOnly!

Thử nó!


Định dạng đầu ra không hợp lệ ...
ASCII chỉ


Vâng, tôi đang làm việc trên nó :) Rõ ràng toISOStringchuyển đổi sang UTC thay đổi ngày
dana

Làm thế nào để nó thay đổi ngày? Có Klưu trữ thời gian như giờ địa phương?
ASCII chỉ

1
Đã sửa, 39 (tốt, kinda Nó ra kết quả chính xác cho ngày hôm nay tại UTC (AFAICT) và đó là đủ tốt cho tôi Không muốn gây rối với các múi giờ nhiều hơn tôi đã là..)
ASCII chỉ

1

Swift 4 , 310 byte

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

Hãy thử trực tuyến!

-4 cảm ơn TagTaco.

Than ôi ...

  • cần Foundation cho Ngày / Lịch.
  • Swift không cho phép Ints được sử dụng như Bool.
  • Cú pháp tốc ký enum là hữu ích, mặc dù không nhiều.
  • Không gian được yêu cầu xung quanh ??.
  • != cũng cần khoảng cách, vì nó được hiểu là một sự tháo gỡ.

0

VB.net (96c *)

Nhập cảnh

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
  • Tôi nghĩ rằng số CodeGolf cho vb.net không nên bao gồm chữ ký hàm , hàm kết thúc đóng và trả về . Vì vậy, nó chỉ làm cho nó về việc thực hiện nội bộ.

Vì vậy, điểm số của tôi bị phá vỡ như vậy

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

Nổi loạn, 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]

Ung dung:

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]

Ví dụ sử dụng:

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

0

Java 8, 200 197 byte

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

Giải trình:

Hãy thử ở đây (xóa đối số để sử dụng ngày hiện tại).

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

LƯU Ý: Định dạng mặc định của Java khi đã in yyyy-MM-dd.


0

05AB1E , 141 byte

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 không có bất kỳ nội dung nào cho các đối tượng hoặc tính toán Ngày. Nội dung duy nhất liên quan đến ngày mà nó có là năm / tháng / ngày / giờ / phút / giây / giây / giây.

Vì vậy, gần như tất cả các mã bạn thấy là các tính toán thủ công để chuyển sang ngày hôm sau và tính ngày trong tuần.

Chủ yếu xuất phát từ câu trả lời 05AB1E của tôi trong Đếm ngược ngày làm việc thử thách (đó là lý do tại sao tôi đã chỉnh sửa câu hỏi đó khoảng một giờ trước khi tôi gặp phải một lỗi ..)

Đầu vào là một chuỗi ở định dạng dd-MM-yyyy(nhưng đầu ra ở định dạng yyyy-MM-dd, vì đó là một trong những quy tắc của thách thức).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.