Наступної п’ятниці 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? Спробуйте просто (дата $ 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

Бере дату від stdin. Щоб не вказати дату, натисніть ctrl-d.

Дуже дякую за допомогу Вентеро.

Безголівки:

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"
Вентеро

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

@ Вентеро: Дуже приємно, дякую.
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

Перл (та інші), 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

Зразок вводу / виводу

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

Без гольфу:

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


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

Якщо я щось не пропускаю, це не відповідає 4-й вимозі (якщо дата не вказана, почніть з сьогоднішнього дня).
Деніел Даніель

@Daniel, пропустив це. 26 штрихів пізніше ...
гніблер

Вибух від минулого вибачте :) Якщо ми приєднаємось до наших рішень, ми потрапимо до спільної 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.

П'яте твердження будує таблицю (F) всієї п’ятниці 13-го між 2000-10-13 та 2340-12-13.

Шостий вислів просто повертає першу п’ятницю 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"));

Безголівки:

<?
$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')розділ циклу.
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 для циклу та форматування виходу для гоління кількох символів.

Безголівки:

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

Безголівки:

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 виправлено
Вен

О так, це також має бути повноцінною програмою, а не функцією
лише 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.
мотиватор

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,


Так, я працюю над цим :) По- видимому 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))

Спробуйте в Інтернеті!

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

Безголівки:

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.