Nächsten Freitag den 13


15

Was ist das kürzeste Programm, das vorhersagen kann, wann Freitag auf den 13. Tag des Monats fällt?

  • Muss ein vollständig funktionierendes Programm sein (nicht nur eine Funktion / ein Unterprogramm)
  • Das Datum muss im folgenden Format ausgedruckt werden: YYYY-MM-DD
  • Ermöglichen Sie dem Benutzer, ein Startdatum als Befehlszeilenargument oder durch anzugeben STDIN
  • Wenn der Benutzer kein Startdatum angibt, verwenden Sie Heute als Startdatum.
  • Wenn das Startdatum ein Freitag, der 13. ist, sollte das Programm den nächsten Freitag, den 13., finden.

Wenn ich das Programm heute (16. Februar 2011) ausführen würde, würde ich die folgende Ausgabe erhalten.

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

Wäre eine 2013-9-13Ausgabe für das erste Beispiel in Ordnung?
JB

Meinen Sie, wir können uns entscheiden, ob wir das Datum als Argument oder von STDIN nehmen wollen oder ob wir beide unterstützen müssen?
16.

@ sepp2k Sie können entscheiden, dass Sie nicht beide unterstützen müssen, der Benutzer muss nur eine Möglichkeit haben, ein Datum einzugeben.
Daniel Standage

@JB Ja, da es mehrere andere Lösungen gibt, die alle Anforderungen erfüllen, würde ich Ihre Antwort nicht als Lösung akzeptieren, selbst wenn es die kürzeste wäre. Das bedeutet nicht, dass Ihre Antwort nicht informativ war ... aber es wäre frustrierend, mit einem inkonsistenten Datumsformat umzugehen.
Daniel Standage

Nun, dieses ist mit golfscript nicht wirklich möglich, da es das heutige Datum nicht kennt *. Es gibt auch keine Datumsbibliothek, daher wäre die Antwort wahrscheinlich ziemlich groß. (* Sie können Ruby Eval verwenden, um es zu bekommen, aber dann könnten Sie auch Ruby Date Lib verwenden)
Gnibbler

Antworten:


6

Windows PowerShell, 74

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

Ziemliech direkt. Ein vielleicht verwirrendes Bit ist die Verwendung von "Get-Date $args" | Invoke-Expression, um entweder das aktuelle Datum (falls $argsleer) oder das in angegebene Datum abzurufen, $argsohne einen Fehler auszulösen.

72-Byte-Variante:

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

Dauert aber ewig ... das erhöht die Datumszeit nicht um einen ganzen Tag, sondern nur um 900 Nanosekunden. Aber zwei Bytes kürzer.

67-Byte-Variante:

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

Dies ist ein bisschen locale-sensitiv; Wenn es auf Ihrem Computer nicht funktioniert, versuchen Sie, das Datumsformat zuvor auf ISO-8601 einzustellen. :-)

Oh, und es kann genau wie die 72-Byte-Version in 65 Bytes umgewandelt werden.

