Dapatkan tanggal hari kesembilan dalam satu tahun dan bulan tertentu

17

pengantar

Seringkali, orang menyebut tanggal sebagai "Jumat kedua pada Agustus, 2018" atau "Minggu keempat pada Maret 2012". Tetapi sulit untuk mengatakan tanggal berapa itu! Tugas Anda adalah menulis program yang menerima satu tahun, satu bulan, satu hari dalam seminggu, dan bilangan bulat, dan menampilkan tanggal tersebut.

Tantangan

  • Untuk input, Anda akan mendapatkan satu tahun, satu bulan, satu hari dalam seminggu, dan sebuah angka.

  • Anda dapat mengambil input dalam format apa pun yang wajar, seperti menggunakan string untuk hari dalam seminggu atau menggunakan nol hari kerja yang diindeks, atau bahkan mengambil tahun dan bulan dalam satu string. Namun, jelaskan format input Anda dalam jawaban Anda.

  • Bilangan bulat yang memberi tahu Anda hari mana dalam satu bulan dalam target yang akan menjadi bilangan bulat dari 1-5. Bilangan bulat tidak akan pernah merujuk ke hari dalam seminggu yang tidak ada (mis. Jumat kelima Februari 2019, yang tidak ada).

  • Tahun akan selalu positif.

  • Output Anda dapat dalam format yang masuk akal, termasuk mencetak tanggal akhir Anda. Namun, tolong jelaskan format output Anda di luar jawaban Anda.

  • Memberikan tahun dan bulan dalam output adalah opsional. Anda juga dapat menganggap tanggal tersebut valid.

Contoh Input dan Output

Pertimbangkan input ini, dengan format yang diambil pada tahun tersebut sebagai angka 4 digit, bulan sebagai bilangan bulat, hari dalam seminggu sebagai string, dan nomor urut sebagai bilangan bulat:

2019, 3, Sabtu, 2
2019, 12, Minggu, 1
2019, 9 Sabtu, 1

Keluaran:

9 Maret
1
Desember 7 September

Ini , jadi jawaban tersingkat menang.

Perwujudan Ketidaktahuan
sumber
1
Saya pikir saya mungkin dapat menggunakan GNU date, tetapi yang mengherankan, parser memiliki ... interpretasi yang menarik di sini.
Gagang Pintu
Bisakah angka minggu diindeks 0?
Jo King
Tentu, jika itu sesuai dengan program Anda
Perwujudan Ketidaktahuan
Kasing uji yang disarankan: 2018, 12, Minggu 1
Adám
Case test yang disarankan: Sabtu pertama pada September 2019
Shaggy

Jawaban:

4

Templat MediaWiki, 19 byte

