Cetak semua hari Minggu di tahun 2017


27

Cetak tanggal semua hari Minggu pada tahun 2017 dalam format berikut: dd.mm.yyyy.
Output yang Diharapkan:

01.01.2017
08.01.2017
15.01.2017
22.01.2017
29.01.2017
05.02.2017
12.02.2017
19.02.2017
26.02.2017
05.03.2017
12.03.2017
19.03.2017
26.03.2017
02.04.2017
09.04.2017
16.04.2017
23.04.2017
30.04.2017
07.05.2017
14.05.2017
21.05.2017
28.05.2017
04.06.2017
11.06.2017
18.06.2017
25.06.2017
02.07.2017
09.07.2017
16.07.2017
23.07.2017
30.07.2017
06.08.2017
13.08.2017
20.08.2017
27.08.2017
03.09.2017
10.09.2017
17.09.2017
24.09.2017
01.10.2017
08.10.2017
15.10.2017
22.10.2017
29.10.2017
05.11.2017
12.11.2017
19.11.2017
26.11.2017
03.12.2017
10.12.2017
17.12.2017
24.12.2017
31.12.2017

1
Kemungkinan korban dari Rencana Hari Minggu Anda ? Yang ini adalah tahun tertentu.
xnor

1
Saya telah memeriksa Rencana hari Minggu Anda sebelum memposting, tetapi ia meminta untuk mencetak hari Minggu pada bulan tertentu. @xnor
ShinMigami13

1
Adakah alasan khusus untuk format output spesifik itu? Anda bisa membuka sedikit.
Rɪᴋᴇʀ

4
Saya sebenarnya suka ini sebagai tantangan kolmogorov teks-tepat. Memformat tanggal dengan benar memiliki beberapa optimasi yang menarik.
xnor

5
Bagaimanapun, saya pikir suara dekat harus ditarik kembali.
Erik the Outgolfer

Jawaban:


16

Python 2 , 81 byte

x=0
exec"print'%05.2f.2017'%(x%30.99+1.01);x+=7+'0009ANW'.count(chr(x/7+40));"*53

Cobalah online!

Tidak ada perpustakaan tanggal, yang menghitung tanggal secara langsung. Trik utamanya adalah memperlakukan nilai dd.mmdesimal. Misalnya, 16.04.2017(16 April) sesuai dengan nomor tersebut 16.04. Jumlah ini dicetak diformat sebagai xx.xxdengan .2017ditambahkan.

Hari dan bulan dihitung secara hitung. Setiap minggu menambahkan 7 hari dilakukan sebagai x+=7. Mengambil pegangan pegangan xmodulo 30.99dengan mengurangi 30.99kapan nomor hari terlalu besar. Ini digabungkan -31untuk mengatur ulang hari dengan +0.01menambah bulan.

Rollover mengasumsikan setiap bulan memiliki 31 hari. Bulan dengan hari yang lebih sedikit disesuaikan untuk dengan mendorong xke atas pada angka minggu tertentu dengan +[8,8,8,17,25,38,47].count(x/7). Daftar ini adalah angka minggu yang mengakhiri bulan-bulan pendek ini, dengan 8tiga kali lipat karena Februari 3 hari lebih pendek dari 31.

Daftar ini bisa dikompresi menjadi string dengan mengambil nilai ASCII plus 40. Pergeseran +40bisa dihindari dengan menggunakan karakter yang tidak patut, dan dapat diakses lebih pendek sebagai objek byte di Python 3.


Jawaban yang keren! '888z!}+'.count(chr(x%146))menghemat satu byte.
Lynn

10

PHP, 48 byte

