Hari-Hari Ini Bermanfaat untukku


8

Latar Belakang

Anda adalah pegolf kode yang menarik dan beberapa orang mengajak Anda berkencan.

Anda tidak punya waktu untuk memikirkan hari mana tepatnya Anda tersedia, jadi Anda memutuskan untuk membuat fungsi menerima tanggal dan mengembalikan hari dalam minggu itu.

Anda kemudian mengambil hari-hari dalam seminggu, memasukkannya ke dalam program kalender Anda untuk melihat apakah ada orang lain yang sudah mengajak Anda kencan.

Aturan

  • Menerima tanggal dalam format YYYY-MM-DD
  • Mengembalikan susunan / daftar tanggal pada minggu itu. (Minggu adalah hari pertama)
    • Tanggal dapat ditampilkan sebagai milidetik antara 1 Januari 1970 dan tanggal itu, dalam format tanggal "umum" 1 , atau objek tanggal.
  • Urutan tanggal harus naik.
    • (Meskipun Anda cukup pintar untuk memasukkan dukungan untuk daftar turun, program ini dapat bekerja paling cepat dengan daftar naik dan yang memiliki beberapa milidetik untuk cadangan?)
  • Harus bekerja dengan pada hari apa pun sejak 1993. (Ya, Anda berusia 24 tahun pada saat penulisan!)
  • Setiap jawaban Javascript mendapat lima tinggi!

Spesifikasi

Input sampel: whichDates(2017-08-29)

Output: (setara dengan)

console.log([
  Date.parse('2017-08-27'),
  Date.parse('2017-08-28'),
  Date.parse('2017-08-29'),
  Date.parse('2017-08-30'),
  Date.parse('2017-08-31'),
  Date.parse('2017-09-01'),
  Date.parse('2017-09-02'),
]);

1 Format yang cukup terkenal. Seperti YYYY-MM-DD.

2 Ini adalah ! Kode terpendek per bahasa menang, tetapi kode terpendek secara keseluruhan mendapat tanda centang emerald!


2
Juga, saya sarankan Anda untuk mengizinkan format lain, selain YYYY-MM-DD(Saya tidak melihat alasan yang bagus mengapa itu harus ketat).
Tn. Xcoder

5
Kalimat pertama adalah perkenalan yang paling aneh dan tidak masuk akal yang pernah saya lihat dalam sebuah tantangan. Bagus :-)
Luis Mendo

2
@LuisMendo Terima kasih! Tapi Anda tidak pernah tahu siapa sebenarnya yang diam-diam mengagumi keterampilan pemrograman Anda yang sakit ....
Chris Happy

1
Mengapa Setiap jawaban Javascript mendapat lima tinggi! ?
sergiol

1
Date.parse(2017-08-27)?? haruskah ini Date.parse('2017-08-27')?
tsh

Jawaban:


1

Japt , 15 byte

ÐU
7Æf1X+Uf -Ue

Menguji


Penjelasan

Input string yang tersirat U.

ÐU

Konversikan Uke objek tanggal dan tetapkan kembali ke U.

Buat array bilangan bulat dari 0hingga 6, masing-masing melewati fungsi di mana Xelemen saat ini.

f1

Tetapkan tanggal U.

X+Uf

Tambahkan tanggal Uke X.

-Ue

Kurangi hari saat ini di minggu U.

Secara implisit menampilkan array yang dihasilkan.


5

Perl 6 , 47 byte

{my$d=Date.new($_);map($d+*-$d.day-of-week,^7)}

Cobalah online!

Kode ini hampir jelas. Pertama kita membuat objek Date $ddari string, yang kebetulan berada dalam format ISO yang bagus. Kita dapat melakukan aritmatika dengan tanggal (menambahkan integer = menambahkan bahwa berhari-hari, sama dengan mengurangkan). Begitu $d-$d.day-of-weekjuga denganterakhirini (oh my god, minggu selalu dimulai dengan hari Senin untukku: D) minggu minggu. ( .day-of-weekadalah 1 untuk Senin hingga 7 untuk Minggu.) Kami kemudian memetakan lebih dari 0 hingga 6 ( ^7) dan menambahkannya ke hari Minggu, mendapatkan semua hari dalam seminggu. Angka yang kami pemetaan muncul di tempat bintang *. Daftar ini kemudian dikembalikan.


5

JavaScript (ES6), 73 63 62 Bytes

Saya pikir saya juga akan mencobanya di JavaScript.

Sunting: Menggunakan pendekatan milidetik, sebagaimana diizinkan oleh prompt, saya menguranginya menjadi 62 byte.

