다음주 금요일 13 일


15

다음 번 금요일이 다음 달 13 일에 떨어질 것이라고 예측할 수있는 가장 짧은 프로그램은 무엇입니까?

  • 기능 / 서브 루틴 만이 아니라 완전한 기능을하는 프로그램이어야 함
  • 다음 형식으로 날짜를 인쇄해야합니다. YYYY-MM-DD
  • 사용자가 시작 날짜를 명령 줄 인수 또는 STDIN
  • 사용자가 시작 날짜를 제공하지 않으면 오늘을 시작 날짜로 사용하십시오.
  • 시작 날짜가 13 일 금요일 인 경우 프로그램은 다음 주 금요일 13 일을 찾아야합니다 .

오늘 프로그램을 실행한다면 (2011 년 2 월 16 일) 다음과 같은 결과가 나옵니다.

$ ./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첫 번째 예 에서 출력이 정상입니까?
JB

우리가 날짜를 논쟁으로 삼을 것인지 STDIN에서받을 것인지 아니면 두 가지를 모두 지원해야하는지 결정할 수 있습니까?
sepp2k

@ sepp2k 둘 다 지원하지 않아도되며, 사용자는 날짜를 입력하는 방법 만 있으면됩니다.
Daniel Standage

@JB 예, 모든 요구 사항을 해결하는 다른 여러 솔루션이 있기 때문에 솔루션이 가장 짧은 경우에도 귀하의 답변을 솔루션으로 받아들이지 않습니다. 그렇다고 귀하의 답변이 유익하지 않다는 의미는 아니지만 일치하지 않는 날짜 형식을 다루는 것이 실망 스러울 수 있습니다.
Daniel Standage

이것이 오늘날의 날짜 *를 모르기 때문에 골프 스크립트로는 실제로 가능하지 않습니다. 또한 날짜 라이브러리가 없으므로 어쨌든 큰 대답 일 것입니다. (* 루비 eval을 사용하여 얻을 수 있지만 루비 날짜 lib도 사용할 수 있습니다)
gnibbler

답변:


6

윈도우 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 나노 초 만 증가시킵니다. 그러나 2 바이트는 더 짧습니다.

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) 요일과 요일 대신 개별적으로 제품을 비교했습니다. Ventero에서 도난 당했을 것입니다.
  • 2011-02-17 00:40 (76) 첫 번째 줄을 for. 뺄셈과 비교 -eq하면 다른 2 바이트가 절약됩니다.
  • 2011-02-17 00:53 (75) Unix date형식 문자열이 약간 짧습니다.
  • 2011-02-17 11:42 (74) 기본 날짜 패턴으로 yyy-MM-d되돌아 갔지만 충분합니다 (연도가 항상 3 자보다 길고 날이 항상 13이기 때문에 Ty Auvil에게 감사합니다).

왜 "date $ args"를 전달 iex합니까? 대신 (날짜 $ args) 사용해보십시오.
Iszi

@Iszi : "사용자가 시작 날짜를 제공하지 않으면 오늘을 시작 날짜로 사용"을 구현하는 데 사용됩니다. 규칙. 당신은 빈 배열을 전달하거나 경우 $nullGet-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

이것은 로케일에 따라 조금씩 다릅니다. 그것은 당신의 컴퓨터에 실패한다면, 시도 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

stdin에서 날짜를 가져옵니다. 날짜를 지정하지 않으려면 ctrl-d를 누르십시오.

Ventero의 도움에 대단히 감사합니다.

언 골프 드 :

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==654 자 더 짧습니다. 그리고 당신은 대체 할 수 있어야 Date.today.to_s"thu"
Ventero 사용자

실제로 반복자 대신 루프를 사용하면 코드가 76 자로 단축 require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d됩니다. 그리고 다른 문자를 저장 하는 gets대신 stdin에서 날짜를 읽을 수 있습니다 $*[0](기본 동작을 얻으려면 EOF를 입력하십시오).
Ventero

@Ventero : 감사합니다.
sepp2k

3

C #, 185

Andrew Koester의 C # 솔루션을 기반으로 하지만 그 과정에서 크게 수정되었습니다. 결국 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

펄 (및 기타), 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(Linux 용 coreutils) 및 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

10 월 전에 몇 달 동안 선행 0이 유지되는지 확실하지 않습니다. 연도가 끝날 때 분명히 사라집니다. 답이 다음 달에있을 때 유지되는 것 같습니다. 정의되지 않은 행동이라고하자. 이건 골프 야!


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의 std.datetime이 이러한 종류의 코드를 작성하는 것을 매우 쉽게 만드는 반면, 주로 정확한 (따라서 긴) 함수 이름으로 인해 매우 장황하다는 것입니다. 따라서 코드의 유용성과 유지 관리는 매우 높지만 코드 골프 가능성은 다소 낮습니다.