while($t<53)echo gmdate("d.m.2017
",605e3*$t++);

PHP, 46 byte (untuk offset UTC non-negatif)

while($t<53)echo date("d.m.2017
",605e3*$t++);

1
Bukankah itu gmdateuntuk keamanan zona waktu? Gagal di onlinephpfunctions.com. Kerja hebat dalam semua aspek lainnya!
Titus

9

Python 2 , 90 79 byte

-5 byte dengan bantuan xnor (hindari menghitung minggu sendiri)
-1 byte terima kasih kepada xnor (tambahkan kembali e untuk 605000 sebagai 605e3)

from time import*
i=0
exec"print strftime('%d.%m.2017',gmtime(i));i+=605e3;"*53

Cobalah online!

0detik sejak zaman adalah 00:00:00 pada tanggal 1 Januari 1970, yang, seperti 2017 bukan tahun kabisat. 605000detik adalah 1 minggu, 3 menit, 20 detik. Menambahkan 52 dari "minggu" ini tidak membawa kita melampaui tengah malam.


Berikut cara yang lebih singkat untuk menghasilkan perkembangan aritmatika.
xnor

@ xnor Terima kasih, saya sedang mengerjakan hal yang sama dan berusaha lebih rendah, tetapi sepertinya lebih cocok dengan pendekatan perpustakaan.
Jonathan Allan

@ xnor ... atau tidak.
Jonathan Allan

1
Bagus! Jumlahnya bisa 605e3. Saya punya beberapa ide :)
xnor

7

Bash + coreutils, 44 byte

seq -f@%f 0 605e3 32e6|date -uf- +%d.%m.2017

dapat menghemat 2 byte -ujika GMT diasumsikan

  • Terima kasih Digital Trauma tunjukkan -fparamter dateyang menyimpan 10 byte;
  • Dan menggunakan 2017 dalam format string menghemat lebih banyak byte ide mana dari jawaban yang diberikan oleh user63956

  • @0 adalah 1970-1-1
  • 605000adalah satu minggu ( 604800) ditambah 200 detik
    • 200 detik seharusnya hanya bekerja karena hanya ada 52 minggu dalam setahun
  • @32000000 hanya sedikit lebih dari setahun

seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Ymenghemat 10 byte. Anda mungkin harus mengklaim ini sebagai Bash + coreutils .
Trauma Digital

7

PowerShell, 51 47

0..52|%{date((date 2017-1-1)+7.*$_)-u %d.%m.%Y}

Cukup mudah. 2017-01-01 adalah hari Minggu, begitu juga setiap tujuh hari berikutnya. Kita dapat menyimpan dua byte jika kita hanya membutuhkan skrip untuk berfungsi dalam hidupku:

0..52|%{date((date 17-1-1)+7.*$_)-u %d.%m.%Y}

1
Anda dapat menyimpan beberapa byte jika, alih-alih string, menambahkan jumlah hari ganda, yaitu (date 2017-1-1)+7.*$_. Lihat jawaban ini
Danko Durbić

@ DankoDurbić: Oh, wow. Saya hanya tahu menambahkan intkutu dan string selama berhari-hari sejauh ini. Bagus untuk mengetahui.
Joey

5

Excel VBA 106 91 79 byte

Sub p()
For i = #1/1/2017# To #12/31/2017#
If Weekday(i) = 1 Then MsgBox i
Next
End Sub

disimpan 15 byte berkat @Radhato

Dengan asumsi 1/1/2017 adalah hari Minggu akan menghemat 12 byte lebih banyak.

Sub p()
For i = #1/1/2017# To #12/31/2017#
MsgBox i
i = i + 6
Next
End Sub

Terima kasih @ Brushbrush 66 byte

Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub

Sunting: (Sub dan End Sub tidak perlu) 52 byte

For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next

Dapat ditingkatkan dengan chanching For i = 42736 Ke 43100 ke For i = # 1/1/2017 # To #
12/31/2017

@ Radhato tetapi bukankah itu meningkatkan ukuran byte?
Rohan

Saya pikir itu menguranginya menjadi 96 .. setidaknya itulah yang saya hitung lol
Radhato

Ya itu benar. Terima kasih
Rohan

1
@newguy Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Subadalah kode VBA yang benar-benar valid dan hanya 66 byte. Fakta bahwa Editor VBA menambahkan dalam ruang ekstra tidak relevan.
Sikat gigi

4

PHP, 67 byte

Menggunakan fakta bahwa PHP secara otomatis memberikan nilai 1 ke variabel loop yang tidak dideklarasikan, dan menggunakan zaman Linux,

<?php for(;54>$t+=1;)echo date("d.m.Y\n",604800*($t)+1482624000);?>

Selamat datang di PPCG! Saya percaya ini dapat dihitung sebagai 59 byte (walaupun saya tidak bermain golf di PHP sendiri).
Jonathan Allan

4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);seharusnya ok
tsh