s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*864e5)

Anda dapat melakukan .map(x=>new Date(x))pada array yang dikembalikan jika Anda ingin mengubahnya.


Mempertahankan pendekatan tanggal ( 72 Bytes )

s=>[..."0123456"].map(i=>new Date((x=new Date(s))-(x.getDay()-i)*864e5))

Ada bug dalam pengiriman awal saya, itu diperbaiki. Berkat pengamatan oleh susu, saya bisa menghapus bug dan masih menurunkan jumlah byte.


Tinggi lima !!
Chris Happy

2
Selamat datang di situs ini!
Luis Mendo

Lebih pendek untuk hanya menuliskan angka-angka dalam array. 60 byte:s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
susu

1
Selamat datang di PPCG, dan terikat dengan baik :) Tip 1: Selokan keysdan gunakan indeks sebagai ganti elemen saat memetakan pada array. Tip 2: Untuk array sekecil ini, lebih pendek untuk menghasilkannya seperti yang saya lakukan.
Shaggy

3

MATL , 22 21 byte

7:j8XOs21Y2=f-GYO+1XO

Output dalam dd-mm-yyyyformat.

Cobalah di MATL Online!

Penjelasan

7:     % Push [1 2 3 4 5 6 7]
j      % Input as a string
8XO    % Convert date to string with format 8, which is 'Mon', 'Tue' etc
s      % Sum
21Y2   % Push predefined literal [298 302 288 305 289 296 310]. The first number
       % is the sum of ASCII codes of 'Mon', the second is that of 'Tue', etc.
=      % Is equal?, element-wise
f      % Index of nonzero value. For example, if input is a Friday this gives 5
-      % Subtract, element-wise. For a Friday this gives [-4 -3 -2 -1 0 1 2]
G      % Push input again
YO     % Convert to date number: number of days from January 0, 0000
+      % Add, element-wise
1XO    % Convert to date format 1, which is 'dd-mm-yyyy'. Implicitly display

3

JavaScript (ES6), 76 byte

Saya pikir saya akhirnya menemukan lingkungan yang paling tidak kondusif untuk bermain golf yang efisien: dari belakang bar saya, sambil menyajikan bir dengan tangan saya yang lain!

s=>[...""+8e6].map((_,x)=>d.setDate(d.getDate()-d.getDay()+x),d=new Date(s))

Coba online (Cuplikan untuk mengikuti)


Penjelasan

s=>

Fungsi anonim mengambil string (format yyyy-(m)m-(d)d) sebagai argumen melalui parameter s.

[...""+8e6]

Buat array 7 elemen dengan mengubah 8000000notasi ilmiah menjadi string dan menghancurkannya, yang lebih pendek dari [...Array(7)].

.map((_,x)=>          )

Peta di atas array, melewati setiap elemen melalui fungsi di mana _elemen saat ini, yang tidak akan digunakan, dan xindeks saat ini, berbasis 0.

,d=new Date(s)

Konversikan ske Dateobjek dan tetapkan ke variabeld

d.setDate(     )

Tetapkan tanggal d.

d.getDate()

Dapatkan tanggal saat ini d.

-d.getDay()

Kurangi angka hari kerja saat ini, 0-diindeks, untuk mendapatkan hari Minggu.

+x

Tambah x.


2
sambil melayani pint dengan tanganku yang lain! - Keahlian multitasking yang bagus :-)
Tn. Xcoder

Hampir lupa ... Lima Tinggi!
Chris Happy

2
@ChrisHappy jika Anda sedang belajar JS, jangan mencari kode golf untuk tips: P
caird coinheringaahing

1
@ChrisHappy: Bisa jadi hari Minggu sampai saya punya cukup waktu untuk menulis satu; terjebak di belakang bar sampai saat itu.
Shaggy

1
@ChrisHappy: Ditemukan sebentar, penjelasan ditambahkan. Anda harus melihat tips JS di bawah tag tips jika Anda mencari lebih banyak trik untuk bermain golf di JS.
Shaggy

2

Bash + utilitas umum, 53

jot -w@ 7 `date -f- +%s-%w*86400|bc` - 86400|date -f-

Cobalah online .

Ini mengasumsikan bahwa output dari tanggal GNU adalah format tanggal "umum", misalnya Fri Sep 1 00:00:00 UTC 2017.

Penjelasan

           date -f- +%s-%w*86400                       # read date from STDIN, output expression "seconds-since-epoch - (index of day in week * 60 * 60 * 24)
                                |bc                    # arithmetically evaluate generated expression - result is date of required sunday in seconds-since-epoch
