Jumat depan tanggal 13


15

Apa program terpendek yang dapat memprediksi waktu Jumat berikutnya akan jatuh pada hari ke 13 bulan itu?

  • Harus merupakan program yang berfungsi lengkap (bukan hanya fungsi / subrutin)
  • Harus mencetak tanggal dalam format berikut: YYYY-MM-DD
  • Izinkan pengguna untuk memberikan tanggal mulai baik sebagai argumen baris perintah atau melalui STDIN
  • Jika pengguna tidak memberikan tanggal mulai, gunakan hari ini sebagai tanggal mulai.
  • Jika tanggal mulai adalah hari Jumat tanggal 13, program harus mencari hari Jumat tanggal 13 yang berikutnya .

Jika saya menjalankan program hari ini (16 Feb 2011) saya harus mendapatkan output berikut.

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

Apakah 2013-9-13output akan ok untuk contoh pertama?
JB

Maksud Anda, kami dapat memutuskan apakah kami ingin mengambil tanggal sebagai argumen atau dari STDIN atau bahwa kami perlu mendukung keduanya?
sepp2k

@ sepp2k Anda dapat memutuskan, Anda tidak perlu mendukung keduanya, pengguna hanya perlu cara untuk memasukkan tanggal.
Daniel Standage

@ JK Ya, karena ada beberapa solusi lain yang menangani semua persyaratan, saya tidak akan menerima tanggapan Anda sebagai solusi meskipun itu adalah yang terpendek. Itu tidak berarti respons Anda tidak informatif ... tapi ya, berurusan dengan format tanggal yang tidak konsisten akan membuat frustrasi.
Daniel Standage

Yah yang ini tidak benar-benar mungkin dengan naskah golf karena tidak tahu tanggal hari ini *. Itu juga tidak memiliki perpustakaan tanggal sehingga kemungkinan akan menjadi jawaban yang cukup besar. (* Anda dapat menggunakan ruby ​​eval untuk mendapatkannya, tetapi lebih baik gunakan ruby ​​date lib juga)
gnibbler

Jawaban:


6

Windows PowerShell, 74

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

Cukup mudah. Satu bit yang mungkin membingungkan adalah penggunaan "Get-Date $args" | Invoke-Expressionuntuk mendapatkan tanggal saat ini (jika $argskosong) atau tanggal yang ditentukan dalam $argstanpa meningkatkan kesalahan.

Varian 72 byte:

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

Membutuhkan waktu lama, meskipun ... ini tidak menambah datetime setiap hari setiap iterasi tetapi hanya 900 nanodetik. Tapi dua byte lebih pendek.

Varian 67 byte:

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

Ini agak sensitif terhadap lokal; jika gagal pada mesin Anda, coba atur format tanggal Anda ke ISO-8601 sebelumnya. :-)

Oh, dan itu bisa dibuat menjadi 65 byte sama seperti versi 72 byte.