{{#time:r|{{{1}}}}}

Ini adalah port MediaWiki Template ParserFunctions dari jawaban PHP ini

Catatan: #timegunakan PHP secara strtotimeinternal.


Input Sampel

{{#time: r | Sabtu kedua Maret 2019}}

Output Sampel

Sab, 09 Mar 2019 00:00:00 +0000

tsh
sumber
3

Japt, 19 15 byte

Input adalah: tahun, indeks berbasis bulan 0, indeks berbasis hari dalam seminggu ( 0adalah hari Minggu) & n.

_XµW¶Ze}f@ÐUVYÄ

Cobalah

                    :Implicit input of U=year, V=month, W=weekday & X=n
       }f           :Output the first element generated by the right function that returns
                    : falsey (0) when passed through the left function
         @          :Right function. Y=0-based index of current iteration
          ÐUVYÄ     :  new Date(U,V,Y+1)
_                   :Left function. Z=date being passed
 Xµ                 :  Decrement X by
   W¶               :   Test W for equality with
     Ze             :    Z.getDay()
Shaggy
sumber
2

C # (Visual C # Interactive Compiler) , 59 byte

(y,m,d,w)=>1+(d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+7*w

Cobalah online!

-27 bytes terima kasih kepada @EmbodimentOfIgnorance!

Lebih sedikit kode golf ...

// y: year
// m: month
// d: day of week (0 is Sunday)
// w: week number (0 based)
(y,m,d,w)=>
  // start on the first day of the month
  1+
  // determine the number of days to
  // the first occurrence of the
  // requested weekday
  (d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+
  // add the number of requested weeks
  7*w

Nilai kembali adalah bilangan bulat untuk hari bulan dari tanggal yang diminta.

dana
sumber
Jika Anda hanya mengembalikan hari dalam sebulan, yang diperbolehkan, Anda dapat memasukkan ini ke 59 byte
Perwujudan Ketidaktahuan
Terima kasih atas tipnya lagi - (itu 2x hari ini;) Saya akan memperbarui jawaban saya.
dana
2

SmileBASIC, 58 51 48 46 45 byte

READ N,M$DTREAD M$OUT,,D,W?(5-W+D*2)MOD 7+N*7

Masukan dalam bentuk: week,year/month/weekday

  • week: nomor minggu, 0-diindeks
  • year: tahun, 4 digit
  • month: bulan (1-diindeks), 2 digit 0 padded
  • weekday: hari dalam seminggu (1-indexed, 1 = Sunday), 2 digit 0-padded

Output adalah hari dalam sebulan, 0 diindeks.
Sabtu 2 Maret 2019 adalah 1,2019/03/078 (9 Maret)

Tidak disatukan

READ WEEK,M$
DTREAD M$ OUT ,,D,W
'Functions in SB can output multiple values using OUT.
'In this case, we don't need the first 2 values, so no variables are given.

PRINT (5-W+ D*2) MOD 7 +WEEK*7

Penjelasan

Formulir input dipilih secara khusus sehingga tahun / bulan / hari kerja dapat diteruskan langsung ke DTREAD, yang merupakan fungsi yang mem-parsing suatuYYYY/MM/DD string dan mengembalikan tahun / bulan / hari sebagai angka, serta menghitung hari dalam seminggu.

Namun, perhatikan bahwa, di mana DTREADmengharapkan hari dalam sebulan, kami memberikannya hari dalam seminggu sebagai gantinya. Ini menyulitkan banyak hal, tetapi juga berarti bahwa ada nilai input yang lebih sedikit dan kami tidak perlu menambahkan/01 ke akhir string tanggal.

DTREADoutput Wdan D.
Wadalah hari kerja, dan Dmerupakan hari-hari-minggu dari Whari ke-1 bulan itu.
(Jadi, jika Anda input 7sebagai hari kerja, Dakan menjadi 7danW akan menjadi hari apa pun di hari ke 7 di bulan tersebut)

Ekspresi (5-W+D*2)MOD 7 digunakan untuk mendapatkan kemunculan pertama input hari kerja, sebagai hari yang diindeks 0 pada bulan tersebut. (Saya menemukan ini sebagian besar melalui coba-coba)

Setelah itu, program tinggal menambahkan WEEK*7.


Saya benar-benar berharap ada kata-kata terpisah untuk "hari dalam seminggu" dan "hari dalam sebulan".

12Me21
sumber
2

Perl 6 , 52 48 byte

{1+($^c+4-Date.new($^a,$^b,1).daycount)%7+$^d*7}

Cobalah online!

Blok kode anonim yang mengambil input sebagai tahun, bulan, hari dalam seminggu (Minggu adalah 0) dan nomor minggu (0 diindeks). Output adalah objek tanggal.

Penjelasan Lama:

{                                                  } # Anonymous code block
 (   Date.new(         ))   # Create a new date with
              $^a,$^b,1     # With year, month and the first day
  $_=                       # Save in the variable $_
                         +  # Add to this
                           $^c+4                     # The given day plus 4
                          (     -.daycount)          # The number of days since 17 Nov, 1858
                                           %7        # Modulo 7 to get the correct day
                                             +$^d*7  # Plus the 7 times the number of weeks
Jo King
sumber
Saya pikir nomor minggu harus diindeks 1
12Me21
@ 12Me21 Pertanyaannya mengatakan bahwa input fleksibel, tapi saya sudah bertanya apakah kita mengambil angka minggu sebagai 0 diindeks
Jo King
Ini sepertinya tidak berfungsi untuk bulan-bulan lainnya. Saya pikir Anda perlu $^c+4-$!.daycount.
nwellnhof
@nwellnhof Ah, saya seharusnya memikirkan itu alih-alih coba-coba, lol. Harus diperbaiki sekarang
Jo King
1

MATL , 28 27 byte

'1 'ihYO31:q+t8XOi=!A)i)1XO

Ini menggunakan tiga input:

  • String dengan bulan dan tahun: 'March 2019'
  • String dengan tiga huruf, huruf kapital pertama, menunjukkan hari dalam seminggu: ' Sat'
  • Nomor: 2.

Output adalah string dengan hari, tahun, dan bulan yang dipisahkan dengan tanda hubung: 09-Mar-2019 .

Cobalah online!

Penjelasan

Pertimbangkan input 'March 2019', 'Sat', 2.

'1 '    % Push this string
        % STACK: '1 '
ih      % Input string: month and year. Concatenate
        % STACK: '1 March 2019'
YO      % Convert to serial date number
        % STACK: 737485
31:q+   % Create vector [0 1 2 ... 30] and add element-wise
        % STACK: [737485 737486 737487 ... 737515]
t8XO    % Duplicate. Convert to date format 'ddd': day of week in three letters. Gives
        % a 2D char array
        % STACK: [737485 737486 737487 ... 737515], ['Fri'; 'Sat'; 'Sun'; ...; 'Sun']
i=      % Input string: day of week in three letters. Compare element-wise with broadcast
        % STACK: [737485 737486 737487 ... 737515],
        % [0 0 0; 0 0 0; ...; 1 1 1; 0 0 0; ... 1 1 1; ...]
!A      % True for rows containing only 1
        % STACK: [737485 737486 737487 ... 737515], [0 0 ... 1 ... 0 ... 1 ...]
)       % Index: uses the second vector as a mask into the first
        % STACK: [737486 737493 737500 737507 737514]
i)      % Input number. Index
        % STACK: 737493
