W następny piątek 13


15

Jaki jest najkrótszy program, który może przewidzieć, że następny piątek przypadnie na 13 dzień miesiąca?

  • Musi być kompletnie działającym programem (nie tylko funkcją / podprogramem)
  • Należy wydrukować datę w następującym formacie: YYYY-MM-DD
  • Zezwól użytkownikowi na podanie daty początkowej jako argumentu wiersza poleceń lub poprzez STDIN
  • Jeśli użytkownik nie poda daty rozpoczęcia, użyj dzisiaj jako daty rozpoczęcia.
  • Jeśli datą rozpoczęcia jest piątek trzynasty, program powinien znaleźć następny piątek trzynasty.

Gdybym miał dzisiaj uruchomić program (16 lutego 2011 r.), Powinienem uzyskać następujące dane wyjściowe.

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

Czy 2013-9-13wynik byłby odpowiedni dla pierwszego przykładu?
JB

Czy masz na myśli, że możemy zdecydować, czy chcemy wziąć datę jako argument, czy ze STDIN, czy też musimy wspierać oba te elementy?
sepp2k

@ sepp2k Możesz zdecydować, nie musisz obsługiwać obu, użytkownik potrzebuje tylko sposobu na wprowadzenie daty.
Daniel Standage

@JB Tak, ponieważ istnieje kilka innych rozwiązań, które spełniają wszystkie wymagania, nie zaakceptowałbym twojej odpowiedzi jako rozwiązania, nawet gdyby była najkrótsza. To nie znaczy, że twoja odpowiedź nie była pouczająca ... ale tak, radzenie sobie z niespójnym formatem daty byłoby frustrujące.
Daniel Standage

Cóż, ten nie jest tak naprawdę możliwy z golfscript, ponieważ nie zna dzisiejszej daty *. Nie ma też biblioteki dat, więc i tak prawdopodobnie byłaby to dość duża odpowiedź. (* możesz użyć Ruby Eval, aby go zdobyć, ale równie dobrze możesz użyć Ruby
Date

Odpowiedzi:


6

Windows PowerShell, 74

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

Dość bezpośredni. Jednym z być może mylących bitów jest użycie "Get-Date $args" | Invoke-Expressionbieżącej daty (jeśli $argsjest pusta) lub daty podanej $argsbez zgłaszania błędu.

Wariant 72-bajtowy:

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

Ale to trwa wieki ... nie zwiększa to czasu danych o cały dzień z każdą iteracją, ale zamiast tego tylko 900 nanosekund. Ale dwa bajty krótsze.

Wariant 67-bajtowy:

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

Jest to nieco zależne od ustawień regionalnych; jeśli zawiedzie na twoim komputerze, spróbuj wcześniej ustawić format daty na ISO-8601. :-)

Aha, i można go przekształcić w 65 bajtów, tak jak w wersji 72-bajtowej.