2
Selalu senang melihat beberapa pegolf PHP baru! Anda diperbolehkan untuk menggunakan php -rsehingga Anda tidak perlu <?phpdan ?>dan oleh karena itu dapat mengandalkan ini sebagai 59 bytesseperti @JonathanAllan benar berkata. Anda tidak perlu tanda kurung $t. Beberapa golf lain dan Anda berakhir dengan for(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);untuk 51 bytes(di zona waktu saya). Anda dapat mengganti "\ n" dengan jeda baris nyata yang hanya 1 byte karena itu 51 byte.
Christoph

1
Terima kasih @Christoph Saya mencoba pendekatan lain, akan segera diperbarui
ShinMigami13

Terlepas dari semua petunjuk lainnya, Anda mungkin ingin menggunakannya gmdatedaripada dateuntuk keamanan zona waktu.
Titus

4

k6, 32 byte

`0:("."/|"."\)'$2017.01.01+7*!53

Penjelasan singkat:

                2017.01.01+7*!53 /add 0, 7, 14, ..., 364 to January 1st
   ("."/|"."\)'$                 /convert to string, turn Y.m.d into d.m.Y
                                 /   split by ".", reverse, join by "."
`0:                              /output to stdout (or stderr), line by line

Sayangnya, ini sepertinya hanya bekerja pada penerjemah sumber terbatas, atas permintaan saja.

Menjalankan perintah dalam juru bahasa sumber tertutup.


4

Pyke , 26 24 byte

53 Fy17y"RVs6)c"%d.%m.%Y

Cobalah online!

53 F                     - for i in range(53):, printing a newline between each
    y17y"                -  Create a time object with the year 2017. (Month and days are initialised to 1.)
         RV  )           -  Repeat i times:
           s6            -   Add 1 week
              c"%d.%m.%Y -  Format in "dd.mm.yyyy" time

Atau 11 byte

Jika dibiarkan mengabaikan format output

y17y"52VDs6

Cobalah online!

y17y"       - Create a time object with the year 2017. (Month and days are initialised to 1.)
     52V    - Repeat 52 times:
        D   -  Duplicate the old time
         s6 -  Add 1 week

3

R, 79 67 58 byte

cat(format(seq(as.Date("2017/01/01"),,7,53),"\n%d.%m.%Y"))

Pertama Januari menjadi minggu, cuplikan ini membuat urutan hari, setiap 7 hari mulai dari 01-01-2017 hingga 31-12-2017, memformatnya ke format yang diinginkan dan mencetaknya.


Ini harus menurunkannya menjadi 41 byteprint(as.Date("2017-01-01")+seq(7,365,7))
hitung

@count Terima kasih tetapi tidak akan mencetak output yang diperlukan (yaitu "2017.01.01" bukan "2017/01/01")
plannapus

3

Befunge-98 (PyFunge) , 99 95 93 85 byte, Daun tertinggal baris baru

Semua optimasi dilakukan oleh @ JoKing banyak terima kasih kepada mereka

s :1g2/10g\%:d1p10g\`+:b`#@_:1\0d1g#;1+:a/'0+,a%'0+,'.,j;a"7102"4k,d1g7+
>8><><>><><>

Cobalah online!

Saya merasa seperti kami kehilangan esoterisitas di sini, jadi saya membuat solusi dalam bahasa Esosterik favorit saya.