Sejarah:

  • 2011-02-17 00:33 (92) Upaya pertama.
  • 2011-02-17 00:35 (85) Meningkatkan mendapatkan tanggal awal.
  • 2011-02-17 00:37 (79) Membandingkan produk, bukan hari dan hari dalam seminggu secara individual. Diakui dicuri dari Ventero.
  • 2011-02-17 00:40 (76) Menarik garis pertama ke dalam for. Perbandingan sama seperti pengurangan alih-alih -eqyang menyimpan dua byte lagi.
  • 2011-02-17 00:53 (75) dateString format Unix sedikit lebih pendek.
  • 2011-02-17 11:42 (74) Dikembalikan ke pola tanggal default tetapi yyy-MM-dcukup (karena tahun selalu lebih lama dari tiga karakter dan hari selalu 13. Terima kasih kepada Ty Auvil untuk ini.

Mengapa Anda meneruskan "date $ args" iex? Coba saja (sebutkan $ args) sebagai gantinya.
Iszi

@Iszi: Ini digunakan untuk mengimplementasikan "Jika pengguna tidak memberikan tanggal mulai, gunakan hari ini sebagai tanggal mulai." aturan. Jika Anda melewatkan sebuah array kosong atau $nulluntuk Get-DateAnda akan mendapatkan error, bukan tanggal saat ini. "date $args"|iexnamun, memutuskan untuk tanggal yang diberikan $args atau tanggal saat ini, yang persis seperti yang kita inginkan di sini.
Joey

4

bash, 75

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

Ini agak sensitif terhadap lokal; jika gagal pada mesin Anda, cobalah exporting LC_ALL=Cterlebih dahulu.

$ 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

Mengambil tanggal dari stdin. Untuk tidak menentukan tanggal, tekan ctrl-d.

Terima kasih banyak atas bantuan Ventero.

Tidak Disatukan:

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

Sampel 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==65lebih pendek 4 karakter. Dan Anda harus dapat menggantinya Date.today.to_sdengan"thu"
Ventero

Benar-benar menggunakan loop bukan iterator memperpendek kode untuk 76 karakter: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. Dan Anda bisa membaca tanggal dari stdin dengan getsalih - alih $*[0]menyimpan karakter lain (masukkan EOF untuk mendapatkan perilaku default).
Ventero

@Ventero: Sangat bagus, terima kasih.
sepp2k

3

C #, 185

Berdasarkan solusi C # Andrew Koester , tetapi sangat dimodifikasi di sepanjang jalan. Saya akhirnya tiba pada solusi yang mirip dengan solusi PowerShell saya:

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 (dan lainnya), 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 atau lebih baru, jalankan dengan -E 'code here'atau -M5.010 file. Kebutuhan date(dari coreutils untuk Linux) dan cal(dari util-linux)

Contoh dijalankan:

$ 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

Saya tidak yakin kapan nol terkemuka selama berbulan-bulan sebelum Oktober disimpan. Ini jelas hilang ketika tahun bergulir; tampaknya disimpan ketika jawabannya baru bulan depan. Sebut saja perilaku tak terdefinisi itu - hei, ini golf!


2

PESTA

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

KONSEP DIGUNAKAN:

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

SAMPEL 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 karakter. C # membutuhkan mode "jalankan di dalam fungsi saja"!

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

Tidak golf:

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

Uji keluaran

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

Lebih Jelas:

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

Bagian yang menyenangkan adalah bahwa std.datetime D membuat kode semacam ini sangat mudah untuk ditulis, itu juga sangat bertele-tele - terutama karena nama fungsi yang tepat (dan karena itu panjang). Jadi, kegunaan dan pemeliharaan kode sangat tinggi, tetapi kode golfabilitasnya agak rendah.


2

Python - 166 karakter

Dibaca dari stdin, jadi Anda perlu memberi makan baris kosong jika Anda ingin kencan hari ini

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

Kecuali jika saya melewatkan sesuatu ini tidak memenuhi persyaratan ke-4 (jika tidak ada tanggal, mulai dari hari ini).
Daniel Standage

@Aniel, melewatkan yang itu. 26 pukulan kemudian ...
gnibbler

Ledakan dari masa lalu maaf :) Jika kami bergabung dengan solusi kami, kami mencapai 144 karakter kolaboratif (lihat di bawah!) :)
Roberto

2

SQLite, 374 karakter

(Jeda baris ditambahkan di sini agar mudah dibaca; tidak termasuk dalam hitungan.)

Persyaratan untuk "Izinkan pengguna untuk memberikan tanggal mulai baik sebagai argumen baris perintah atau melalui STDIN" dihilangkan karena keterbatasan teknis.

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 pernyataan pertama membuat tabel (R) dengan satu kolom yang berisi semua bilangan bulat dari 0 hingga 4095.

Pernyataan ke-5 membangun tabel (F) dari semua hari Jumat tanggal 13 antara 2000-10-13 dan 2340-12-13.

Pernyataan 6 hanya mengembalikan Jumat pertama tanggal 13 setelah tanggal (UTC) saat ini.


Kalender Gregorian memiliki siklus 400 tahun, bukan 340 tahun. Atau saya kehilangan sesuatu di sini?
Joey

Itu tidak menangani tahun di luar kisaran 2000-2340. Itu hanya pilihan sewenang-wenang.
dan04

2

PHP - 103

(paksaan)

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

Tidak Disatukan:

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

Uji:

$ 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
Anda dapat menyimpan hingga 1 karakter dengan mengubah !=ke -. Anda juga dapat menyimpan hingga 2 karakter dengan naik ke atas $d->modify('next fri')di bagian kenaikan loop.
HoLyVieR

Saya perlu mengubah ke hari Jumat berikutnya sebelum loop, jika tanggal yang diberikan sudah hari Jumat 13 :-) (atau bahkan hanya 13)
Arnaud Le Blanc

Gunakan -rdan Anda tidak perlu tag. Gunakan konfigurasi default dengan -ndan Anda tidak perlu @. \ntidak perlu. echoalih-alih diemenyimpan byte lain. strtotimebukannya Datekelas dapat menyimpan satu atau dua lagi.
Titus

2

C #, 206 194 karakter

Memperbarui

Ini sedikit berbeda dari masalah, jadi saya meninggalkan usaha saya yang lain di sini secara penuh.

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

Di sini, saya menemukan hari Jumat "sekarang" minggu dan kemudian bertambah tujuh sampai saya menemukan satu yang 13. Saya juga menggunakan Joey untuk format loop dan output untuk mencukur beberapa karakter.