Historia:

  • 2011-02-17 00:33 (92) Pierwsza próba.
  • 2011-02-17 00:35 (85) Poprawiono uzyskiwanie początkowej daty.
  • 2011-02-17 00:37 (79) Porównał produkt zamiast dnia i dnia tygodnia indywidualnie. Prawdopodobnie skradziony z Ventero.
  • 2011-02-17 00:40 (76) Wyciągnął pierwszą linię do for. Porównanie jako odejmowanie zamiast tego -eqoszczędza kolejne dwa bajty.
  • 2011-02-17 00:53 (75) dateCiąg formatu uniksowego jest nieco krótszy.
  • 2011-02-17 11:42 (74) Przywrócono domyślny wzorzec daty, ale yyy-MM-dwystarcza (ponieważ rok jest zawsze dłuższy niż trzy znaki, a dzień jest zawsze 13. Dziękuję za to Ty Auvilowi.

Dlaczego przekazujesz „date $ args” iex? Zamiast tego spróbuj po prostu (date $ args).
Iszi

@Iszi: Służy do implementacji „Jeśli użytkownik nie poda daty rozpoczęcia, użyj dzisiaj jako daty rozpoczęcia”. reguła. Jeśli zdasz pustą tablicę lub $nulldo Get-Datedostaniesz błąd, a nie bieżącą datę. "date $args"|iexjednak decyduje albo o dacie podanej, $args albo o dacie bieżącej, właśnie tego chcemy tutaj.
Joey,

4

bash, 75

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

Jest to nieco zależne od ustawień regionalnych; jeśli nie na komputerze, spróbuj exporting LC_ALL=Cwcześniej.

$ 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 znaków

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

Pobiera datę od standardowego. Aby nie podawać daty, naciśnij ctrl-d.

Bardzo dziękuję za pomoc Ventero.

Nie golfowany:

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

Próbka 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==65jest o 4 znaki krótszy. I powinieneś być w stanie wymienić Date.today.to_sz"thu"
Ventero

Właściwie za pomocą pętli zamiast iteratora skraca kod do 76 znaków: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. I możesz odczytać datę ze standardowego przy pomocy getszamiast $*[0]zapisywać inną postać (wpisz EOF, aby uzyskać domyślne zachowanie).
Ventero,

@Ventero: Bardzo miło, dzięki.
sepp2k

3

C #, 185

Oparty na rozwiązaniu C # Andrew Koestera , ale mocno zmodyfikowany po drodze. W końcu dotarłem do rozwiązania podobnego do mojego rozwiązania 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 (i inni), 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 lub nowszy, uruchom z -E 'code here'lub -M5.010 file. Potrzeby date(z coreutils dla Linuxa) i cal(z util-linux)

Przykładowy przebieg:

$ 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

Nie jestem pewien, kiedy utrzymane zostanie wiodące zero na miesiące przed październikiem. Jest oczywiście stracone, gdy rok mija; wydaje się, że zostanie zachowane, gdy odpowiedź będzie dopiero w przyszłym miesiącu. Nazwijmy to niezdefiniowane zachowanie - hej, to gra w golfa!


2

GRZMOTNĄĆ

#!/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

WYKORZYSTANA KONCEPCJA:

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

PRZYKŁADOWE 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

DO#

240 znaków. C # potrzebuje trybu „uruchom wewnątrz funkcji tylko”!

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

Bez golfa:

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

Wyjście testowe

\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 znaków

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

Bardziej czytelnie:

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

Zabawne jest to, że chociaż std.datetime D sprawia, że ​​ten rodzaj kodu jest bardzo łatwy do napisania, jest on również niezwykle szczegółowy - głównie ze względu na dokładne (a zatem długie) nazwy funkcji. Tak więc użyteczność i łatwość konserwacji kodu jest bardzo wysoka, ale jego zdolność do gry w kod jest raczej niska.


2

Python - 166 znaków

Odczytuje ze standardowego wejścia, więc jeśli chcesz dzisiejszą datę, musisz podać pusty wiersz

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

Chyba że coś mi brakuje, nie spełnia to czwartego wymogu (jeśli nie podano daty, zacznij od dziś).
Daniel Standage

@Daniel, tęskniłem za tym. 26 uderzeń później ...
gnibbler

Przepraszam z przeszłości przepraszamy :) Jeśli dołączymy do naszych rozwiązań, otrzymamy 144 wspólne znaki (patrz poniżej!) :)
Roberto

2

SQLite, 374 znaków

(Dodano podział wierszy w celu zapewnienia czytelności; nie jest uwzględniany w liczeniu).

Wymóg „Zezwól użytkownikowi na podanie daty rozpoczęcia jako argumentu wiersza poleceń lub poprzez STDIN” został pominięty z powodu ograniczeń technicznych.

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

Pierwsze 4 instrukcje tworzą tabelę (R) z pojedynczą kolumną zawierającą wszystkie liczby całkowite od 0 do 4095.

Piąte stwierdzenie tworzy tabelę (F) z wszystkich piątków trzynastych między 2000-10-13 a 2340-12-13.

Szóste oświadczenie po prostu zwraca pierwszy piątek trzynastego po bieżącej dacie (UTC).


Kalendarz gregoriański ma cykl 400 lat, a nie 340 lat. A może coś tu brakuje?
Joey,

Nie obsługuje lat poza zakresem 2000-2340. To był tylko arbitralny wybór.
dan04

2

PHP - 103

(brutalna siła)

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

Nie golfowany:

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

Test:

$ 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
Możesz zapisać 1 postać, zmieniając !=na -. Możesz także zapisać 2 znaki, przesuwając w górę $d->modify('next fri')w sekcji przyrostowej pętli.
HoLyVieR

Muszę zmodyfikować do następnego piątku przed pętlą, na wypadek gdyby podana data była już w piątek 13 :-) (a nawet tylko 13)
Arnaud Le Blanc

Użyj -ri nie potrzebujesz tagu. Użyj domyślnej konfiguracji z -ni nie potrzebujesz @. \njest niepotrzebne. echozamiast diezapisuje kolejny bajt. strtotimezamiast Dateklasy można zapisać jeszcze jeden lub dwa.
Tytus

2

C #, 206 194 znaków

Aktualizacja

Jest to nieco inne podejście do problemu, więc swoją drugą próbę zostawiłem tutaj w całości.

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

Tutaj znajduję „bieżący” piątek tygodnia, a następnie zwiększam o 7, aż znajduję taki, który ma 13 lat. Użyłem także Joeya do formatowania pętli i wyjścia, aby zgolić kilka znaków.