2

파이썬-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")

내가 빠진 것이 없다면 이것은 네 번째 요구 사항을 충족시키지 못합니다 (날짜가 제공되지 않으면 오늘부터 시작하십시오).
Daniel Standage

@Daniel, 그거보고 싶었어. 26 스트로크 후 ...
gnibbler

우리는 우리의 솔루션에 가입하면 과거 죄송합니다 :)에서 폭발, 우리는 (! 아래 참조) : 공동 (144 개) 문자에 도착
로베르토

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 개의 명령문은 0에서 4095까지의 모든 정수를 포함하는 단일 열로 테이블 (R)을 작성합니다.

다섯 번째 진술은 2000-10-13과 2340-12-13 사이의 13 일 금요일 모든 표 (F)를 작성합니다.

6 번째 진술은 단순히 현재 (UTC) 날짜 이후 13 번째 금요일을 반환합니다.


그레고리오 력은 340 년이 아닌 400 년주기입니다. 아니면 여기에 뭔가 빠졌습니까?
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"));

언 골프 드 :

<?
$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하나 또는 두 개 더 저장할 수 있습니다.
Titus

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

여기서는 "현재"주 금요일을 찾은 다음 13 인 것을 찾을 때까지 7 씩 증가시킵니다. 또한 Joey의 for 루프 및 출력 형식을 사용하여 몇 개의 문자를 면도했습니다.

언 골프 드 :

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

언 골프 드 :

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

펄 6 , 69 바이트

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

온라인으로 사용해보십시오!

-5를위한 @ASCII 전용 감사


유효하지 않습니다. 사용자가 인수를 제공하지 않은 경우도 처리해야합니다.day-of-week==5
ASCII 전용

Ven

아, 그것은 또한 기능이 아닌 완전한 프로그램이어야합니다
ASCII 전용

링크 할 수 있습니다 (더 나은, 거기 가서, ESC -> S -> g에 대해 잘 포맷 후)
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());
}

추신 : 네, 알아요, 나는 첫 번째 규칙을 어겼습니다 (단지 함수 일 수는 없었습니다)

자바 스크립트 셸에서 테스트

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 2253253 문자

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-SQL 프로 시저를 사용하여 영리한 상세 날짜 기능을 사용하여 SQLite 솔루션에 스맥을 내려 놓고 싶었습니다.

업데이트 : 내 원래의 두려움을 달 증가가보다 하루 증분을하는 것은 더 많은 공간을 수행하게되는 매우 정확합니다.

테스트 결과 (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

다른 자바 스크립트, 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

파이썬 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/11)

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

apt, 35 바이트

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

@ASCIIOnly 덕분에 -8 바이트!

시도 해봐!


잘못된 출력 형식 ...
ASCII 전용


그래, 나는 그것을하고 있어요 :) 분명히 toISOString날짜를 변경하는 UTC로 변환합니다
dana

날짜는 어떻게 바뀌나요? K시간을 현지 시간으로 저장 합니까 ?
ASCII 전용

1
고정, 39 (잘, 좀. 그것은 오늘 UTC (AFAICT)에서 정확한 결과를 출력하고 나에게 충분합니다. 이미 존재하는 것보다 더 많은 시간대를 망치고 싶지는 않습니다)
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))

온라인으로 사용해보십시오!

TagTaco 덕분에 -4.

아아...:

  • 날짜 / 달력을위한 기초가 필요합니다.
  • Swift는 Ints를로 사용할 수 없습니다 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의 CodeGolf 수에는 함수 서명 , 종료 함수return이 포함되어서는 안된다고 생각합니다 . 내부 구현에 대한 것입니다.

그래서 내 점수는 이렇게 나눠집니다

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]

언 골프 드 :

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에는 Date 객체 또는 계산을위한 기본 제공 기능이 없습니다. 날짜에 관한 유일한 기본 제공은 오늘의 연 / 월 / 일 /시 / 분 / 초 / 마이크로 초입니다.

이 때문에 거의 모든 코드는 다음 날 수동으로 계산하고 요일을 계산합니다.

주로 Work Day Countdown의 05AB1E 답변에서 파생되었습니다. Challenge (그래서 버그를 발견했을 때 약 한 시간 전에 편집했습니다 ..)

입력은 형식의 문자열 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.