Penjelasan :
>8><><>><><>Menyandikan panjang 12 bulan
sMenyimpan hari yang lama di ruang kosong
:1g2/Dapatkan nilai ASCII dari baris paling bawah dan membaginya dengan dua, ini memberi kita lamanya satu bulan tertentu. Kel. 2 = 28 => Bulan (Februari) memiliki 28 hari.
10g\%Dapatkan hari yang disimpan sebelumnya dan modulasi pada panjang bulan yang memungkinkan kita untuk mengubah tanggal menjadi bulan berikutnya.
:d1pSimpan salinan hari yang baru diperbarui.
10g\`+Tes jika tanggal lama > tanggal baru => kami beralih ke bulan berikutnya => tambahkan 1 ke penghitung bulan
:b`Uji jika penghitung bulan> 11 itu berarti kami mencapai akhir tahun (menggunakan 0 pengindeksan)
#@_Berdasarkan sebelumnya jika menghentikan program
:1\0d1gSusun ulang tumpukan jadi terlihat seperti ini:Month, 1, Month, 0, Day
#lewati insctruction berikutnya (duh)
1+:a/'0+,a%'0+,'.,Konversikan angka menjadi 1 pengindeksan, cetak, tambahkan .di akhir
j;Gunakan 0 dari tumpukan untuk tidak melompat dan gunakan ;untuk pergi ke ke jadwal cetak lagi kemudian gunakan 1 untuk melompati ;berikutnya waktu
a"7102"4k,Cetak 2017\n
d1gDapatkan nilai hari lagi 7+Tambahkan seminggu sebelum berulang


@JoKing Omc optimasi yang jelas! Bagaimana saya bisa melewatkan yang itu? Terima kasih.
IQuick 143

1
Beberapa byte lagi mati. Cobalah online! Satu dari mengubah -17 lompat ke komentar sebagai gantinya, satu dari menggunakan pengindeksan berbasis 0 untuk penghitung bulan dan satu dari mengubahnya menjadi satu-liner
Jo King

@JoKing Wow itu banyak golf yang kamu lakukan di sana. Biar saya tambahkan ke jawabannya.
IQuick 143

1
Sial, mengapa tidak membuat hari-hari 0 diindeks juga, dan simpan harus melakukan inisialisasi sama sekali! 85 byte
Jo King

3

JavaScript, 111 106 byte

