В следующую пятницу 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вывод в порядке для первого примера?
JB

Вы имеете в виду, что мы можем решить, хотим ли мы принимать дату в качестве аргумента или из STDIN или нам нужно поддерживать оба?
sepp2k

@ sepp2k Вы можете решить, вам не нужно поддерживать оба, пользователю просто нужен способ ввести дату.
Даниэль Стендж

@JB Да, поскольку есть несколько других решений, которые отвечают всем требованиям, я бы не принял ваш ответ как решение, даже если оно было самым коротким. Это не значит, что ваш ответ не был информативным ... но да, работа с несовместимым форматом даты была бы разочаровывающей.
Даниэль Стендж

Ну, это на самом деле невозможно с golfscript, потому что он не знает сегодняшнюю дату *. У него также нет библиотеки дат, поэтому, скорее всего, ответ будет довольно большим. (* вы можете использовать ruby ​​eval, чтобы получить его, но также можете использовать ruby ​​date 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

Это немного зависит от локали; Если это не помогло, попробуйте заранее установить формат даты ISO-8601. :-)

О, и это может быть сделано в 65 байтов точно так же как 72-байтовая версия.

История:

  • 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Строка формата Unix немного короче.
  • 2011-02-17 11:42 (74) Возврат к шаблону даты по умолчанию, но этого yyy-MM-dдостаточно (поскольку год всегда длиннее трех символов, а день всегда 13. Спасибо Ти Аувилу за это.

Почему вы передаете "date $ args" iex? Попробуйте просто (date $ args).
Изи

@Iszi: используется для реализации «Если пользователь не указывает дату начала, используйте сегодня как дату начала». править. Если вы передаете пустой массив или $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

Это немного зависит от локали; если он не будет работать на вашем компьютере, попробуйте exportING 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

Принимает дату от стандартного ввода. Чтобы не указывать дату, нажмите 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

Образец ввода-вывода:

$ 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

На самом деле , используя цикл вместо итератора укорачивает код 76 символов: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. И вы можете прочитать дату из stdin getsвместо того, $*[0]чтобы сохранить другой символ (введите EOF, чтобы получить поведение по умолчанию).
Вентеро

@Ventero: Очень хорошо, спасибо.
sepp2k

3

C #, 185

Основано на решении 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

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

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

C #

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

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

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

Самое интересное в том, что хотя std.datetime D делает этот код очень простым для написания, он также невероятно многословен - в первую очередь благодаря точным (и, следовательно, длинным) именам функций. Итак, юзабилити и ремонтопригодность кода очень высоки, но играбельность кода довольно низкая.


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

Если я что-то упустил, это не соответствует 4-му требованию (если дата не указана, начните с сегодняшнего дня).
Даниэль Стендж

@ Даниэль, пропустил это. 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 оператора создают таблицу (R) с одним столбцом, содержащим все целые числа от 0 до 4095.

5-е утверждение строит таблицу (F) всей пятницы 13-го числа между 2000-10-13 и 2340-12-13.

6-й оператор просто возвращает первую пятницу 13-го числа после текущей (UTC) даты.


Григорианский календарь имеет 400-летний цикл, а не 340 лет. Или я что-то здесь упускаю?
Джои

Это не обрабатывает годы вне диапазона 2000-2340. Это был просто произвольный выбор.
Ден04

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)
Арно Ле Блан

Используйте -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);
    }
}

Оригинал:

Это похоже на вышеприведенное описание Эндрю, но было достаточно различий, и я решил опубликовать отдельный ответ, а не комментировать и предложить изменения.

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

@ ASCII-only fixed
Ven

О да, это также должна быть полная программа, а не функция
только для ASCII

Возможно, вы захотите дать ссылку на это (еще лучше, перейдите туда, esc -> s -> g для хорошо отформатированного сообщения)
только для ASCII


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: да, я знаю, я нарушил первое правило (не может быть просто функцией)

Тесты на оболочке 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 Боритесь с элитарным языком общего назначения, поддерживающим правило 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)

Я просто хотел наложить решение SQLite на мою неумную многословную функцию даты с использованием процедуры 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

Я публикую еще один ответ javascript, потому что не могу прокомментировать первый ...

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

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

2013-12-13

(на самом деле есть смесь моего решения и @gnibbler's, который насчитывает 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!

Попытайся!


Неверный формат вывода ...
ASCII-only


Да, я работаю над этим :) По- видимому toISOStringновообращенного UTC который меняет дату
Dana

Как это меняет дату? Хранит ли Kвремя как местное время?
Только для ASCII

1
Фиксированный, 39 (ну, вроде. Это выводит правильный результат на сегодня в UTC (AFAICT), и это достаточно хорошо для меня. Не хочу связываться с
только ASCII

1

Swift 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 спасибо TagTaco.

Увы...:

  • нуждается в фундаменте для даты / календаря.
  • Swift не позволяет использовать Ints как 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

Реболь, 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 не имеет встроенных функций для объектов Date или вычислений. Единственная встроенная функция, касающаяся дат, это текущий год / месяц / день / часы / минуты / секунды / микросекунды.

Поэтому почти весь код, который вы видите, - это ручные вычисления для перехода к следующему дню и вычисления дня недели.

В основном происходит от моего 05AB1E ответа в тот день , работа Countdown вызов (именно поэтому я редактировал , что один час назад , когда я наткнулся на ошибку ..)

Ввод - это строка в формате 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.