Belirli bir yıl ve ayda haftanın nci gününün tarihini öğrenin


17

Giriş

Çoğu zaman, insanlar tarihlere "Ağustos 2018'de ikinci Cuma" veya "Mart 2012'de dördüncü Pazar" olarak atıfta bulunur. Ama bu tarihin ne olduğunu söylemek zor! Göreviniz, bir yıl, bir ay, haftanın bir günü ve bir tamsayı alan bir program yazmak ve bu tarihi çıktılamaktır.

Meydan okuma

  • Giriş için bir yıl, bir ay, haftanın bir günü ve bir sayı alırsınız.

  • Girdiyi haftanın günü için dize kullanma veya hafta içi dizine sıfır sıfırlama gibi makul bir biçimde alabilir veya hatta yıl ve ayı tek bir dizede alabilirsiniz. Gerçi giriş formatınızı cevabınızda açıklayınız.

  • Ayın hangi haftasının hedefleneceğini söyleyen tam sayı 1-5 arasında bir tam sayı olacaktır. Tam sayı hiçbir zaman haftanın mevcut olmayan bir gününe değinmez (örneğin, Şubat 2019'un beşinci Cuma günü vardır).

  • Yıllar her zaman olumlu olacaktır.

  • Çıktınız, son tarihinizi yazdırma da dahil olmak üzere herhangi bir makul biçimde olabilir. Ancak, yanıt biçiminizi kullanarak çıktı biçiminizi açıklayınız.

  • Çıktıda yıl ve ay sağlamak isteğe bağlıdır. Ayrıca, tarihin geçerli olduğunu varsayabilirsiniz.

Örnek Giriş ve Çıkış

Biçimi yıl içinde 4 basamaklı sayı, ay, tamsayı, haftanın günü dize ve sıra sayısı tamsayı olarak alındığında bu girdiyi düşünün:

2019, 3, Cumartesi, 2
2019, 12, Pazar, 1
2019, 9 Cumartesi, 1

Çıktı:

9
Mart 1
Eylül 7

Bu , bu yüzden en kısa cevap kazanır.


1
GNU kullanabileceğimi düşündüm date, ama eğlenceli bir şekilde ayrıştırıcının burada ilginç bir yorumu var.
Kapı tokmağı

Hafta sayısı 0 ile endekslenebilir mi?
Jo King

Elbette, programınıza uygunsa
Cehaletin Somutlaştırılması

Önerilen test örneği: 2018, 12, Pazar 1
Adám

Önerilen test örneği: Eylül 2019'daki ilk Cumartesi
Shaggy

Yanıtlar:


4

MediaWiki Şablonu, 19 bayt

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

Bu, bu PHP cevabının bir MediaWiki Template ParserFunctions portudur

Not: #timePHP'yi strtotimedahili olarak kullanın .


Örnek Giriş

{{#time: r | Mart 2019'un ikinci cumartesi}}

Örnek Çıktı

BeğenCmt, 09 Mar 2019 00:00:00 +0000


3

Japt, 19 15 bayt

Girdi: yıl, 0 tabanlı ay endeksi, haftanın 0 tabanlı endeksi ( 0Pazar günü) & n.

_XµW¶Ze}f@ÐUVYÄ

Dene

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

2

C # (Visual C # Etkileşimli Derleyici) , 59 bayt

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

Çevrimiçi deneyin!

@EmbodimentOfIgnorance sayesinde -27 bayt!

Daha az golf kodu ...

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

Dönüş değeri, istenen tarihin ayının günü için bir tam sayıdır.


Sadece izin verilen ayın gününü döndürürseniz, bunu 59 bayta
Bilgisizlik

Tekrar bahşiş için teşekkürler - (bugün 2x;) Cevaplarımı güncelleyeceğim.
dana

2

SmileBASIC, 58 51 48 46 45 bayt

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

Girdi şu şekildedir: week,year/month/weekday

  • week: hafta numarası, 0 dizinli
  • year: yıl, 4 hane
  • month: ay (1 dizinli), 2 basamaklı - 0yastıklı
  • weekday: haftanın günü (1 dizinli, 1 = Pazar), 2 basamaklı - 0yastıklı

Çıktı ayın günüdür, 0 endekslenir.
Mart 2019'daki 2 Cumartesi 1,2019/03/078(9 Mart)

Ungolfed

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

açıklama

Giriş formu, yıl / ay / hafta içi gününün doğrudan geçirilebileceği şekilde seçilmiştir DTREAD; bu, bir YYYY/MM/DDdizeyi ayrıştıran ve yılı / ay / günü sayı olarak döndüren ve haftanın gününü hesaplayan bir işlevdir .

Ancak, DTREADayın gününü beklediğinde, bunun yerine haftanın gününü verdiğimizi unutmayın. Bu, işleri karmaşıklaştırır, ancak daha az giriş değeri olduğu ve /01tarih dizesinin sonuna eklememiz gerekmediği anlamına gelir .

DTREADçıkışlar Wve D.
Whafta içi ve Dgün-of-the-hafta Wayın inci günü.
(Yani, 7hafta içi olarak girerseniz , haftanın 7 günü, haftanın her günü Dolacak 7ve Wolacaktır)

İfade (5-W+D*2)MOD 7, ayın 0 dizinli günü olarak, giriş gününün 1. gününü almak için kullanılır. (Bunu çoğunlukla deneme yanılma yoluyla anladım)

Bundan sonra, program sadece ekler WEEK*7.


Gerçekten "haftanın günü" ve "ayın günü" için ayrı kelimeler olmasını diliyorum.


2

Perl 6 , 52 48 bayt

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

Çevrimiçi deneyin!

Yıl, ay, haftanın günü (Pazar 0'dır) ve hafta numarası (0 dizinli) olarak giriş alan anonim kod bloğu. Çıktı bir tarih nesnesidir.

Eski Açıklama:

{                                                  } # 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

Hafta sayısının 1 endeksli olması gerektiğini düşünüyorum
12Me21

@ 12Me21 Soru, girdinin esnek olduğunu söylüyor, ancak hafta sayısını 0 olarak dizine ekleyip eklemediğimizi sordum
Jo King

Bu, diğer aylar için işe yaramıyor gibi görünüyor. Sanırım ihtiyacın var $^c+4-$!.daycount.
nwellnhof

@nwellnhof Ah, bunu deneme yanılma yerine düşünmeliydim, lol. Şimdi düzeltilmelidir
Jo King

1

MATL , 28 27 bayt

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

Bu üç giriş kullanır:

  • Ay ve yıl içeren dize: 'March 2019'
  • İlk harfi büyük, haftanın gününü gösteren üç harfli dize: ' Sat'
  • Numara: 2.

Çıktı, çizgilerle ayrılmış gün, yıl ve ay içeren bir dizedir 09-Mar-2019.

Çevrimiçi deneyin!

açıklama

Girişlerini düşünün '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'

1

Python 3 , 92 82 bayt

@Jo King sayesinde 82 bayt

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

Çevrimiçi deneyin!

Orijinal sürüm, 92 bayt

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

Çevrimiçi deneyin!

Yılı tamsayı, ay 1 dizinli tamsayı, haftanın gününü Pazartesi 0ve Pazar günleri 0 dizin tamsayı olarak alır6 0 dizinli bir tam sayı ve ayın haftasını 1 dizinli tamsayı olarak alır.

Nasıl çalışır:

# 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]

1

R , 72 69 bayt

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

Çevrimiçi deneyin!

Girdi olarak alınıyor:

  • Yıl sayısı
  • Ay sayısı (1-12)
  • Geçerli yerel ayardaki hafta içi dize (TIO, büyük harfle İngilizce adı gerektirir)
  • Sıra numarası (1 dizinli)




0

Kırmızı , 64 60 bayt

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

Çevrimiçi deneyin!

Yılı, ayı ve haftanın gününü sayı olarak alır, 1 endeksli, Pazartesi haftanın ilk günüdür.


ha, to-datebir şey. belki bu christmase arifesinde biçim meydan okuma yararlı olacaktır
sadece ASCII sadece

@ ASCII-only Bu nowmeydan okuma için kullandık
Galen Ivanov

1
evet, ama alternatif yöntemler düşünüyordum (yani, <tekrar " Eve"tarih2-tarih1 kez> yöntem iirc)
sadece ASCII-sadece

Sadece ASCII>> 25-Dec-2019 - 1-1-2019 == 358
Galen Ivanov

0

APL (Dyalog Unicode) , 36 bayt SBCS

Tam program. İstemleri[year,month] (1 Ocak), o zaman gün için (Pazar 0), sonra n için (ilk 1'dir).

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

Çevrimiçi deneyin!

⎕CY'dfns'c o pdfns kütüphanesinde y

 bunun sonucunu ... lehine çevir

 istemi konsolu [year,month]numaralar

days0'ın 1899-12-31'inden beri [c]  gün [n] th o ayın

(⍳31)+ ekle i ntegers 1 ... 31 buna

d← depolamak d ( d numaraları için)

7| 7'ye bölünürken kalan bölüm (haftanın günü, iyi dönem nedeniyle Pazar 0 olur)

⎕= haftanın gün sayısı için komut istemi konsolu ve haftanın gün sayılarına eşit olduğunda maske al

d/⍨ filtre dbu maske ile

⎕⊃ n için bilgi istemi konsolu ve bunu gün numaraları listesinden seçmek için kullanın

date[c]  datetime damgası [n] (saat, dakika, saniye, milisaniye boyunca sıfırlar var)


Kod için [c] ve notlar için [n] öğesine tıklayın .


0

JavaScript (ES6), 49 48 bayt

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>

Parametreleri olarak alır f([year, month], day, number). Ay ve haftanın günü (Pazar günü başlar) sıfır endekslidir. Düzenleme: @Shaggy sayesinde 1 bayt kaydedildi.


Haftanın günü Pazar-Cumartesi veya Pazartesi-Pazar biçiminde mi?
Cehalet

@EmbodimentofIgnorance Üzgünüm, bir şeyleri unuttuğumu biliyordum. (Snippet artık kolaylaştırmak için select kullanıyor.)
Neil

@EmbodimentofIgnorance, Pazar 0JS'de.
Shaggy

Ah. Bunu bilmiyordum, Javascript'e aşina değilim.
Cehalet


0

TSQL, 106 bayt

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

Çıktı:

2019-03-09 00:00:00.000

Denemek


0

Kotlin , 131 84 bayt

Yalnızca ASCII'nin kodu ve yorumu sayesinde 47 bayt.

Girdi: yıl, aySayı, hafta içiSayı, haftaSayı

Tek satırda 1 ile maksimum arasındaki tam sayılar. Hafta içi gün sayısı 1 ile Cumartesi günleri arasında 7'dir. Kendi tarihlerinizi denemek için giriş metin kutusuna argümanlarınızı girebilirsiniz.

Çıktı: Bir Date sınıfı örneği. Ana program sonucu aşağıdaki gibi görüntüler: Cts Mar 09 00:00:00 UTC 2019.

Daha fazla bilgi edinmek isteyenler için kodu açıklayan yorumların bulunduğu genişletilmiş bir sürüm var.

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

Çevrimiçi deneyin!


1
74 - Scala ve Groovy cevaplarıyla aynı yöntemi kullanıyor
sadece ASCII sadece


1
Artık içe aktarma komutuna gerek yok, bu yüzden bu bir sorun değil: P
sadece ASCII sadece
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.