Tidak Disatukan:

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

Asli:

Ini mirip dengan Andrew di atas, tetapi ada cukup banyak perbedaan yang saya putuskan untuk mengirim jawaban terpisah daripada mengomentari dan menyarankan suntingan.

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

Tidak Disatukan:

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

Contoh berjalan:

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

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

Cobalah online!

Berkat @ ASCII-hanya untuk -5


Tidak valid, perlu menangani kasus ketika pengguna tidak memberikan argumen, jugaday-of-week==5
ASCII-satunya

@ Hanya ASCII diperbaiki
Ven

Oh ya, itu juga harus menjadi program yang lengkap, bukan fungsi
ASCII-satunya

Mungkin ingin menautkan ini (bahkan lebih baik, pergi ke sana, esc -> s -> g untuk postingan yang diformat dengan baik)
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: yeah, saya tahu, saya melanggar aturan pertama (tidak bisa hanya fungsi)

Tes pada shell 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 Melawan bahasa tujuan umum elitis yang mendukung aturan STDIN.
mootinator

1

T-SQL 359 285 253 Karakter

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)

Saya hanya ingin meletakkan smack pada solusi SQLite dengan fungsi tanggal verbose non-pintar saya menggunakan prosedur T-SQL.

Pembaruan: Ketakutan awal saya bahwa melakukan peningkatan satu hari akan memakan lebih banyak ruang daripada kenaikan satu bulan itu sangat salah.

Hasil tes (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 lain, 153

Saya mengirim jawaban javascript lain karena saya tidak dapat mengomentari yang pertama ...

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

Jalankan dengan 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 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

Input dalam format 2013 1 1,

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

atau cukup tekan enter untuk menggunakan tanggal hari ini (akan 2013/12/11 untuk output ini)

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

2013-12-13

(sebenarnya ada campuran dari solusi saya dan @gnibbler yang menghitung 144 karakter)

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)

Baris yang sangat bagus while t.day*t.weekday()-65:adalah dari solusi @ gnibbler.


1

Japt, 35 byte

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

-8 byte terima kasih kepada @ASCIIOnly!

Cobalah!


Format output tidak valid ...
ASCII-satunya


Ya, saya sedang mengusahakannya :) Tampaknya toISOStringmengkonversi ke UTC yang mengubah tanggal
dana

Bagaimana cara mengubah tanggal? Apakah Kwaktu penyimpanan sebagai waktu lokal?
ASCII

1
Memperbaiki, 39 (well, agak. Ini menghasilkan hasil yang benar untuk hari ini di UTC (AFAICT) dan itu cukup baik bagi saya. Tidak ingin mengacaukan zona waktu lebih dari yang sudah saya miliki)
ASCII-satunya

1

Swift 4 , 310 byte

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

Cobalah online!

-4 Terima kasih untuk TagTaco.

Sayang...:

  • membutuhkan Yayasan untuk Tanggal / Kalender.
  • Swift tidak mengizinkan Ints digunakan sebagai Bool.
  • Sintaks enum steno sangat membantu, meskipun tidak banyak.
  • Diperlukan ruang sekitar ??.
  • != juga perlu spasi, jangan sampai itu ditafsirkan sebagai membuka.

0

VB.net (96c *)

Masuk

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
  • Saya pikir penghitungan CodeGolf untuk vb.net tidak harus menyertakan tanda tangan fungsi , fungsi akhir penutup dan pengembalian . Jadi itu hanya membuatnya tentang implementasi internal.

Jadi skor saya rusak seperti itu

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]

Tidak Disatukan:

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]

Contoh penggunaan:

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

0

Java 8, 200 197 byte

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

Penjelasan:

Coba di sini (hapus argumen untuk menggunakan tanggal saat ini).

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

CATATAN: Format default Java saat pencetakan sudah yyyy-MM-dd.


0

05AB1E , 141 byte

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 tidak memiliki builtin untuk objek atau perhitungan Date. Satu-satunya builtin mengenai tanggal yang dimilikinya adalah tahun ini / bulan / hari / jam / menit / detik / mikrodetik.

Jadi karena itu, hampir semua kode yang Anda lihat adalah perhitungan manual untuk hari berikutnya, dan menghitung hari dalam seminggu.

Sebagian besar berasal dari jawaban 05AB1E saya dalam tantangan The Work Day Countdown (itulah sebabnya saya diedit bahwa salah satu sekitar satu jam yang lalu ketika saya datang di bug ..)

Input adalah string dalam format dd-MM-yyyy(tetapi output dalam formatyyyy-MM-dd , karena itu adalah salah satu aturan tantangan).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.