Gelecek Cuma 13.


15

Bir sonraki Cuma günü ayın 13'ünde düşeceğini tahmin edebilecek en kısa program nedir?

  • Tam bir işlev programı olmalıdır (yalnızca bir işlev / alt yordam değil)
  • Tarihi şu biçimde yazdırmalısınız: YYYY-MM-DD
  • Kullanıcının bir komut satırı argümanı olarak veya üzerinden bir başlangıç ​​tarihi sağlamasına izin ver STDIN
  • Kullanıcı başlangıç ​​tarihi belirtmezse, başlangıç ​​tarihi olarak bugün kullanın.
  • Başlangıç ​​tarihi 13. cuma ise, programın bir sonraki cuma günü 13. bulması gerekir .

Programı bugün çalıştıracaksam (16 Şubat 2011) aşağıdaki çıktıyı almalıyım.

$ ./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İlk örnek için bir çıktı iyi olur mu?
JB

Yani tarihi bir argüman olarak mı yoksa STDIN'den mi almak istediğimizi mi yoksa ikisini de desteklememiz gerektiğine mi karar verebiliriz?
sepp2k

@ sepp2k Karar verebilirsiniz, her ikisini de desteklemenize gerek yoktur, kullanıcının sadece bir tarih girmenin bir yolu vardır.
Daniel Standage

@JB Evet, tüm gereksinimleri karşılayan başka çözümler olduğu için, en kısa olsa bile yanıtınızı çözüm olarak kabul etmem. Bu, yanıtınızın bilgilendirici olmadığı anlamına gelmez ... ancak evet, tutarsız bir tarih biçimiyle uğraşmak sinir bozucu olacaktır.
Daniel Standage

Peki bu golfscript ile gerçekten mümkün değil çünkü bugünün tarihini bilmiyor *. Ayrıca bir tarih kütüphanesi yok, bu yüzden zaten oldukça büyük bir cevap olurdu. (* ruby ​​eval'i elde etmek için kullanabilirsiniz, ancak daha sonra ruby ​​date
lib'i

Yanıtlar:


6

Windows PowerShell, 74

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

Yeterince açıksözlü. Belki de kafa karıştırıcı bir bit, "Get-Date $args" | Invoke-Expressiongeçerli tarihi ( $argsboşsa) veya $argsbir hatayı yükseltmeden belirtilen tarihi almak için kullanılmasıdır .

72 bayt varyantı:

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

Ancak, yaş alır ... bu, her yinelemede tarih saatini bir gün arttırmaz, bunun yerine sadece 900 nanosaniyedir. Ama iki bayt daha kısa.

67 bayt varyantı:

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

Bu biraz yerel ayarlara duyarlıdır; makinenizde başarısız olursa, tarih biçiminizi önceden ISO-8601 olarak ayarlamayı deneyin. :-)

Oh, ve 72 baytlık sürüm gibi 65 bayta dönüştürülebilir.