Geschichte:

  • 2011-02-17 00:33 (92) Erster Versuch.
  • 2011-02-17 00:35 (85) Das Erhalten eines Anfangstermins wurde verbessert.
  • 2011-02-17 00:37 (79) Vergleichen Sie das Produkt statt Tag und Wochentag einzeln. Zugegebenermaßen von Ventero gestohlen.
  • 2011-02-17 00:40 (76) Zog die erste Linie in die for. Vergleich nur als Subtraktion, stattdessen werden -eqzwei weitere Bytes eingespart.
  • 2011-02-17 00:53 (75) Die dateZeichenfolge im Unix- Format ist etwas kürzer.
  • 2011-02-17 11:42 (74) Zurückgesetzt auf das Standard-Datumsmuster, aber yyy-MM-dausreichend (da das Jahr immer länger als drei Zeichen ist und der Tag immer 13. Vielen Dank an Ty Auvil dafür.

Warum übergeben Sie "date $ args" an iex? Versuchen Sie stattdessen einfach (date $ args).
Iszi

@Iszi: Dies wird verwendet, um "Wenn der Benutzer kein Startdatum angibt, verwenden Sie Heute als Startdatum." Regel. Wenn Sie ein leeres Array übergeben oder $nullan Get-Date, wird eine Fehlermeldung angezeigt, nicht das aktuelle Datum. "date $args"|iexEs wird jedoch entweder auf das in angegebene Datum $args oder auf das aktuelle Datum aufgelöst. Genau das möchten wir hier.
Joey

4

Bash, 75

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

Dies ist ein bisschen Gebietsschemasensitiv; Wenn es auf Ihrem Computer nicht funktioniert, versuchen exportSie es LC_ALL=Cvorher.

$ 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 Zeichen

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

Nimmt das Datum von stdin. Um kein Datum anzugeben, drücken Sie Strg-D.

Vielen Dank für die Hilfe von 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

Beispiel 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==65ist 4 Zeichen kürzer. Und Sie sollten in der Lage sein , ersetzen Date.today.to_smit"thu"
Ventero

Tatsächlich unter Verwendung einer Schleife anstelle eines Iterators , den Code zu 76 Zeichen verkürzt: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. Und Sie könnten das Datum von stdin mit lesen, getsanstatt ein $*[0]anderes Zeichen zu speichern (geben Sie EOF ein, um das Standardverhalten zu erhalten).
Ventero

@Ventero: Sehr schön, danke.
Sonntag,

3

C # 185

Basierend auf der C # -Lösung von Andrew Koester , jedoch stark modifiziert. Ich bin schließlich zu einer Lösung gekommen, die meiner PowerShell-Lösung ähnelt:

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 (und andere), 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 oder höher, mit -E 'code here'oder ausführen -M5.010 file. Bedarf date(von coreutils für Linux) und cal(von util-linux)

Probelauf:

$ 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

Ich bin mir nicht sicher, wann die führende Null für Monate vor Oktober gehalten wird. Es ist offensichtlich verloren, wenn das Jahr vorbei rollt; es scheint beibehalten zu werden, wenn die Antwort erst im nächsten Monat ist. Nennen wir das undefiniertes Verhalten - hey, das ist Golfen!


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

VERWENDETES KONZEPT:

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

BEISPIEL E / A

:~/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 Zeichen. C # benötigt den Modus "Nur innerhalb einer Funktion ausführen"!

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

Nicht golfen:

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

Ausgang testen

\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 Zeichen

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

Mehr leserlich:

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

Der lustige Teil ist, dass während Ds std.datetime diese Art von Code sehr einfach zu schreiben macht, es auch unglaublich ausführlich ist - hauptsächlich aufgrund der präzisen (und daher langen) Funktionsnamen. Die Benutzerfreundlichkeit und Wartbarkeit des Codes ist also sehr hoch, aber die Code-Golffreundlichkeit ist eher gering.


2

Python - 166 Zeichen

Liest von stdin, so müssen Sie eine leere Zeile eingeben, wenn Sie das heutige Datum möchten

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

Sofern ich nichts vermisse, wird hiermit nicht die 4. Anforderung angesprochen (wenn kein Datum angegeben ist, beginnen Sie mit dem heutigen Tag).
Daniel Standage

@ Daniel, habe das verpasst. 26 Schläge später ...
Knabberzeug

Blast from the past sorry :) Wenn wir uns unseren Lösungen anschließen, erhalten wir eine gemeinsame 144 Zeichen (siehe unten!) :)
Roberto

2

SQLite, 374 Zeichen

(Zeilenumbrüche hier zur besseren Lesbarkeit hinzugefügt; nicht in der Zählung enthalten.)

Die Anforderung "Benutzer darf ein Startdatum entweder als Befehlszeilenargument oder über STDIN bereitstellen" wurde aufgrund technischer Einschränkungen weggelassen.

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

Die ersten 4 Anweisungen erstellen eine Tabelle (R) mit einer einzelnen Spalte, die alle Ganzzahlen von 0 bis 4095 enthält.

Die 5. Anweisung erstellt eine Tabelle (F) aller Freitag, den 13. zwischen dem 13.10.2000 und dem 13.12.2340.

Die 6. Anweisung gibt einfach den ersten Freitag, den 13. nach dem aktuellen Datum (UTC) zurück.


Der Gregorianische Kalender hat einen 400-Jahres-Zyklus, nicht 340 Jahre. Oder fehle ich hier etwas?
Joey

Es verarbeitet keine Jahre außerhalb des Bereichs 2000-2340. Das war nur eine willkürliche Wahl.
Dan04

2

PHP - 103

(rohe Gewalt)

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

Prüfung:

$ 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
Sie können durch eine Änderung bis 1 Zeichen speichern !=zu -. Sie können auch bis zu 2 Zeichen speichern, indem Sie $d->modify('next fri')im Inkrement-Bereich der Schleife nach oben gehen.
HoLyVieR

Ich muss auf den nächsten Freitag vor der Schleife umstellen, falls das angegebene Datum bereits ein Freitag 13 ist :-) (oder sogar nur 13)
Arnaud Le Blanc

Benutze -rund Du brauchst das Tag nicht. Verwenden Sie die Standardkonfiguration mit -nund Sie brauchen nicht @. \nist unnötig. echostatt diespeichert ein anderes Byte. strtotimeAnstelle der DateKlasse können ein oder zwei weitere gespeichert werden.
Titus

2

C #, 206 194 Zeichen

Aktualisieren

Dies ist eine etwas andere Sichtweise des Problems, weshalb ich meinen anderen Versuch hier vollständig überlassen habe.

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

Hier finde ich den "aktuellen" Freitag der Woche und erhöhe ihn dann um 7, bis ich einen finde, der 13 ist. Ich habe auch Joeys for-Schleife und Ausgabeformatierung verwendet, um einige Zeichen zu rasieren.

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