for(i=14833e8;i<1515e9;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

Catatan: Konsol Stack Exchange tidak cukup panjang untuk menampilkan seluruh daftar, jadi inilah paruh pertama sebagai cuplikan terpisah:

for(i=14833e8;i<15e11;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

Format khusus harganya 40 byte ...


2

Perl 5 , 64 byte

use POSIX;print strftime"%d.%m.%Y\n",0,0,0,7*$_+1,0,117for 0..52

Cobalah online!

Tugas yang diberikan adalah 2017, bukan tahun apa pun, jadi saya hardcode di:

  • 117 (yang diterbitkan untuk tahun 2017, 1900 + 117)
  • +1 karena 1 Januari adalah hari Minggu di tahun 2017
  • 0..52 karena 2017 memiliki 53 minggu

POSIX adalah modul inti dan selalu diinstal dengan Perl5. Melakukan hal yang sama tanpa menggunakan modul dalam 101 byte, menghapus spasi putih:

$$_[5]==117&&printf"%02d.%02d.%d\n",$$_[3],$$_[4]+1,$$_[5]+1900
  for map[gmtime(($_*7+3)*86400)],0..1e4

2

Ruby, 75 byte

Solusi mudah untuk mengetahui tanggal dengan Time.

t=Time.new 2017
365.times{puts t.strftime("%d.%m.%Y")if t.sunday?
t+=86400}

1
Jika Anda menambahkan satu minggu penuh (604800 detik), maka Anda tidak perlu memeriksa minggu, ulangi saja 53 kali.
GB

1
Jika Anda melakukan trik yang disarankan oleh @GB dan tidak lagi memeriksa untuk hari Minggu, Anda juga dapat menginisialisasi dengan t=Time.new 1dan kemudian lakukan t.strftime"%d.%m.2017"untuk -1 byte.
Nilai Tinta

2

SAS, 52 50 byte

Disimpan 2 byte berkat @ user3490.

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;

Anda tidak perlu menentukan dataset - cukup gunakan data;saja data c;dan yang menyimpan 2 byte. Saya pikir Anda perlu sedikit run;sekalipun.
user3490

@ user3490 Terima kasih, saya tidak menyadarinya. Saya kira itu setara dengan data _null_? Juga, runpernyataan itu tersirat jika hilang.
J_Lard

Tidak cukup setara - Anda berakhir dengan dataset keluaran mengikuti datankonvensi penamaan.
user3490

2

Mathematica 90 84 byte

Cukup bertele-tele. numbermaniac dan Scott Milner masing-masing menyimpan 5 dan 1 byte.

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]

Apakah Anda memerlukannya Most@? Outputnya tampaknya identik tanpa itu.
numbermaniac

1
@numbermaniac, Terima kasih. Mostada di sana untuk menghindari hari Minggu pertama pada tahun 2018. Saya awalnya menguji kode, tanpa Most, selama bertahun-tahun, 2011, 2012, dalam hal ini hari Minggu pertama pada tahun 2012 termasuk dalam output. (Itu sebabnya saya memasukkannya ke dalam kode.) Anehnya, Mosttidak diperlukan untuk 2017-18. Juga tidak Mostmemiliki efek yang jelas pada hasilnya. Gaib!
DavidC

1

VBA, 81 byte (mungkin 64)

Sub p()
For i = 0 To 52
MsgBox format(42736 + i * 7, "dd.mm.yyyy")
Next i
End Sub

Posting pertama saya. Membangun solusi newguy dengan menghapus cek untuk hari kerja dan hanya menentukan setiap hari ke-7. Menghapus tanggal menghemat 12 byte per lembar. 42736 adalah 1/1/2017. Format tanggal keluaran tergantung pada pengaturan sistem. Apakah itu diizinkan? Jika demikian, itu 64 byte karena Anda tidak memerlukan metode format .

MsgBox #1/1/2017# + i * 7

Anda juga dapat menghapus banyak ruang putih yang di-autoformatted. Misalnya, dan For i=0To 52dan Format(42736+i*7,"dd.mm.yyyy"). Anda juga bisa menggunakan Nextsaja Next i.
Engineer Toast

1

AHK , 67 byte

d=20170101
Loop,52{
FormatTime,p,%d%,dd.MM.yyyy
Send,%p%`n
d+=7,d
}

Tidak ada yang ajaib terjadi di sini. Saya mencoba mencari cara yang lebih pendek daripada FormatTime tetapi saya gagal.


1

Java 8+, 104 100 99 bytes

()->{for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Java 5+, 109 105 104 bytes

void f(){for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Menggunakan kemampuan tanggal printfformat.

Uji sendiri!

Tabungan

  1. 104 -> 100: mengubah nilai loop dan multiplicand.
  2. 100 -> 99: memutarkan loop

1

T-SQL, 94 Bytes

DECLARE @ INT=0,@_ DATETIME='2017'W:SET @+=1SET @_+=7PRINT FORMAT(@_,'dd.MM.yyy')IF @<52GOTO W

jika Anda tidak suka SQL GOTO atau WHILE, berikut adalah solusi CTE 122 byte

WITH C AS(SELECT CAST('2017'AS DATETIME)x UNION ALL SELECT x+7FROM C WHERE X<'12-31-17')SELECT FORMAT(x,'dd.MM.yyy')FROM C

solusi pertama Anda dimulai pada 08.01.2017tidak01.01.2017
ambil

1
Trik yang sangat bagus dalam solusi Anda. Kerja bagus. Saya tidak bisa menahan diri untuk meminjam mereka. ;)
AXMIM

1

Ruby, 60 + 7 = 67 byte

Menggunakan -rdatebendera.

(d=Date.new 1).step(d+365,7){|d|puts d.strftime"%d.%m.2017"}

1

Groovy, 81 77 63 60 56 byte

d=new Date(0);53.times{printf('%td.%<tm.2017%n',d);d+=7}

Di atas dapat dijalankan sebagai skrip groovy.

Entri golf kode pertama saya. Untungnya, tahun 1970 bukan tahun kabisat, sehingga dapat menggunakannya sebagai basis.

Berkat Dennis, ini a: Cobalah secara online!


Selamat Datang di Programming Puzzles & Code Golf! Jika Anda tertarik, ini tautan permanen: Coba online!
Dennis

Terima kasih @ Dennis, saya tidak tahu ini ada :)
Krystian

Anda dapat menyimpan empat byte dengan memindahkan tanggal di dalam blok waktu 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)},, 52 byte. Mempertahankan kehormatan groovy di sini ...
Matias Bjarland

1

C #, 138 111 102 byte

Disimpan 9 byte lebih banyak berkat Johan du Toit !

Disimpan 27 byte berkat saran Kevin Cruijssen !

()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));}

Fungsi anonim yang mencetak semua hari Minggu di tahun 2017.

Program lengkap dengan metode ungolfed:

using System;

class P
{
    static void Main()
    {
        Action f =
        ()=>
        {
            for (int i = 0; i < 53; )
                Console.Write(new DateTime(2017, 1, 1).AddDays(7 * i++).ToString("dd.MM.yyyy\n"));
        };



        f();
    }
}

1
Bukankah lebih mudah digunakan saja .AddDays(7*i++)? Maka tidak perlu untuk .DayOfWeek<1cek. Kita tahu 01-01-2017 adalah hari Minggu, dan dari sana kita bisa terus menambahkan 7 hari.
Kevin Cruijssen

2
Tidak yakin tentang ini - di semua golf kode yang saya ambil, saya selalu menggunakan namespace lengkap - tetapi tidakkah Anda melewatkan beberapa Systemdi sana - System.DateTimedan System.Console.Write?
auhmaan

Keren tapi Anda bisa menghemat beberapa byte:()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
Johan du Toit

@auhmaan: Ya, ruang nama lengkap harus digunakan, atau usingpernyataan harus dimasukkan dalam jumlah byte.
raznagul

3
@adrianmp: usingPernyataan yang diperlukan untuk menjalankan kode harus dihitung. Lihat pertanyaan Meta ini: Apakah saya perlu menggunakan impor atau dapatkah saya menyebut kelas explicity?
raznagul

1

C #, 110 109 byte

using System;()=>{for(int i=42729;i<43100;Console.Write(DateTime.FromOADate(i+=7).ToString("dd.MM.yyy\n")));}

Anda dapat menikmati program ini secara online di sini

Dalam soluion ini kami:

  • Gunakan OLE Automation Date (OADate) untuk menghindari "AddDay ()" dari datetime.
    FromOADate()tampak besar tetapi sama dengannew DateTime(2017,1,1)

  • Mulai perulangan pada hari minggu terakhir 2016. untuk memungkinkan kami meningkatkan +=hanya dengan operator . Operator ini mengembalikan nilai setelah kenaikan dilakukan.

  • Kenaikan 7 hari untuk melompat dari minggu ke minggu sebelum mencetak tanggal.

  • Kami berhenti setelah minggu terakhir 2017 tiba.

  • Gunakan Debugalih-alih Consoleuntuk menyimpan dua karakter

  • Hindari deklarasi dan penugasan variabel yang eksplisit


Kecuali ditentukan lain, default kami mengatakan Anda harus menyediakan fungsi atau program (yaitu bukan snippet), dan Anda harus memenuhi syarat Debug dan DateTime : Saya akan merekomendasikan menambahkan using System;dan beralih ke Consoledari Debug(yang merupakan dodgy itu sendiri, tapi saya bisa dapat menemukan komentar tentang meta mengenai hal itu).
VisualMelon

1
@VisualMelon saya sudah memenuhi "memberikan fungsi" dan saya juga telah mengganti Debuguntuk Consolesejak Debugdiperlukan tertentu termasuk. Namun, saya tidak mematuhi 'sistem penggunaan' karena pesaing saya dalam bahasa ini tidak melakukannya. Selain itu, Anda tidak bisa membuat kode di luar kelas yang harus didefinisikan dalam namespace. Saya cukup yakin sebagian besar jawaban c # di situs ini tidak termasuk itu. Jadi bagaimana sekarang, apakah kita membuang semua jawaban ini ke sampah? Apakah kita menurunkan semua suara untuk memaksa mereka menurut? Jika demikian, maka komunitas mungkin juga melarang c # dari codegolf sama sekali.
AXMIM

'Aturan' ini adalah apa yang telah ditetapkan oleh komunitas dari waktu ke waktu (dan didokumentasikan dengan meta). Kami tidak mengecilkan jawaban, kami mengomentari dan tidak mengunggulkannya juga. Ketika mereka memperbaikinya, maka kita bebas untuk memperbaiki. Kedua jawaban C # lainnya memiliki komentar yang menyarankan mereka harus menambahkan usingarahan atau sepenuhnya memenuhi syarat metode dan jenis, tolong jangan anggap ini sebagai masalah pribadi. Saya sudah lama menjadi pegolf C #, dan saya menghargai betapa sewenang-wenang aturannya, jadi saya ingin mendorong orang ke arah yang benar ketika saya bisa. Saya secara khusus 'menargetkan' jawaban C # karena saya relatif cukup tahu tentang masalah ini.
VisualMelon

1
@VisualMelon Cukup adil, saya hanya seorang pejalan kaki di sini. Jadi saya akan menerima peraturan Anda saat saya di sini. Karena itu, saya telah berusaha membuat jawaban saya memenuhi waktu ini.
AXMIM

1
Terlihat bagus untukku! +1 untuk pendekatan awal. Dan Anda tidak perlu spasi setelah using System;(saya berasumsi itu tidak disengaja) jadi itu 109 byte.
VisualMelon

1

TSQL, 112 105 byte

SELECT CONVERT(VARCHAR,DATEADD(d,number*7,42734),104)FROM master..spt_values WHERE type='p' AND number<53

Demo

T-SQL Konversi Sintaks


Anda dapat menyimpan 2 byte dengan mengganti DAYdengan d. Itu melakukan hal yang sama.
AXMIM

+1 Anda dapat menyimpan 3 byte lainnya dengan menggantinya '20170101'dengan 42734. Tanggal adalah angka. Waktu adalah bagian desimal dari angka tersebut.
AXMIM

1

JavaScript (ES6), 123 byte

Ini posting pertama saya di sini, halo!

a=x=>`0${x}.`.slice(-3);[].map.call('155274263153',(x,i)=>{for(j=0;j<4+(2633>>i&1);j++)console.log(a(+x+j*7)+a(i+1)+2017)})

Solusi ini menggunakan data hardcoded dan dirancang untuk bekerja secara khusus untuk tahun 2017. Ini bergantung pada API tidak ada tanggal / waktu.

Adapun digit dalam string 155274263153, setiap digit adalah angka sendiri dan menunjukkan hari Minggu pertama setiap bulan berturut-turut. Output untuk sepanjang tahun dapat dihasilkan dengan menambahkan 7 secara berurutan.

Bagaimana dengan angka ajaib, 2633 digunakan dalam loop?
Yah ... 2633(desimal) 101001001001dalam biner. Sekarang apa 1artinya itu? Mulai dari kanan, bit 1, 4, 7, 10 dan 12 diatur. Ini sesuai dengan bulan yang kebetulan memiliki lima hari Minggu, berbeda dengan mereka yang hanya memiliki empat hari. Golfed ke ekspresi rapi ini, awalnya tampak seperti ini: for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++).

Saya kira bagian yang tersisa cukup jelas.


@SIGSEGV: Saya tidak keberatan berubah ECMAScript 2015menjadi Javascript (ES6), tapi ... Anda memecahkan kode saya dan saya harus mengembalikannya.
badak

Oh, itu konsensus komunitas, hanya bagian lambda yang diizinkan.
Matthew Roh

@SIGSEGV Ini tidak terjadi di sini. Lambda ini hanya berisi sebagian kecil dari kode, dan saya membutuhkan pengenal itu untuk dapat menggunakannya di tempat lain. Tanpa a=kode sebenarnya rusak .
badak

1

T-SQL, 79 77 Bytes

Setelah membantu Salman A meningkatkan jawabannya . Saya memutuskan untuk menulis sendiri menggunakan loop dan PRINT.

Saya mengakhiri dengan solusi 90 byte ini.

DECLARE @d DATETIME=42734 WHILE @d<43100BEGIN PRINT CONVERT(VARCHAR,@d,104)SET @d=@d+7 END

Kemudian saya melihat pemimpin saat ini di T-SQL yang merupakan 94 byte dari WORNG ALL dengan jawaban ini . Orang ini telah menemukan trik yang sangat bagus.

  1. Beri nama variabel saja @
  2. Ulangi dengan GOTObukannya LOOP yang sebenarnya
  3. Simpan satu karakter menggunakan FORMATbukan CONVERT. (Hanya SSMS2012 +)

Dengan menggunakan trik ini, solusi ini dipangkas menjadi solusi di bawah ini yang 79 byte.

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G

Anda dapat menyimpan 2 byte dengan mengubah @ = @ + 7 ke @ + = 7 dan dengan menghapus spasi antara 7 dan IF.
WORNG ALL

Dalam posting ini adalah di mana saya mendapatkan semua trik, semoga membantu Anda juga.
WORNG ALL

1
@WORNGALL wonderfull, saya tidak tahu kita bisa melakukan itu. Terima kasih banyak.
AXMIM

1

Oktaf , 37 byte

Jauh lebih pendek daripada semua bahasa non-golf lainnya, dan bahkan terikat dengan Jelly! Cara untuk pergi Octave! :)

disp(datestr(367:7:737,'DD.mm.2017'))

Cobalah online!

Untungnya, tahun 2 ADterlihat persis sama dengan tahun 2017 AD. Keduanya dimulai dan berakhir pada hari Minggu, dan tidak ada tahun kabisat. Ini menghemat banyak byte, karena 367:7:737cukup sedikit lebih pendek dari736696:7:737060 .

Ini mengonversi jumlah hari sejak 01.01.0001, menjadi string pada format DD.mm, dengan trailing .2017.


1

Haskell , 133 130 byte

import Data.Time.Calendar
((\[f,g,h,i,j]->i:j:'.':f:g:".2017\n").drop 5.show)=<<take 53(iterate(addDays 7)$fromGregorian 2017 1 1)

Cobalah online!

Tanpa perpustakaan kalender, 148 144 140 byte

(\l->last l!l++length l!l++"2017\n").fst.span(>0).(<$>scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]).(-)=<<[1,8..365]
a!_=['0'|a<=9]++show a++"."

Ini lucu karena menggunakan operator untuk fungsi padding menghemat dua byte meskipun argumen kedua tidak digunakan, karena kurung lebih sedikit diperlukan - p(last l)lebih lama dari last l!l. Bekerja dengan menghitung day/monthpasangan dengan mengurangi tanggal mulai bulan kumulatif dari hari dalam setahun. Tanggal mulai bulan dikompresi sebagai (scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2] ). Nomor bulan adalah jumlah elemen positif dan jumlah hari adalah elemen positif terakhir.

Cobalah online!


0

C #, 116 114 113 byte

for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(‌​new DateTime(i).ToString("dd.MM.yyyy\n"));

Dapat dijalankan di jendela interaktif Visual Studio (atau C # REPL lain berdasarkan Roslyn)

Turun ke 113 byte: terima kasih kepada Kevin Cruijssen.


1
Bisakah Anda menambahkan tautan TryItNow ? Selain itu, Anda dapat melakukan sedikit golf dengan menggunakan for-loop alih-alih sementara-loop:for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Kevin Cruijssen

@KevinCruijssen Unfortunaly Saya tidak dapat menemukan kompiler yang berlaku di halaman yang diberikan. Berikut ini tautan ke teknologi yang digunakan jika Anda ingin menghubunginya: tautan . Pokoknya terima kasih untuk loop baru. :)
rmrm

1
Kecuali ditentukan lain, standar kami mengatakan Anda harus menyediakan fungsi atau program (yaitu bukan cuplikan), dan Anda harus memenuhi syarat Debug dan DateTime : Saya akan merekomendasikan menambahkan using System;dan menggunakanConsole.WriteLine(string)
VisualMelon
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.