jot -w@ 7 `                        ` - 86400           # output seconds-since-epoch for all 7 required days of the week, prefixed with "@"
                                            |date -f-  # convert all seconds-since-epoch dates back to regular dates

2

Python 3, 133 124 126 112 byte

-9 byte terima kasih kepada Tn. Xcoder
+2 byte karena minggu ini dimulai dengan Minggu
-14 byte terima kasih kepada notjagan

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print(a-timedelta(a.weekday()-i+1))

Itu tidak berjalan baik seperti yang saya harapkan.





Ini berfungsi di Python2 juga jika kita melakukan raw_input()alih - alih di input()atas. (+4 byte). rangemasih berfungsi di Python2 untuk hal kecil ini juga. Tanpa raw_inputAnda mendapatkan kesalahan.
Thomas Ward

1

Mathematica 20 byte?

Mathematica menyatakan daftar hari sebagai objek tanggal tunggal. Jika objek tanggal tersebut merupakan keluaran yang dapat diterima, fungsi murni 20 byte berikut ini akan berfungsi:

#~DateObject~"Week"&

Contoh

#~DateObject~"Week"&["2017-08-29"]

objek minggu


1
Saya tidak melihat masalah dengan itu! :)
Chris Happy

1

Java 8 ( 161 154 123 122 102 102 + 19 36 bytes)

Cobalah online!

import static java.time.LocalDate.*;

e->{for(int i=0;i<7;System.out.println(parse(e).plusDays(i++-parse(e).getDayOfWeek().getValue()%7)));}

Jangan lupa untuk memasukkan impor dalam hitungan byte dan solusi Anda.
Jakob

Anda juga dapat menyimpan byte dengan menghapus ldan mengganti referensi dengan LocalDate.parse(e).
Jakob

@Jakob Bagus, terima kasih
Roberto Graham

Dan sekarang Anda dapat menambahkan idalam loop body untuk menghemat 1 byte. Oh, dan java.util.function.*impor tidak digunakan oleh lambda, jadi Anda tidak harus menghitungnya sebagai bagian dari solusi.
Jakob

1

Python 2, 115 Bytes atau 111 Bytes, tergantung pada format input.

Pada dasarnya, ini hampir kode yang sama dalam jawaban untuk Python3 yang ditulis oleh Sobsz , tetapi dibuat untuk bekerja di Python 2.


Jika input dalam bentuk YYYY-MM-DD:

(Ini mengasumsikan input tidak dibungkus dengan tanda kutip tunggal untuk menunjukkan string sebagai input)

Perbedaan utama adalah bahwa kita perlu raw_inputalih-alih input, kecuali kita secara eksplisit menentukan tanggal di 'YYYY-MM-DD'dalam apostrof untuk mengidentifikasinya sebagai string literal. Tanpa input string literal, kita mendapatkan Kesalahan Sintaks, karenanya penggunaan raw_inputuntuk menerima tanggal YYYY-MM-DDsecara langsung tanpa memasukkannya ke dalam string literal.

Hal ini tentu saja mengasumsikan bahwa input dimasukkan ke dalam seperti: 2017-08-29.

from datetime import*
a=date(*map(int,raw_input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

+4 dari jawaban Sobsz, lalu -1 karena kita tidak perlu tanda kurung untuk printpernyataan dan menyimpan byte dari tanda kurung penutup tidak ada di sana; total perbedaan +3 byte.

Cobalah secara Online!


Jika input dalam bentuk 'YYYY-MM-DD':

(Perhatikan bahwa kita harus memiliki tanggal yang disediakan di dalam tanda kutip agar jawaban ini berfungsi)

Kita dapat menyimpan 4 byte karena kita tidak memerlukan raw_dan ini secara efektif jawaban yang sama seperti yang disediakan oleh Sobsz, dikurangi satu byte karena kita tidak memerlukan tanda kurung di sekitar printperintah.

Terima kasih kepada Tn. Xcoder karena menunjukkan yang satu ini, meskipun secara teknis ini adalah duplikat yang tepat, dikurangi satu byte, dari jawaban Sobsz .

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

1
Selamat datang di PPCG! Anda dapat mengganti raw_input()dengan input dan mengelilingi input dengan tanda kutip untuk menghemat 4 byte. Tentu saja, itu mengubah solusi Anda menjadi duplikat: P
Mr. Xcoder

@ Mr.Xcoder Benar, itulah sebabnya saya melewatkan itu. Padahal, jika kita memasukkan input dalam tanda kutip terlebih dahulu, kita sebenarnya menyimpan byte dari Sobsz, dan aku memang mencatatnya.
Thomas Ward
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.