Oggi è il centro


36

Data una data come input in qualsiasi formato conveniente, genera un calendario con quella data come il centro esatto di una finestra di cinque settimane. L'intestazione del calendario deve includere le abbreviazioni di due lettere per i giorni della settimana (ovvero, Su Mo Tu We Th Fr Sa). Non sono consentite abbreviazioni di tre lettere o di altri giorni.

Ad esempio, dato April 2 2019come input, l'output dovrebbe essere

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

in modo che la data indicata sia esattamente al centro del calendario.

Dato February 19 2020, output

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

Per September 14 1752, mostra quanto segue:

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

  • Input e output possono essere forniti con qualsiasi metodo conveniente .
  • L'input è garantito non vuoto e valido (cioè, non riceverai mai ""o Feb 31ecc.).
  • Assumi il calendario gregoriano per tutte le date.
  • Gli anni bisestili devono essere contabilizzati.
  • Le date di input variano da Jan 1 1600a Dec 31 2500.
  • È possibile stamparlo su STDOUT o restituirlo come risultato di una funzione.
  • È accettabile un programma completo o una funzione.
  • Qualsiasi quantità di spazio bianco estraneo è accettabile, purché i personaggi siano allineati in modo appropriato.
  • Sono consentiti zeri iniziali nei giorni a una cifra, così come l'allineamento dei giorni a una cifra da allineare a sinistra.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Risposte:


12

R , 77 72 byte

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

Provalo online!

Risolto il problema con l'uso delle abbreviazioni del giorno di 2 lettere.

-1 byte usando strtrimgrazie ad Aaron Hayman .

Pad numeri di data con 0 iniziali; accetta input come a Date, che può essere creato utilizzando as.Date("YYYY/MM/DD").

Stranamente abbreviato per una risposta R ...


8

05AB1E , 175 174 172 171 160 byte

¦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ô»

Inserisci nel formato [day, month, year]. Uscita con i principali 0s per giorni sola cifra e minuscole moattraverso su(+1 byte possono essere aggiunti, se Titlecase è obbligatorio).

Provalo online o verifica tutti i casi di test .

Merda .. Questo potrebbe essere il mio nuovo disco per la risposta 05AB1E più lunga, e poi includo alcune sfide molto complesse che ho fatto ...>.> EDIT: Hmm ok, quasi ..; p

Nota importante: 05AB1E non ha alcun builtin per oggetti Date o calcoli. L'unica funzione incorporata relativa alle date che ha è l'anno / mese / giorno / ore / minuti / secondi / microsecondi di oggi.

Pertanto, quasi tutto il codice che vedi sono calcoli manuali per calcolare i giorni precedenti e successivi (compresa la transizione negli anni e tenendo presente gli anni bisestili) e il calcolo del giorno della settimana utilizzando la congruenza di Zeller .

Parti enormi del codice vengono copiate da questa mia precedente risposta 05AB1E , che sarà rilevante anche per la spiegazione di seguito.

Spiegazione:

Iniziamo andando al primo giorno del mese precedente:

¦          # 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`

Quindi uso quella data come data di inizio e calcolo i prossimi 100 giorni:

т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

Quindi, con la data di input al centro, lascio solo il 17 prima e il 17 dopo quella data di input dall'elenco:

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

Ora abbiamo i nostri 35 giorni. Il prossimo passo è calcolare il giorno della settimana e creare l'intestazione della tabella di output:

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

Vedere questo 05AB1E punta del mio (sezione Come stringhe di comprimere che non fanno parte del dizionario? ) Per capire il motivo per cui .•4ιõ÷‡o‹ƶ¸•è "sasumotuwethfr".

Quindi creiamo i giorni per riempire la tabella stessa in base al nostro elenco di date creato in precedenza. Che uniremo insieme all'intestazione. Dopo di che possiamo stampare il risultato finale:

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
È un'enorme quantità di lavoro!
Luis Mendo,

2
Sì, Java batte 05AB1E! : D Prima volta in assoluto, immagino ;-)
Olivier Grégoire il

@LuisMendo La maggior parte è stata fatta l'ultima volta con la sfida collegata, ma sì, è stato un sacco di lavoro ..;) A proposito è stata aggiunta la spiegazione.
Kevin Cruijssen,

@ OlivierGrégoire Ora siamo lo stesso ciao-conteggio. ;)
Kevin Cruijssen il

