Bugün merkez


36

Herhangi bir uygun formatta girdi olarak bir tarih verildiğinde, beş haftalık bir pencerenin tam merkezi olarak o tarihe sahip bir takvim çıkarın. Takvimin başlığı haftanın günleri için iki harfli kısaltmalar içermelidir (örn Su Mo Tu We Th Fr Sa.). Günlerin üç harfli veya diğer kısaltmalarına izin verilmez.

Örneğin, April 2 2019girdi olarak verilen çıktı

Sa Su Mo Tu We Th Fr
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31  1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19

Böylece verilen tarih takvimin tam ortasıdır.

Verilen February 19 2020, çıktı

Su Mo Tu We Th Fr Sa
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
 1  2  3  4  5  6  7

Bunun için September 14 1752aşağıdakileri gösterin:

Mo Tu We Th Fr Sa Su
28 29 30 31  1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  1

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Girişi (yani aldığınız asla boş olmayan ve geçerli garanti ""veya Feb 31vs.).
  • Tüm tarihler için Gregoryen takvimini varsayalım.
  • Artık yıllar hesaba katılmalıdır.
  • Girdi tarihleri arasında değişecektir Jan 1 1600için Dec 31 2500.
  • STDOUT'a yazdırabilir veya işlev sonucu olarak geri döndürebilirsiniz.
  • Tam bir program veya bir işlev kabul edilebilir.
  • Karakterler uygun şekilde hizalandığı sürece herhangi bir miktarda boş boşluk kabul edilebilir.
  • Tek basamaklı günlerde, yalnızca tek basamaklı günleri sola yaslanacak şekilde hizalayarak, önde gelen sıfırlara izin verilir.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Yanıtlar:


12

R , 77 72 bayt

function(d,`~`=format)write(c(strtrim(d+-3:3~"%a",2),d+-17:17~"%e"),1,7)

Çevrimiçi deneyin!

2 harfli gün kısaltmaları kullanmak için çıktı düzeltildi.

Aaron Haymanstrtrim sayesinde -1 bayt .

Pedler tarih numaralarını önde gelen 0'larla; girişini Datekullanarak oluşturulabilen bir girdi olarak alır as.Date("YYYY/MM/DD").

Bir R bilim cevabı için oldukça kısa ...


8

05AB1E , 175 174 172 171 160 bayt

¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»

Formatta giriş yapın [day, month, year]. Önde gelen çıkış 0tek basamaklı gün s ve küçük harfli moyoluyla su(harfler büyük temsili ise + 1 bayt eklenebilir).

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Kahretsin .. Bu benim en uzun 05AB1E cevabı için yeni rekorum olabilir ve daha sonra yaptığım çok karmaşık bazı zorluklarını da dahil ediyorum ...>.> EDIT: Hmm, tamam ..; p

Önemli not: 05AB1E, Date nesneleri veya hesaplamaları için yerleşiklere sahip değildir. Sahip olduğu tarihlerle ilgili tek yerleşik bugünün yılı / ay / gün / saat / dakika / saniye / mikrosaniyedir.

Bu nedenle, gördüğünüz kodların neredeyse tümü önceki ve sonraki günleri hesaplamak için manuel hesaplamalar (yıllar boyunca geçiş ve artık yılları akılda tutmak dahil) ve Zeller'in uyumunu kullanarak haftanın gününü hesaplamaktır .

Kodun büyük kısımları, aşağıdaki açıklama için de geçerli olacak olan 05AB1E'nin önceki bu cevabından kopyalanmıştır .

Açıklama:

Bir önceki ayın ilk gününe giderek başlarız:

¦          # Remove the first item (the days) from the (implicit) input
 W         # Get the minimum (without popping the list itself)
           # (since the year is guaranteed to be above 1599, this is the month)
  Θ        # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
   1š      # Prepend a 1 as list (so we now have either [1,1] or [1,0]
     -     # Subtract this from the month and year
      1š   # And prepend a 1 for the day
        V  # Pop and store this first day of the previous month in variable `Y`

Sonra o tarihi başlangıç ​​tarihi olarak kullanıp sonraki 100 günü hesaplarım:

тF    # Loop 100 times:
  Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
      #  Calculate the next day in line
      #  (see the linked challenge above for a detailed explanation of this)
   Y  #  And leave it on the stack
 })   # After the loop: wrap the entire stack into a list, which contains our 100 days

Sonra, giriş tarihi orta olarak, sadece giriş tarihinden önce 17 ve 17'den sonra giriş yapın:

DJ          # Duplicate the 100 dates, and join the day/month/year together to strings
  IJ        # Push the input, also joined together
    k       # Get the 0-based index of the input in this list
            # (the joins are necessary, because indexing doesn't work for 2D lists)
     18+    # Add 18 to this index (18 instead of 17, because the index is 0-based)
        £   # Only leave the first index+18 items from the 100 dates
     35.£   # Then only leave the last 35 items