Tarih:

  • 2011-02-17 00:33 (92) İlk deneme.
  • 2011-02-17 00:35 (85) Başlangıç ​​tarihi alınıyor.
  • 2011-02-17 00:37 (79) Ürünü gün ve hafta yerine tek tek karşılaştırdı. Kuşkusuz Ventero'dan çalındı.
  • 2011-02-17 00:40 (76) İlk satırı for. Karşılaştırma sadece -eqiki bayt tasarruf yerine, çıkarma gibi .
  • 2011-02-17 00:53 (75) Unix datebiçim dizesi biraz daha kısadır.
  • 2011-02-17 11:42 (74) Varsayılan tarih düzenine döndü ancak yyy-MM-dyeterli oldu (yıl her zaman üç karakterden uzun olduğu ve gün her zaman 13 olduğu için. Bunun için Ty Auvil'e teşekkürler.

Neden "date $ args" ifadesini geçiyorsunuz iex? Bunun yerine sadece (tarih $ args) deneyin.
Iszi

@Iszi: Bu, "Kullanıcı başlangıç ​​tarihi belirtmezse, bugün başlangıç ​​tarihi olarak kullanın" ifadesini uygulamak için kullanılır. kural. Boş bir dizi geçirilecek veya varsa $nulliçin Get-Datebir hata değil, geçerli tarih alırsınız. "date $args"|iexbununla birlikte, verilen tarihte $args veya şu anki tarihte, bu da burada istediğimiz şeydir.
Joey

4

bash, 75

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

Bu biraz yerel ayarlara duyarlıdır; makinenizde arızalanırsa export, LC_ALL=Cönceden deneyin .

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

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

Tarihi stdin'den alır. Tarih belirtmek için ctrl-d tuşlarına basın.

Ventero'nun yardımı için çok teşekkürler.

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

Örnek 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 karakter daha kısadır. Ve Değiştirmeye gerekir Date.today.to_sile"thu"
Ventero

Aslında fazla 76 karakter kodu kısaltır yerine bir yineleyici bir döngü kullanarak: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. Ve başka bir karakteri kaydetmek getsyerine stdin'den tarihi okuyabilirsiniz $*[0](varsayılan davranışı almak için EOF girin).
Ventero

@Ventero: Çok hoş, teşekkürler.
sepp2k

3

C #, 185

Andrew Koester'ın C # çözümüne dayanıyor , ancak yol boyunca büyük ölçüde değiştirildi. Sonunda PowerShell çözümüme benzer bir çözüme vardım:

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 (ve diğerleri), 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 veya üzeri, -E 'code here'veya ile çalıştırın -M5.010 file. İhtiyaçlar date(Linux için coreutils'ten) ve cal(util-linux'dan)

Örnek çalışma:

$ 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

Ekim ayından önceki ayların başındaki sıfırın ne zaman tutulduğundan emin değilim. Açıkçası yıl geçtiğinde kaybolur; cevabının gelecek ay olduğu zaman korunuyor gibi görünüyor. Bu tanımsız davranış diyelim - hey, bu golf!


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

KULLANILAN KAVRAM:

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

ÖRNEK G ​​/ Ç

:~/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 karakter. C # "sadece bir fonksiyon içinde çalıştırmak" moduna ihtiyaç duyar!

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

Test çıktısı

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

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

Daha okunaklı:

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

İşin eğlenceli tarafı, D'nin std.datetime kodunun yazılmasını çok kolay hale getirmesine rağmen, öncelikle kesin (ve bu nedenle uzun) işlev adları nedeniyle inanılmaz derecede ayrıntılı. Bu nedenle, kodun kullanılabilirliği ve sürdürülebilirliği çok yüksektir, ancak kod golfçülüğü oldukça düşüktür.


2

Python - 166 karakter

Stdin'den okur, bu yüzden bugünün tarihini istiyorsanız boş bir satır beslemeniz gerekir

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

Bir şeyi kaçırmadıkça, bu 4. gereksinimi karşılamıyorsa (tarih belirtilmemişse, bugünden başlayın).
Daniel Standage

@ Daniel, bunu kaçırdı. 26 vuruş sonra ...
gnibbler

Geçmişten patlama üzgünüm :) Çözümlerimize katılırsak, işbirliğine dayalı 144 karaktere ulaşırız (aşağıya bakın!) :)
Roberto

2

SQLite, 374 karakter

(Okunabilirlik için buraya satır kesmeleri eklendi; sayıma dahil değil.)

Teknik sınırlamalar nedeniyle "Kullanıcının bir komut satırı argümanı olarak veya STDIN aracılığıyla bir başlangıç ​​tarihi sağlamasına izin ver" gereksinimi göz ardı edildi.

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

İlk 4 ifade, 0 ile 4095 arasındaki tüm tam sayıları içeren tek bir sütuna sahip bir tablo (R) oluşturur.

5. ifade, 2000-10-13 ve 2340-12-13 arasındaki 13'üncü Cuma gününün tüm tablosunu (F) oluşturur.

6. ifade, geçerli (UTC) tarihinden sonraki 13. Cuma'yı döndürür.


Gregoryen takviminin 340 yıllık değil 400 yıllık bir döngüsü vardır. Yoksa burada bir şey mi kaçırıyorum?
Joey

2000-2340 aralığının dışındaki yılları işlemez. Bu sadece keyfi bir seçimdi.
dan04

2

PHP - 103

(kaba kuvvet)

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

Ölçek:

$ 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
Sen değiştirerek 1 karakterini kaydedebilirsiniz !=için -. Ayrıca $d->modify('next fri')döngünün artış bölümünde yukarı doğru hareket ederek 2 karakter kaydedebilirsiniz .
HoLyVieR

Verilen tarih zaten bir Cuma 13 :-) (hatta sadece 13) olması durumunda, döngüden sonraki cuma günü değiştirmem gerekiyor
Arnaud Le Blanc

Kullanın -rve etikete ihtiyacınız yok. İle varsayılan yapılandırmayı kullanın ve -nihtiyacınız yoktur @. \ngereksizdir. echoyerine diebaşka bir bayt kaydeder. sınıf strtotimeyerine Datebir veya iki tane daha kaydedebilirsiniz.
Titus

2

C #, 206 194 karakter

Güncelleme

Bu, sorunu biraz farklı bir şekilde ele alıyor, bu yüzden diğer girişimimi burada tam olarak bıraktım.

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

Burada, "şu anki" haftanın Cuma gününü buluyorum ve sonra 13 olanı bulana kadar 7 arttırıyorum. Ayrıca birkaç karakteri tıraş etmek için Joey'nin döngü ve çıktı biçimlendirmesini kullandım.

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