1XO     % Convert to date format 'dd-mmm-yyyy'. Implicit display
        % STACK: '09-Mar-2019'
Luis Mendo
sumber
1

Python 3 , 92 82 byte

82 byte berkat @ Jo King

lambda y,m,d,w:z(y,m)[w-(z(y,m)[0][d]>0)][d]
from calendar import*
z=monthcalendar

Cobalah online!

Versi asli, 92 byte

from calendar import*
def f(y,m,d,w):
 x=monthcalendar(y,m)
 if x[0][d]:w-=1
 return x[w][d]

Cobalah online!

Mengambil tahun sebagai bilangan bulat, bulan sebagai bilangan bulat 1-indeks, hari dalam seminggu sebagai bilangan bulat 0-indeks di mana Senin adalah 0dan hari Minggu adalah6 , dan minggu dalam bulan sebagai bilangan bulat berindeks 1.

Bagaimana itu bekerja:

# import monthcalendar
from calendar import*
# function with 4 inputs
def f(y,m,d,w):
 # get a 2-D array representing the specified month
 # each week is represented by an array
 # and the value of each element is its date of the month
 # Monday is the 0th element of each week, Sunday is the 6th element
 # days of the first week of the month before the 1st are 0s 
 x=monthcalendar(y,m)
 # if the first week of the month includes the desired day of week
 # convert the week of month to 0-index so that it takes into account the first week
 if x[0][d]:w-=1
 # return the weekday of the week number specified
 return x[w][d]
Neil A.
sumber
1

R , 72 69 byte

function(y,m,d,n,D=as.Date(paste0(y,-m,-1))+0:31)D[weekdays(D)==d][n]

Cobalah online!

Mengambil input sebagai:

  • Nomor tahun
  • Nomor bulan (1-12)
  • String hari kerja di lokal saat ini (TIO memerlukan nama bahasa Inggris dengan huruf besar)
  • Nomor urut (1-diindeks)
menggali semua
sumber
0

PHP , 46 , 43 , 31 byte

<?=date(d,strtotime($argv[1]));

Cobalah online!

Program menerima sebagai input string seperti "second saturday of March 2019"

Program mencetak nomor hari.

-12 byte berkat Shaggy.

Кирилл Малышев
sumber
1
31 byte
Shaggy
Juga, saya pikir Anda tidak perlu ofinput.
Shaggy
@ Shaggy, saya pikir ini adalah detail. Mungkin ada banyak pilihan.
Кирилл Малышев
0

Groovy , 46 byte

{y,m,d,w->r=new Date(y,m,7*w)
r-(r.day+7-d)%7}

Cobalah online!

Masukan sebagai tahun sejak 1900, bulan yang diindeks 0, hari yang diindeks 0 (hari Minggu menjadi 0) dan nomor minggu

Khusus ASCII
sumber
0

Scala , 86 byte

(y,m,d,w)=>{var r=new java.util.Date(y,m,7*w)
r.setDate(r.getDate-(r.getDay+7-d)%7)
r}

Cobalah online!

Khusus ASCII
sumber
0

Merah , 64 60 byte

func[y m d n][a: to-date[1 m y]d - a/10 - 7 % 7 +(n * 7)+ a]

Cobalah online!

Mengambil tahun, bulan dan hari kerja sebagai angka, 1-diindeks, Senin adalah hari pertama dalam seminggu.

Galen Ivanov
sumber
ya, to-dateadalah suatu hal. mungkin ini akan berguna dalam tantangan format malam Natal
ASCII-hanya
@ Khusus ASCII Kami gunakan nowuntuk tantangan itu
Galen Ivanov
1
ya, tetapi saya memikirkan metode alternatif (yaitu, metode <mengulang " Eve"date2-date1 kali> iirc)
ASCII-only
@ Khusus ASCII>> 25-Dec-2019 - 1-1-2019 == 358
Galen Ivanov
0

