Solusi F # dikenal di dalam 140 karakter , dan ini adalah masalah Kode Rosetta .
Hasil yang diperlukan pada stdout atau dalam variabel string untuk tahun input 2014
:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
Seperti yang diminta, untuk tahun 1900:
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
Dan 2000:
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Ditempatkan karena kurma tampaknya memunculkan kecanggungan di sebagian besar bahasa. Lebih dari mengizinkan perpustakaan tanggal, saya berharap untuk melihatnya! Tetapi jika di luar bahasa dasar, nyatakan dalam nama posting (misalnya C # + Jon Skeet's NodaTime).
Klarifikasi:
- Rentang tahun 1900 hingga 3015
- Kalender Gregorian
- Jika tidak penting, apa pun yang konvensional untuk UK / London.
- Sebuah program yang mengambil alih commandline atau stdin baik-baik saja, menghasilkan hasilnya menjadi stdout
- Fungsi mengambil nilai untuk tahun itu dan mengembalikan string juga baik-baik saja.
Tidak ada celah standar . Menantikan solusi APL, J, K, dan melihat beberapa perpustakaan tanggal baru.
Jawaban:
Dyalog APL dengan kal dari dfns , 19 byte
Lebih baik terlambat daripada tidak sama sekali!
Anjuran untuk tahun, mengembalikan daftar tanggal dalam format tttt tttt .
⎕
masukan numerik dan biarkan itu menjadi argumen kiri ke{
...}¨
fungsi anonim (ditemukan di bawah) diterapkan untuk masing-masing⍳12
angka dari 1 hingga 12 (bulan-bulan)Fungsi anonim di atas adalah sebagai berikut:
⍺⍵,
tambahkan argumen kiri dan kanan (mis. tahun dan bulan) ke2↑
dua karakter pertama⊢⌿
baris paling bawah darical
kalender untuk⍺⍵
argumen kiri dan argumen kanan (tahun dan bulan)TryAPL online:
Kembali ke halaman ini setelah mengklik di sini untuk mengimpor
cal
dan dependensinya.Klik di sini untuk menjalankan test case.
sumber
+
-
<
≤
=
≥
≠
⌈
dan⌊
bekerja dengan objek tanggal Net .Ruby, 91 + 6 = 97
Berfungsi dengan cukup baik.
select(&:sunday?)
cukup, dan mengejutkan,*' '
apakah semua format dengan sendirinya.sumber
chunk
bukangroup_by
.Bash 4.x + ncal, 57
Jika pemisah baris baru OK, bukan spasi, maka kita dapat menghapus
-n
sakelar dan mengekor spasi dariecho
pernyataan. Dan saya kira itu akan tetap bekerja tanpa shebang, jadi saya menghapusnya juga:Skrip asli (73 byte):
Pemakaian:
Catatan: Versi Bash sebelum 4.0 akan menghilangkan nol terkemuka dari bulan. Ini dapat diperbaiki dengan penambahan 5 karakter dengan mengubah
{01..12}
ke`seq -w 1 12)`
. Juga,tail -c-3
dapat menyebabkan masalah pada beberapa sistem di mana outputncal
menyertakan spasi tambahan, tapi saya tidak mengetahui ada yang melakukannya.sumber
`…`
alih-alih kebiasaan yang baik$(…)
.#!/bin/bash
untuk tujuan bermain golf.IBM DFSORT,
113 baris dengan 71, 72 atau 80 karakterDua jawaban dengan format output berbentuk kolom telah teruji oleh waktu. Itu memberi saya "loop", semacam, di bahwa pada OUTFIL REPEAT = menyalin catatan saat ini yang berkali-kali.
Teknik yang berbeda untuk mendapatkan nilai, yang tampaknya lebih lama tetapi lebih pendek karena saya tidak dapat menemukan cara tanpa syarat untuk berurusan dengan catatan ke-12 berada di tahun berikutnya, dan menjadikannya syarat bersyarat termasuk
IFTHEN=(WHEN=
, dua kali, dan beberapa hal lainnya. Keuntungan pada ayunan (bulan pertama adalah cara paling sederhana untuk melakukannya) sangat kehilangan bundaran (persyaratan sintaksis tertentu).Ini menggunakan fungsi inbuilt (semua fungsi dalam DFSORT adalah inbuilt) untuk menemukan hari terakhir bulan itu. Kemudian tambahkan satu hari (fungsi) untuk mendapatkan yang pertama dari bulan berikutnya dan menggunakan fungsi PREVDSUN untuk mendapatkan hari Minggu sebelumnya (yang akan selalu menjadi hari Minggu terakhir di bulan sebelumnya, seperti sebelumnya).
Ketika mengubah tahun (input) menjadi tanggal yang valid, nomor urut dua digit digunakan untuk bulan itu, dan nilai itu juga disalin untuk hari itu, karena titik awal tidak masalah selama valid, seperti kita setelah hari terakhir bulan pada awalnya:
5,2
lebih pendek dariC'01'
.Inilah detailnya:
OPTION COPY - menyalin file input ke output
OUTFIL - untuk memungkinkan beberapa file output, dengan pemilihan dan pemformatan yang berbeda, menghasilkan laporan yang diformat. Digunakan dalam preferensi untuk yang lebih pendek
INREC
karena penggunaanREPEAT=
.REPEAT = 12 - menghasilkan 12 salinan dari setiap catatan. Dalam contoh ini, hanya ada satu catatan input (tidak seperti versi sebelumnya) karena SEQNUM.
5: - mulai di kolom 5 pada catatan.
SEQNUM, 2, ZD - nomor urut, standar untuk mulai dari satu, dua digit, "desimal dikategorikan" (untuk unsigned, yang akan menjadi, sama dengan karakter).
1,8 - salin byte 1 untuk panjang 8 ke lokasi saat ini (9). Ini karena Y4T perlu melihat bahwa 8, jika tidak format tanggal yang berbeda akan digunakan.
Y4T - tanggal format ccyymmdd (karena 8 tepat di depannya).
LASTDAYM - Hari terakhir Bulan (juga dimungkinkan dari Minggu, Kwartal dan Tahun).
TOJUL = - konversi tanggal keluaran untuk fungsi tanggal (TOJUL adalah satu karakter kurang dari TOGREG)
9,7 - sekarang 7 lama, Y4T akan menjadi CCYYDDD.
ADDDAYS - menambahkan beberapa hari, menyesuaikan secara otomatis jika masuk ke bulan / tahun berikutnya (bisa juga ADDMONS dan ADDYEARS)
PREVDSUN - tanggal Julian datang, Minggu sebelumnya berlokasi, TOGREG untuk mendapatkan format keluaran yang benar, dengan pemisah "-" (bisa apa saja yang Anda suka sebagai pemisah)
12X - kosong untuk membersihkan kekacauan yang memungkinkan kami melakukannya dengan cara yang singkat
Output dari di atas, untuk 2014, adalah:
Diperlukan sesuatu untuk memberi tahu SORT apa yang harus dilakukan. Tidak ada standar.
OPTION COPY
adalah yang terpendek,SORT FIELDS=COPY
setara tetapi lebih lama.Pekerjaan itu sendiri dilakukan kali ini di
OUTFIL
(untuk memungkinkan penggunaan REPEAT). Kode kerja bisa dibilang ada di antara 160 (2 * 80), 144 (2 * 72), 140 (72 + 69), atau 138 (70 + 68) (tidak termasuk blanko terkemuka, lanjutan paksa dan trailing blank).Mengingat bahwa penerima harus tahu apa yang mereka lakukan, saya pikir saya dapat mengatakan bahwa kode DFSORT mencantumkan hari Minggu terakhir setiap bulan untuk setiap tahun mulai tahun 1900 (akan berjalan dari tahun 0001, tapi saya menghindari penelitian sebagai well) hingga 9999 (meskipun DFSORT mendukung tahun hingga 9999, solusi sebelumnya tidak akan berfungsi di tahun 9999 karena tanggal ke-12 masuk ke tahun berikutnya) dapat di-Tweet.
Mengapa kodenya begitu panjang, jika ada fungsi inbuilt yang tepat?
Definisi bidang adalah fana. Bidang hanya didefinisikan sebagai lokasi tertentu dalam data (yang merupakan catatan) untuk segera digunakan. Dengan kata lain, bidang tidak didefinisikan seperti itu, tetapi didefinisikan untuk setiap penggunaan dan hanya untuk digunakan. Fungsi tanggal perlu mengetahui format tanggal mana yang digunakan untuk sumber, dan output harus dalam format tanggal, sehingga harus ditentukan.
Sekarang kita punya kencan Julian .... TBC?
Membutuhkan beberapa
JCL
Dan file input (baris lain dari JCL dan tiga item instream data):
Menghasilkan:
Sebenarnya akan bekerja hingga tahun 9999.
DFSORT adalah produk penyortiran Mainframe IBM. Data dapat dimanipulasi, tetapi karena pengurutan adalah kunci dan pengurutan sering kali besar dan berjalan lama, kartu kontrol DFSORT tidak memiliki konstruksi pengulangan, jadi kami tidak dapat memasukkan SORT ke dalam satu lingkaran. Membuat hal-hal yang agak bertele-tele untuk tugas-tugas seperti Golf.
Mengapa memposting jawaban, adalah karena DFSORT memiliki
PREVDday
fungsi. Jadi hari Minggu terakhir dalam sebulan itu mudah. Ini adalah hari Minggu sebelumnya (PREVDSUN) hingga hari pertama bulan berikutnya.Itu juga menyenangkan untuk melakukannya dalam satu "operan" (OVERLAY), agak seperti melakukan semuanya di dalam
sprintf
atau serupa.Ini dia ungolfed:
Meskipun tidak cukup pelecehan, itu tidak biasa untuk mencoba menjejalkan semua ini menjadi satu OVERLAY, dan ada beberapa hal yang tampaknya tidak perlu yang diperlukan untuk memungkinkan semuanya masuk ke dalam satu OVERLAY. Ada beberapa ruang untuk bermain golf, tetapi karena itu hanya akan menghapus satu baris paling banyak, saya tidak tergoda.
INREC diproses untuk setiap catatan.
OVERLAY memungkinkan konten catatan yang ada diubah. Jika catatan diperpanjang melampaui panjangnya dalam proses, itu tidak masalah.
1,4 adalah tahun yang akan datang. Ini memiliki 0201 literal ditambahkan ke dalamnya, dan kemudian 1,8 berturut-turut mengulanginya 11 kali untuk memberikan satu chuck panjang 96 byte,
Tahun ke-12 pada catatan saat ini diperpanjang mendapat 1 ditambahkan ke dalamnya, dan bulannya dibuat menjadi 1 (Januari).
Sisa 10 bulan diubah menjadi 3 hingga 11.
Lalu ada 12, dalam urutan terbalik (karena OVERLAY) dari jenis hal ini:
N: adalah nomor kolom pada catatan. X memasukkan kosong. 89,8 mengambil data dari kolom / panjang itu, Y4T memperlakukannya sebagai tanggal CCYYMMDD, PREVDSUM bekerja pada hari Minggu sebelumnya, TOGREG = Y4T (-) menampilkannya sebagai tanggal Gregorian CCYY-MM-DD.
Karena Anda mendapatkan sampah jika sumber dan target bagian tertentu dari OVERLAY tumpang tindih secara destruktif, final
11:X,18,120,6X)
mengatur ulang dan menutupi sedikit kekacauan.Manual dan makalah dapat ditemukan di: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , dan termasuk Panduan Pemrograman Aplikasi DFSORT 900+ halaman.
Seperti halnya semua produk IBM, semua manual tersedia gratis (kecuali sejumlah kecil yang sangat mahal yang hanya segelintir orang di dunia yang pura-pura mengerti).
Semua Kartu Kontrol DFSORT harus dimulai dengan yang kosong. Kolom 72 hanya digunakan untuk kelanjutan (tidak ada yang kosong akan dilakukan, tetapi * adalah konvensional). Kolom 72 diikuti oleh area nomor urut yang diabaikan, membuat setiap record 80 byte.
Beberapa solusi lain yang akan datang, mungkin.
sumber
Bash, 63 byte
Keluaran:
sumber
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 byte-v
param todate
khusus untuk tanggal BSD. Jadi ini berfungsi pada OSX, tetapi tidak pada kebanyakan Linux - mungkin itu harus dinyatakan dalam jawabannya.Python 2 - 189 byte
Masukkan tanggal melalui STDIN.
Masih banyak lagi golf yang bisa dilakukan. Program sedikit berlebihan, hanya untuk bersenang-senang:
Catatan
zfill
diperlukan selama bertahun-tahun karena rentang input, atau hari karena mereka akan selalu lebih dari 20Python 2 - 106 byte
Solusi tidak menyenangkan:
calendar.monthrange
mengembalikan dua angka: hari kerja bulan dimulai pada (w
) dan jumlah hari dalam bulan (n
). Solusinya sedikit berlawanan karena penangkapan - hari kerja kembali dimulai pada 0 untuk hari Senin , bukan hari Minggu! Namun, ini diimbangi oleh fakta yangn
berbasis 1.sumber
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Edit masalah zona waktu yang diperbaiki Bisa lebih pendek jika dibuat rekursif. Mungkin.
sumber
new Date(y,0,++i,9)
. Juga, ini gagal untuk tahun kabisat 2100 dan di atas karena JS tidak memiliki info tentang tahun kabisat dan dengan demikian, tidak memilikiFeb 29
sama sekali di tahun kabisat untuk tahun 2100 dan di atas.new Date(2014,0,26,9)
hari Minggu memberikan yang benarISO
tali sertagetDay()
sebagai0
.JavaScript, ES6,
222 219199 byteSaya tidak melihat jawaban JavaScript di rosetta wiki.
Kita mulai:
Ini menciptakan fungsi
S
yang mengembalikan string dengan output yang diinginkan. fungsi ini juga menangani tahun kabisat.Karena ES6, ini hanya berfungsi di Firefox terbaru.
Terima kasih kepada apsillers untuk tip yang mendapatkannya dikurangi menjadi 200 byte
Temukan versi yang tidak dikenali di bawah ini sebagai cuplikan tumpukan yang dapat Anda jalankan di sini sendiri:
sumber
2100
Output input2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02
salah.Rebol -
120 116 80 7976Tidak dikumpulkan + beberapa anotasi:
Contoh perhitungan minggu di konsol Rebol:
sumber
CJam,
122102 byteIni tidak menggunakan bentuk perpustakaan tanggal apa pun. Bisa juga masih banyak bermain golf, saya kira.
Uji di sini.
sumber
R, 128 karakter
Dengan jeda baris:
sumber
C # 255
Tidak disatukan
Edit: dimodifikasi untuk mencetak hanya hari Minggu terakhir :)
sumber
q, 67
sumber
"Oh, tidak, dia lagi!"
Java -
259246 byteVersi tidak disatukan:
Pemakaian:
Keluaran:
Namun jawaban "mari kita beri balasan Java hanya untuk iseng" saja. Baiklah. Tetapi, paling tidak, karena Anda berusaha mencapai titik jawaban saya ini, saya akan mencoba membuat Anda bosan lagi dan menjelaskan alasan saya.
Metode
g
menerima tahun yang diinginkan dan, untuk setiap bulan, menciptakanGregorianCalendar
objek (bulan beralih dari 0 hingga 11). Kemudian, yang pertamac.set
menetapkan hari dalam seminggu sebagai hari Minggu dan yang kedua menyatakan bahwa kita menginginkan minggu terakhir bulan itu - seperti yang terlihat pada dokumentasi resmi . TheSystem.out.println
print tanggal hari Minggu (jika kita melakukan hak ini, tahun akan dicetak sebagaic.get(c.YEAR)
, tetapi menggunakany
lagi mencukur off 13 karakter), bulan harus diformat untuk menambahkan nol dari Januari sampai September (dan nilai bertambah karena, yah, bulan di sini diwakili 0-11) dan hari Minggu terakhir dicetak. Dan prosedur ini diulang selama sebelas bulan lainnya.sumber
C #,
212, 237Dengan jeda baris
Output untuk 2014
sumber
C # 171
Berfungsi mengembalikan string.
Tidak disatukan
sumber
C # 194
menggunakan Linq:
Tidak disatukan
Keluaran
sumber
Mathematica - 171
Dibungkus dalam fungsi anonim, mengembalikan string
Golf matematika pertama. Saya merasa seperti itu dapat dikurangi secara substansial.
sumber
VB-192
Bisa lebih buruk ^^
Entri kedua dan terakhir saya (jangan berpikir saya bisa membuatnya lebih kecil)
142
sumber
Ruby 76
Menggunakan parameter baris perintah
ruby sundays.rb 1900
. Menggunakan perpustakaan tanggal.sumber