Nie golfowany:

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

Oryginalny:

Jest to podobne do powyższego Andrew, ale było wystarczająco dużo różnic, postanowiłem opublikować osobną odpowiedź zamiast komentować i sugerować zmiany.

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

Nie golfowany:

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 znaków

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

Przykładowe przebiegi:

> 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 bajtów

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

Wypróbuj online!

Dzięki @ ASCII-tylko dla -5


Nieprawidłowy, musi obsłużyć przypadek, gdy użytkownik nie poda argumentu, równieżday-of-week==5
tylko ASCII

@ Naprawiono tylko ASCII
Ven

O tak, to także musi być kompletny program, a nie funkcja
tylko ASCII

Może chcesz link do tego (nawet lepiej, idź tam, esc -> s -> g dla ładnie sformatowanego postu)
tylko 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: tak, wiem, złamałem pierwszą zasadę (nie może być tylko funkcją)

Testy powłoki 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 Walcz z elitarnym językiem ogólnego przeznaczenia faworyzującym zasadę STDIN.
mootinator

1

T-SQL 359 285 253 znaków

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)

Chciałem po prostu rzucić okiem na rozwiązanie SQLite za pomocą mojej nie sprytnej, pełnej funkcji daty za pomocą procedury T-SQL.

Aktualizacja: Mój pierwotny lęk, że zrobienie przyrostu dziennego zajmie więcej miejsca niż przyrost miesięczny, było bardzo błędne.

Wyniki testu (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

Kolejny Javascript, 153

Publikuję kolejną odpowiedź w języku JavaScript, ponieważ nie mogę skomentować pierwszego ...

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

Wykonaj za pomocą 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 znaków

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

Wejściowy jest w formacie 2013 1 1,

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

lub po prostu naciśnij Enter, aby użyć dzisiejszej daty (dla tego wyniku to 2013/12/11)

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

2013-12-13

(w rzeczywistości istnieje połączenie mojego rozwiązania z @gnibbler, które liczy 144 znaki)

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)

Bardzo ładna linia while t.day*t.weekday()-65:pochodzi z rozwiązania @ gnibbler.


1

Japt, 35 bajtów

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

-8 bajtów dzięki @ASCIIOnly!

Spróbuj!


Niepoprawny format wyjściowy ...
Tylko ASCII


Tak, pracuję nad tym :) Najwyraźniej toISOStringkonwertuje na UTC, który zmienia datę
dana

Jak to zmienia datę? Czy Kczas jest przechowywany jako czas lokalny?
Tylko ASCII

1
Naprawiono, 39 (cóż, trochę. Wykazuje prawidłowy wynik na dziś na UTC (AFAICT) i to dla mnie wystarcza. Nie chcę zadzierać ze strefami czasowymi więcej niż ja jestem)
tylko ASCII

1

Swift 4 , 310 bajtów

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

Wypróbuj online!

-4 dzięki TagTaco.

Niestety...:

  • potrzebuje Foundation for Date / Calendar.
  • Swift nie pozwala na użycie Ints jako Bool.
  • Skrótowa składnia wyliczeniowa jest pomocna, choć nie tak bardzo.
  • Wokół wymagana jest przestrzeń ??.
  • != również potrzebuje odstępów, aby nie interpretować go jako rozpakowywanie.

0

VB.net (96c *)

Wejście

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
  • Myślę, że liczba CodeGolf dla vb.net nie powinna zawierać podpisu funkcji , funkcji zakończenia końcowego i powrotu . To po prostu dotyczy wewnętrznej implementacji.

Więc moja ocena jest podzielona jako taka

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]

Nie golfowany:

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]

Przykładowe użycie:

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

0

Java 8, 200 197 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj (usuń argument, aby użyć bieżącej daty).

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

UWAGA: Domyślny format Java, gdy drukowanie już jest yyyy-MM-dd.


0

05AB1E , 141 bajtów

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 nie ma żadnych wbudowanych obiektów Date ani obliczeń. Jedynym wbudowanym pod względem dat jest dzisiejszy rok / miesiąc / dzień / godziny / minuty / sekundy / mikrosekundy.

Z tego powodu prawie cały kod, który widzisz, to ręczne obliczenia umożliwiające przejście do następnego dnia i obliczanie dnia tygodnia.

Pochodzi głównie z mojej odpowiedzi 05AB1E w wyzwaniu Odliczanie dnia pracy (dlatego ja edytowany że jeden około godziny temu, gdy natknąłem się na błąd ..)

Dane wejściowe są ciągiem w formacie dd-MM-yyyy(ale dane wyjściowe są w formacie yyyy-MM-dd, ponieważ jest to jedna z reguł wyzwania).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.