APL (Dyalog Unicode) , 36 byte SBCS

Program lengkap. Anjuran untuk [year,month](Januari adalah 1), lalu untuk hari (Minggu adalah 0), lalu untuk n (pertama adalah 1).

date⎕⊃d/⍨⎕=7|d←(⍳31)+days⎕⊣⎕CY'dfns'

Cobalah online!

⎕CY'dfns'c o p y di dfns perpustakaan

 Buang hasil yang mendukung ...

 konsol cepat untuk [year,month]angka

days[c]  hari [n] sejak 1899/12/31 dari 0 th bulan itu

(⍳31)+ tambahkan i ntegers 1… 31 ke dalamnya

d← toko di d(untuk d nomor ay)

7| pembagian divisi ketika dibagi oleh 7 (hari-minggu dengan hari Minggu menjadi 0 karena zaman yang baik)

⎕= konsol cepat untuk nomor hari-minggu dan mendapatkan topeng di mana sama dengan angka hari-minggu

d/⍨ saring ddengan topeng itu

⎕⊃ konsol cepat untuk n dan menggunakannya untuk memilih dari daftar nomor hari

date[c]  stempel waktu dat [n] (memiliki angka nol untuk jam, menit, detik, milidetik)


Klik [c] untuk kode dan [n] untuk catatan.

Adm
sumber
0

JavaScript (ES6), 49 48 byte

f=
(a,d,n)=>(d+6-new Date(...a,7).getDay())%7+n*7-6
<div oninput=o.textContent=f([+y.value,+m.value],+d.value,+n.value)>Year: <input id=y type=number value=2019><br>Month: <select id=m><option value=0>Jan<option value=1>Feb<option value=2>Mar<option value=3>Apr<option value=4>May<option value=5>Jun<option value=6>Jul<option value=7>Aug<option value=8>Sep<option value=9>Oct<option value=10>Nov<option value=11>Dec</select><br>Day: <select id=d><option value=0>Sun<option value=1>Mon<option value=2>Tue<option value=3>Wed<option value=4>Thu<option value=5>Fri<option value=6>Sat</select><br>Count: <input id=n type=number value=1 min=1 max=5><pre id=o>

Mengambil parameter sebagai f([year, month], day, number). Bulan dan hari dalam seminggu (mulai hari Minggu) tidak diindeks. Sunting: Disimpan 1 byte berkat @Shaggy.

Neil
sumber
Apakah hari dalam format minggu-Sabtu atau Senin-Minggu?
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance Maaf, saya tahu saya lupa sesuatu. (Cuplikan sekarang menggunakan pilih untuk membuatnya lebih mudah.)
Neil
@EmbodimentofIgnorance, Sunday ada 0di JS.
Shaggy
Oh Saya tidak tahu itu, saya tidak begitu terbiasa dengan Javascript.
Perwujudan Ketidaktahuan
48 byte
Shaggy
0

TSQL, 106 byte

DECLARE @ datetime='2019',@m int=3,@w char(2)='saturday',@p int=2

SELECT dateadd(wk,datediff(d,x,dateadd(m,@m-1,@)-1)/7,x)+@p*7FROM(SELECT
charindex(@w,' tuwethfrsasu')/2x)x

Keluaran:

2019-03-09 00:00:00.000

Cobalah

t-clausen.dk
sumber
0

Kotlin , 131 84 byte

47 byte berkat kode dan komentar ASCII saja.

Input: tahun, monthNumber, weekdayNumber, weekNumber

Semua bilangan bulat 1 hingga maksimum pada satu baris. Nomor hari minggu adalah hari Minggu dari 1 hingga Sabtu dari 7. Program utama membuat tahun kehilangan 1900 untuk kelas Tanggal dan bulan dan hari kerja digeser untuk memulai dengan nol alih-alih sebelum memanggil lambda. Anda dapat memasukkan argumen Anda di kotak teks input untuk mencoba tanggal Anda sendiri.

Output: contoh kelas Date. Program utama menampilkan hasilnya seperti: Sab 09 Mar 00:00:00 UTC 2019.

Ada versi yang diperluas dengan komentar yang menjelaskan kode bagi mereka yang ingin mempelajari lebih lanjut.

{y,m,d,w->val r=java.util.Date(y,m,7*w)
r.setDate(r.getDate()-(r.getDay()+7-d)%7)
r}

Cobalah online!

JohnWells
sumber
1
74 - menggunakan metode yang sama dengan jawaban Scala dan Groovy
ASCII
1
Diperbaiki, 84
ASCII
1
Tidak perlu untuk perintah impor lagi jadi itu tidak masalah: P
ASCII-hanya