@ OlivierGrégoire E adesso è di nuovo più basso, scusa. ; p
Kevin Cruijssen,

6

JavaScript (ES6),  141  126 byte

Hai salvato 15 byte prendendo in prestito .toUTCString().slice(0,2)dalla risposta di Neil

Accetta input come oggetto Date.

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

Provalo online!


Potrei giurare che il mio codice non è riuscito per il terzo caso di test quando l'ho scritto in origine ... beh, questo mi fa risparmiare 52 byte ...
Neil,

4

JavaScript (Node.js) , 205 152 145 byte

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>

Provalo online! Accetta input come oggetto Date o timestamp JavaScript. Modifica: salvato 1 byte grazie a @EmbodimentofIgnorance, che mi ha permesso di salvare altri 7 byte aggiungendo una nuova riga finale all'output. Ho salvato 52 byte quando ho scoperto che stavo lavorando intorno a comportamenti che non erano in realtà buggy in primo luogo ...


padStart(2)-> padStart(3), rimuove lo spazio nella stringa di join per -1 byte
Incarnazione dell'ignoranza il

3

Perl 6 , 87 byte

{~rotate(<Th Fr Sa Su Mo Tu We>,.day-of-week),|comb 21,($_-17..$_+17)>>.day.fmt('%2d')}

Provalo online!

Prende un Dateoggetto, restituisce un elenco di linee.



2

Wolfram Language (Mathematica) , 123 byte

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

Provalo online!

Non so perché Gridnon funziona su TIO ma questo codice genera questo

inserisci qui la descrizione dell'immagine

@DavidC ha salvato 1 byte


Forse Gridnon funziona perché TIO non può centrare gli oggetti come nella tua foto?
AdmBorkBork,

@AdmBorkBork C'è un modo per caricare elementi grafici come questo in TIO. Qualcuno mi aveva mostrato l'anno scorso, penso. Ma non ricordo come farlo ... Quindi, se qualcuno lo sa, faccelo sapere!
J42161217

2

MATL , 34 33 31 byte

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

Provalo online!

Spiegazione

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 byte

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));}

Provalo online!

Crediti



1
@KevinCruijssen Aspetta ... cosa? Mi congratulo con te! Ho provato a farlo, ma non sono riuscito a trovare un modo per farlo, eppure l'hai fatto! Molto bello :-)
Olivier Grégoire il

1
Forse vedi qualcosa in più per combinare il ie in jqualche modo? O qualcosa di più corto j++%7<1?10:32con un po 'di magia bit a bit? Ma te lo lascio. Torno al lavoro, lol. ;)
Kevin Cruijssen il

1
Ah, certo .. Bel lavoro di squadra! ;) PS: dove wsta la? Perché non hper l'intestazione?
Kevin Cruijssen,

1
@KevinCruijssen wper "day of w eek". Inoltre, il bit twiddling può solo portare a (i%7+6)/7*22+10che è molto più lungo.
Olivier Grégoire,

2

PHP ,197 189 187 byte

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);

Provalo online!

L'input è STDINuna stringa di data. Corri con 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 

Verifica tutti i casi di test

O 174 byte con cifre singole a spaziatura zero.


1

Excel VBA, 190 159 byte

Grazie @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

Riceve input sotto forma di una stringa di data valida per Excel VBA (ad es. 19 febbraio 2020; 19/02/2020; 19-febbraio-2019) e restituisce un array con il calendario specificato centrato su di esso.


Puoi ottenere questa soluzione fino a 159 rimuovendo lo spazio bianco da questa soluzione,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 Grazie, stavo solo usando l'editor integrato che popola automaticamente quegli spazi.
William Porter,

0

Rosso , 153 131 byte

func[d][s: d - 24 loop 7[prin[""copy/part system/locale/days/(s/10) 2]s:
s + 1]loop 5[print""loop 7[prin pad/left s/4 3 s: s + 1]]]

Provalo online!


0

T-SQL, 203 byte

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

La versione online è leggermente diversa, questa versione pubblicata funziona in MS-SQL Studio Management. Salva 1 byte rispetto alla versione online, ma non fornisce il risultato corretto online

Provalo online


0

Python 2 , 115 byte

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

Provalo online!

Non sono sicuro che ciò sia consentito ... accetta input da STDIN nel modulo date(year, month, day). Questo può anche essere rappresentato come __import__('datetime').date(year, month, day). Questi sono davvero __import__('datetime').dateoggetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.