Original:

Dies ist ähnlich wie oben bei Andrew, aber es gab genügend Unterschiede. Ich entschied mich, eine separate Antwort zu posten, anstatt zu kommentieren und Änderungen vorzuschlagen.

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 Zeichen

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

Beispiel läuft:

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

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

Probieren Sie es online!

Danke an @ ASCII-only für -5


Ungültig, muss den Fall behandeln, wenn der Benutzer kein Argument day-of-week==5
ASCII

@ ASCII-only festgelegt
Ven

Oh ja, es muss auch ein vollständiges Programm sein, keine Funktion
ASCII

Vielleicht möchten Sie auf Link dieses (noch besser, dorthin gehen, esc -> s -> g für eine schön formatierte post)
ASCII-only


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: ja, ich weiß, ich habe die erste Regel gebrochen (könnte nicht nur eine Funktion sein)

Tests auf Javascript-Shell

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 Kämpfe gegen die elitäre Allzwecksprache, die die STDIN-Regel bevorzugt.
mootinator

1

T-SQL 359 285 253 Zeichen

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)

Ich wollte nur die SQLite-Lösung mit meiner nicht cleveren ausführlichen Datumsfunktion unter Verwendung des T-SQL-Verfahrens auf den Prüfstand stellen.

Update: Meine ursprüngliche Befürchtung, dass ein Tagesschritt mehr Platz in Anspruch nimmt als ein Monatesschritt, war sehr falsch.

Testergebnisse (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

Ein weiteres Javascript, 153

Ich poste eine andere Javascript-Antwort, weil ich die erste nicht kommentieren kann ...

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

Ausführen mit 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 Zeichen

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

Die Eingabe ist in dem Format 2013 1 1,

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

oder drücken Sie einfach die Eingabetaste, um das heutige Datum zu verwenden (wäre 2013/12/11 für diese Ausgabe)

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

2013-12-13

(Es gibt tatsächlich eine Mischung aus meiner Lösung und der von @gnibbler, die 144 Zeichen zählt.)

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)

Die sehr schöne Zeile while t.day*t.weekday()-65:stammt aus der @ gnibbler-Lösung.


1

Japt, 35 Bytes

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

-8 Bytes dank @ASCIIOnly!

Versuch es!


Ungültiges Ausgabeformat ...
Nur ASCII


Ja, ich arbeite daran :) Anscheinend toISOStringKonvertiten zu UTC , die das Datum ändert
DANA

Wie ändert sich das Datum? Ist KSpeicherzeit als lokale Zeit?
Nur ASCII

1
Behoben, 39 (na ja, irgendwie. Es gibt das richtige Ergebnis für heute um UTC (AFAICT) aus und das ist gut genug für mich. Ich möchte mich nicht mehr mit Zeitzonen herumschlagen, als ich es bereits bin.)
Nur ASCII

1

Schnelle 4 , 310 Bytes

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

Probieren Sie es online!

-4 dank TagTaco.

Ach...:

  • braucht Foundation für Datum / Kalender.
  • Swift erlaubt nicht, dass Ints als verwendet wird Bool.
  • Die Kurzform der Enum-Syntax ist hilfreich, wenn auch nicht so sehr.
  • Platz ist rund erforderlich ??.
  • != braucht auch Abstand, damit es nicht als ein Auspacken interpretiert wird.

0

VB.net (96c *)

Eintrag

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
  • Ich denke , die CodeGolf Zahl für vb.net sollte nicht die umfassen Funktionssignatur , Schließende Funktion und die Rückkehr . Es geht also nur um die interne Umsetzung.

Also ist meine Wertung so aufgeschlüsselt

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]

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]

Anwendungsbeispiel:

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

0

Java 8, 200 197 Bytes

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

Erläuterung:

Probieren Sie es hier aus (entfernen Sie das Argument, um das aktuelle Datum zu verwenden).

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

HINWEIS: Das Standardformat von Java ist beim Drucken bereits eingestellt yyyy-MM-dd.


0

05AB1E , 141 Bytes

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 verfügt über keine integrierten Funktionen für Datumsobjekte oder Berechnungen. Das einzige eingebaute Datum ist das heutige Jahr / Monat / Tag / Stunde / Minute / Sekunde / Mikrosekunde.

Aus diesem Grund handelt es sich bei fast dem gesamten Code, den Sie sehen, um manuelle Berechnungen für den nächsten Tag und für die Berechnung des Wochentags.

Meistens abgeleitet von meiner 05AB1E-Antwort in der Countdown- Herausforderung " Arbeitstag" (weshalb ich diese vor ungefähr einer Stunde bearbeitet habe, als ich auf einen Fehler bin.)

Die Eingabe ist eine Zeichenfolge im Format dd-MM-yyyy(die Ausgabe erfolgt jedoch im Format yyyy-MM-dd, da dies eine der Regeln der Herausforderung ist).

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.