Orijinal:

Bu Andrew'ın yukarıdaki ile benzer, ancak yorum yapmak ve düzenlemeleri önermek yerine ayrı bir cevap göndermeye karar verdiğim kadar farklılıklar vardı.

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 karakter

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

Örnek çalıştırmalar:

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

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

Çevrimiçi deneyin!

@ -5 için sadece ASCII'ye teşekkürler


Geçersiz, kullanıcı bir argüman day-of-week==5
yalnızca ASCII

@ Sadece ASCII düzeltildi
Ven

Oh evet, aynı zamanda tam bir program olmalı, bir fonksiyon değil
sadece ASCII-sadece

Bağlantısını isteyebilirsiniz bu (daha da iyisi, oraya gitmek, esc -> s -> g için güzel biçimlendirilmiş sonrası)
ASCII sadece


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: evet, biliyorum, ilk kuralı çiğnedim (sadece bir işlev olamaz)

Javascript kabuğunda testler

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 kuralını tercih eden elitist genel amaçlı dil ile savaşın.
mootinator

1

T-SQL 359 285 253 Karakterler

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)

Ben sadece T-SQL prosedürü kullanarak akıllı olmayan ayrıntılı tarih fonksiyonu ile SQLite çözüm üzerinde şaplak koymak istedim.

Güncelleme: Bir günlük artış yapmanın bir aylık artıştan daha fazla yer alacağına dair orijinal korkum çok yanlıştı.

Test sonuçları (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

Başka bir Javascript, 153

İlk yorum yapamam çünkü başka bir javascript cevap gönderirim ...

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 ile yürütme:

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

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

Girdi biçimindedir 2013 1 1,

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

veya bugünün tarihini kullanmak için sadece enter tuşuna basın (bu çıktı için 2013/12/11 olur)

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

2013-12-13

(aslında benim çözümüm ve 144 karakter sayar @gnibbler 'in bir karışımı var)

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)

Çok güzel bir hat while t.day*t.weekday()-65:@ gnibbler'ın çözümü.


1

Japt, 35 bayt

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

@ASCIIOnly sayesinde -8 bayt!

Dene!


Geçersiz çıktı biçimi ...
Yalnızca ASCII


Evet, üzerinde çalışıyorum :) Görünüşe göre toISOStringtarihi değiştiren UTC'ye dönüşür
dana

Tarihi nasıl değiştirir? Does Kmağaza zamanı yerel saat olarak?
Sadece ASCII

1
Düzeltildi, 39 (iyi, biraz. Bugün UTC için doğru sonucu çıktı (AFAICT) ve bu benim için yeterince iyi. Zaten benden daha fazla zaman dilimleri ile uğraşmak istemiyorum)
sadece ASCII-sadece

1

Swift 4 , 310 bayt

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

Çevrimiçi deneyin!

-4 TagTaco sayesinde.

Yazık ...:

  • Tarih / Takvim Vakfı gerekiyor.
  • Swift, Ints'nin şu şekilde kullanılmasına izin vermez:Bool .
  • Steno enum sözdizimi o kadar da olmasa da yardımcı olur.
  • Etrafında boşluk gerekli ??.
  • != aynı zamanda boşluk bırakmaya ihtiyacı var, ancak bir paket açma olarak yorumlanamaz.

0

VB.net (96c *)

giriş

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
  • Ben vb.net için CodeGolf sayısı işlevi imza , kapanış bitiş işlevi ve dönüş içermemelidir düşünüyorum . Yani sadece içsel uygulama ile ilgili.

Bu yüzden puanım şu şekilde bozuldu

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

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

Örnek kullanım:

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

0

Java 8, 200 197 bayt

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

Açıklama:

Burada deneyin (geçerli tarihi kullanmak için argümanı kaldırın).

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

NOT: Yazdırma zaten Java'nın varsayılan biçimi yyyy-MM-dd.


0

05AB1E , 141 bayt

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'de Date nesneleri veya hesaplamaları için herhangi bir yerleşik yoktur. Tarihi ile ilgili tek yerleşik bugünün yıl / ay / gün / saat / dakika / saniye / mikrosaniyedir.

Bu nedenle, gördüğünüz kodun neredeyse tamamı ertesi güne gitmek için manuel hesaplamalar ve haftanın gününü hesaplamaktır.

Çoğunlukla İş Günü Geri Sayım mücadelesindeki 05AB1E yanıtımdan türetildi (bu yüzden yaklaşık bir saat önce bir hatayla karşılaştığımda bunu düzenledim ..)

Girdi, biçimdeki bir dizedir dd-MM-yyyy(ancak, çıktının yyyy-MM-ddkurallarından biri olduğu için çıktı biçimindedir ).

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.