Şimdi 35 günümüz var. Bir sonraki adım haftanın gününü hesaplamak ve çıktı tablosunun başlığını oluşturmaktır:

¬                # Get the first date of the list (without popping the list itself)
 .•4ιõ÷‡o‹ƶ¸•    # Push compressed string "sasumotuwethfr"
             2ô  # Split it into chunks of size 2
s                # Swap to get the first date again
 `UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
                 # Calculate the day of the week (sa=0; su=1; ...; fr=6)
                 # (see the linked challenge above for a detailed explanation of this)
  ._             # Rotate the list of strings that many times

Bu 05AB1E madenin ucu bakın (bölüm kompres dizeleri sözlükte parçası olmayan nasıl? ) Anlamak için .•4ιõ÷‡o‹ƶ¸•olduğunu "sasumotuwethfr".

Sonra, daha önce oluşturulmuş tarih listemize dayanarak masayı doldurmak için günler oluşturuyoruz. Hangi başlık ile birlikte birleşeceğiz. Bundan sonra nihai sonucu yazdırabiliriz:

s           # Swap to get the list of dates again
 €н         # Only leave the first item of each date (the days)
   T       # Take the divmod 10 of each
     J      # Join those divmod results together
            # (we now have leading 0s for single-digit days)
      «     # Merge this list together with the header list
       7ô   # Split it into chunks of size 7
         »  # Join each inner list by spaces, and then each string by newlines
            # (and output the result implicitly)

2
Bu çok büyük bir iş!
Luis Mendo

2
Evet, Java 05AB1E'yi geçiyor! : D İlk defa, sanırım ;-)
Olivier Grégoire

@LuisMendo Çoğu zaman son kez bağlantılı zorluklarla yapıldı, ama evet, çok fazla iş yapıldı ..;) Açıklama btw eklendi.
Kevin Cruijssen

@ OlivierGrégoire Şimdi aynı bye-count'uz. ;)
Kevin Cruijssen

@ OlivierGrégoire Ve şimdi yine daha düşük, üzgünüm. ; p
Kevin Cruijssen

6

JavaScript (ES6),  141  126 bayt

Neil'in cevabını ödünç .toUTCString().slice(0,2)alarak 15 bayt kurtarıldı

Bir Date nesnesi olarak girdi alır.

f=(d,n=0)=>n<42?(D=new Date(d-864e5*(24-n)),n<7?D.toUTCString().slice(0,2):(i=D.getDate())>9?i:' '+i)+`
 `[++n%7&&1]+f(d,n):''

Çevrimiçi deneyin!


Huh, ilk yazdığımda üçüncü test davası için kodumun başarısız olduğuna yemin edebilirdim ... iyi ki beni 52 byte kurtardı ...
Neil

4

JavaScript (Node.js) , 205 152 145 bayt

f=
d=>`012345`.replace(g=/./g,r=>`0123456
`.replace(g,c=>`${new Date(d-864e5*(24-c-r*7))[+r?`getUTCDate`:`toUTCString`]()}`.slice(0,2).padStart(3)))
<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

Çevrimiçi deneyin! Girişi JavaScript Date nesnesi veya zaman damgası olarak alır. Düzenleme: @EmbodimentofIgnorance sayesinde 1 bayt kaydedildi, bu da çıkışa izleyen bir yeni satır ekleyerek 7 baytı daha kaydetmemi sağladı. İlk başta aslında buggy olmayan davranışlar üzerinde çalıştığımı keşfettiğimde 52 bayt kurtardı ...


padStart(2)-> padStart(3), birleştirme dizesindeki boşluğu -1 bayt için kaldır
Ignorance uygulaması



2

Wolfram Dili (Mathematica) , 123 bayt

(s=#;Grid@Join[{StringTake[ToString@DayName[s~d~#]&/@Range[-3,3],2]},Partition[Last@d[s,#]&/@Range[-17,17],7]])&
d=DatePlus

Çevrimiçi deneyin!

Neden GridTIO'da çalışmadığını bilmiyorum ama bu kod çıktı veriyor

görüntü tanımını buraya girin

@DavidC 1 bayt kurtardı


Belki de Gridçalışmıyor çünkü TIO, fotoğrafınızdaki gibi öğeleri ortalayamıyor.
AdmBorkBork

@AdmBorkBork TIO'da böyle grafikler yüklemenin bir yolu var. Birisi geçen sene bana göstermişti sanırım. Ama nasıl yapacağımı hatırlayamıyorum ... Yani eğer birileri biliyorsa, bize bildirin!
J42161217

2

MATL , 34 33 31 bayt

YO-17:17+t7:)8XOO3Z(!1ew7XOU7e!

Çevrimiçi deneyin!

açıklama

YO       % Implicit input. Convert to date number. This is a single number
         % that specifies the date
-17:17   % Push [-17 -16 ... 16 17]
+        % Add to date number, element-wise. This gives a row vector of 35
         % date numbers centered around the input date
t        % Duplicate
7:       % Push [1 2 ... 7]
)        % Index into the 35-element vector. This keeps the first 7 entries
8XO      % Convert to day-of-week in 3 letters. Gives a 3-col char matrix
O3Z(     % Write char 0 (equivalent to space for display purposes) into the
         % 3rd column
!1e      % Tranpose and linearize into a row. This produces a string such as
         % 'Tu We Th Fr Sa Su Mo ', to be used as column headings
w        % Swap. This brings to top the row vector of 35 date numbers
         % computed from the input
7XO      % Convert to day-of-month. Gives a 2-col char matrix
U        % Convert each row to number
7e!      % Reshape into 7-row matrix and transpose
         % Implicit display. This prints the string with the headings and
         % the matrix. The latter has a minimum-one-space separation between
         % columns, so it is aligned with the headings

2

Java (JDK) , 149 bayt

d->{d.add(5,-24);for(int i=0,w;i<42;d.add(5,1))System.out.printf("%c%2s",i%7<1?10:32,i++<7?"SaSuMoTuWeThFr".substring(w=d.get(7)%7*2,w+2):d.get(5));}

Çevrimiçi deneyin!

Kredi



1
@KevinCruijssen Bekle ... ne? Seni kutlarım! Bunu yapmaya çalıştım, ama yapmanın bir yolunu bulamadım, ama sen yaptın! Çok güzel :-)
Olivier Grégoire

1
Belki ive bir jşekilde birleştirmek için daha fazla bir şey görürsünüz ? Ya j++%7<1?10:32da biraz sihirli büyü için kısa bir şey ? Ama bunu sana bırakacağım. İşe geri döneceğim lol. ;)
Kevin Cruijssen

1
Ah, elbette .. Güzel takım çalışması! ;) PS: wStand nerede duruyor? Neden hbaşlık için değil ?
Kevin Cruijssen

1
w" W eek günü" için @KevinCruijssen . Ayrıca, biraz bükülme, sadece (i%7+6)/7*22+10daha uzun olanın başını açabilir .
Olivier Grégoire

2

PHP ,197 189 187 bayt

for($d=date_create($argn)->sub($i=new DateInterval(P17D)),$i->d=1;$x++<35;$h.=$x<8?substr($d->format(D),0,2).' ':'',$d->add($i))$o.=str_pad($d->format(j),3,' ',2);echo wordwrap($h.$o,20);

Çevrimiçi deneyin!

Giriş STDINbir tarih dizesi gibidir. İle koş php -nF.

$ echo April 2 2019|php -nF cal.php

Sa Su Mo Tu We Th Fr 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31  1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 

Tüm test durumlarını doğrulayın

Veya sıfır dolgulu tek basamaklı 174 bayt .


1

Excel VBA, 190 159 bayt

Teşekkürler @TaylorScott

Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=day(v+y+(x-1)*7)
Next y,x
z=d()
End Function

Excel VBA için geçerli bir tarih dizesi biçiminde girdi alır (örneğin, 19 Şubat 2020; 2/19/2020; 19 Şubat-2019) ve üzerinde belirtilen takvimin üzerinde bir dizi döndürür.


Beyaz çözeltiyi bu çözümden kaldırarak bu çözümü Function z(i) Dim d(5,6) v=DateValue(i)-17 For x=1To 5 For y=0To 6 d(0,y)=Left(WeekdayName(Weekday(v+y)),2) d(x,y)=Day(v+y+(x-1)*7) Next y,x z=d() End Function
Taylor Scott

@TaylorScott Teşekkürler, yalnızca bu alanları otomatik olarak düzenleyen yerleşik düzenleyiciyi kullanıyordu.
william porter


0

T-SQL, 203 bayt

DECLARE @f date='2020-02-19'

,@ char(20)=0,@d char(105)=0SELECT
@=left(format(d,'D'),2)+' '+@,@d=right(d,2)+char(32-n%7/6*19)+@d
FROM(SELECT dateadd(d,number-17,@f)d,number n
FROM spt_values WHERE'P'=type)x ORDER BY-n
PRINT @+'
'+@d

Çevrimiçi sürüm biraz farklıdır, bu yayınlanan sürüm MS-SQL Studio Management'ta çalışır. Çevrimiçi sürümle karşılaştırıldığında 1 bayt kaydeder, ancak çevrimiçi doğru sonucu vermez

Çevrimiçi deneyin


0

Python 2 , 115 bayt

from datetime import*
d=input()
for i in range(42):print(d+timedelta(i-24)).strftime('%'+'da'[i<7])[:2]+i%7/6*'\n',

Çevrimiçi deneyin!

Buna izin verilip verilmediğinden emin değil ... formdaki STDIN'den girdi alıyor date(year, month, day). Bu aynı zamanda temsil edilebilir __import__('datetime').date(year, month, day). Bunlar gerçekten __import__('datetime').datenesneler.

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.