Aujourd'hui c'est le centre

36

Si vous avez entré une date dans n'importe quel format, créez un calendrier avec cette date au centre exact d'une fenêtre de cinq semaines. L'en-tête du calendrier doit inclure les abréviations de deux lettres correspondant aux jours de la semaine (c'est-à-dire Su Mo Tu We Th Fr Sa). Les abréviations de trois lettres ou autres jours ne sont pas autorisées.

Par exemple, April 2 2019en entrée, la sortie doit être

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

de sorte que la date donnée est le milieu exact du calendrier.

Compte tenu de la February 19 2020sortie

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

Pour September 14 1752, montrez ce qui suit:

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

  • L'entrée et la sortie peuvent être données par n'importe quelle méthode commode .
  • L'entrée est garantie non-vide et valide (c.-à-d. Que vous ne recevrez jamais ""ou Feb 31etc.).
  • Supposons le calendrier grégorien pour toutes les dates.
  • Les années bissextiles doivent être comptabilisées.
  • Les dates d'entrée vont de Jan 1 1600à Dec 31 2500.
  • Vous pouvez l’imprimer dans STDOUT ou le renvoyer comme résultat de la fonction.
  • Un programme complet ou une fonction sont acceptables.
  • Toute quantité d'espaces superflus est acceptable, à condition que les caractères s'alignent correctement.
  • Les zéros non significatifs des jours à un chiffre sont autorisés, de même que l'alignement des jours à un chiffre pour être aligné à gauche.
  • Les échappatoires standard sont interdites.
  • Il s’agit du donc toutes les règles de golf habituelles s’appliquent et le code le plus court (en octets) gagne.
AdmBorkBork
la source

Réponses:

12

R , 77 72 octets

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

Essayez-le en ligne!

Sortie fixe pour utiliser des abréviations de 2 lettres par jour.

-1 octet strtrimgrâce à Aaron Hayman .

Pads date les numéros avec les 0 premiers; prend une entrée en tant que Date, qui peut être créée en utilisant as.Date("YYYY/MM/DD").

Bizarrement court pour une réponse de R ...

Giuseppe
la source
8

05AB1E , 175 174 172 171 160 octets

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

Entrez dans le format [day, month, year]. Sortie avec les principaux 0s pour les jours à un seul chiffre, et minuscule mopar su(1 octet peut être ajouté si titlecase est obligatoire).

Essayez-le en ligne ou vérifiez tous les cas de test .

Putain de merde… C'est peut-être mon nouveau record pour la réponse la plus longue 05AB1E, puis j'inclus quelques défis très complexes que j'ai rencontrés dans l' …>.> EDIT: Hum ok, presque…; p

Remarque importante: 05AB1E ne contient aucune propriété intégrée pour les objets Date ou les calculs. Les seules dates intégrées sont les suivantes: année / mois / jour / heures / minutes / secondes / microsecondes.

Donc, à cause de cela, presque tout le code que vous voyez est un calcul manuel permettant de calculer les jours précédents et suivants (y compris la transition d’une année à l’autre et en gardant à l’esprit les années bissextiles), et de calculer le jour de la semaine en utilisant la congruence de Zeller .

Des parties énormes du code sont copiées à partir de ma précédente réponse 05AB1E , ce qui sera également pertinent pour l'explication ci-dessous.

Explication:

Nous commençons par aller au premier jour du mois précédent:

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

Ensuite, j'utilise cette date comme date de début et calcule les 100 prochains jours:

т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

Ensuite, avec la date d'entrée au milieu, je ne laisse que les 17 avant et 17 après cette date d'entrée de la liste:

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

Maintenant nous avons nos 35 jours. La prochaine étape consiste à calculer le jour de la semaine et à créer l'en-tête de la table de sortie:

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

Voir cette astuce de mes 05AB1E (section Comment chaînes Compresser ne font pas partie du dictionnaire? ) Pour comprendre pourquoi .•4ιõ÷‡o‹ƶ¸•est "sasumotuwethfr".

Ensuite, nous créons les jours pour remplir la table elle-même en fonction de notre liste de dates précédemment créée. Que nous allons fusionner avec l'en-tête. Après quoi, nous pouvons imprimer le résultat final:

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)
Kevin Cruijssen
la source
2
C'est une énorme quantité de travail!
Luis Mendo
2
Oui, Java bat 05AB1E! : D Première fois, je suppose ;-)
Olivier Grégoire
@LuisMendo Most a été réalisé la dernière fois avec le défi associé, mais oui, c'était beaucoup de travail ..;) Explication a été ajoutée.
Kevin Cruijssen le
@ OlivierGrégoire Maintenant, nous sommes les mêmes. ;)
Kevin Cruijssen
@ OlivierGrégoire Et maintenant, il est encore plus bas, désolé. ; p
Kevin Cruijssen
6

JavaScript (ES6),  141  126 octets

A sauvé 15 octets en empruntant .toUTCString().slice(0,2)à la réponse de Neil

Prend l'entrée en tant qu'objet 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):''

Essayez-le en ligne!

Arnauld
la source
Euh, j'aurais pu jurer que mon code avait échoué pour le troisième cas de test quand je l'ai écrit à l'origine ... eh bien, cela me sauve 52 octets ...
Neil
4

JavaScript (Node.js) , 205 152 145 octets

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>

Essayez-le en ligne! Prend la saisie en tant qu'objet Date ou horodatage JavaScript. Edit: 1 octet sauvegardé grâce à @EmbodimentofIgnorance, qui m’a ensuite permis de sauvegarder 7 octets supplémentaires en ajoutant une nouvelle ligne à la sortie. J'ai enregistré 52 octets lorsque j'ai découvert que je travaillais sur un comportement qui n'était pas vraiment un buggy au départ ...

Neil
la source
padStart(2)-> padStart(3), supprime l'espace dans la chaîne de jointure pour -1 octet
Incarnation de Ignorance
3

Perl 6 , 87 octets

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

Essayez-le en ligne!

Prend un Dateobjet, retourne une liste de lignes.

Nwellnhof
la source
2

Wolfram Language (Mathematica) , 123 octets

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

Essayez-le en ligne!

Je ne sais pas pourquoi Gridne fonctionne pas sur TIO mais ce code affiche cette

enter image description here

@DavidC enregistré 1 octet

J42161217
la source
Peut Grid- être que ça ne fonctionne pas parce que TIO ne peut pas centrer les éléments comme dans votre image?
AdmBorkBork
@AdmBorkBork Il existe un moyen de charger des graphiques comme celui-ci dans TIO. Quelqu'un m'avait montré l'année dernière, je pense. Mais je ne me souviens plus comment faire ... Alors, si quelqu'un le sait, faites le nous savoir!
J42161217 le
2

MATL , 34 33 31 octets

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

Essayez-le en ligne!

Explication

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
Luis Mendo
la source
2

Java (JDK) , 149 octets

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

Essayez-le en ligne!

Crédits

Olivier Grégoire
la source
1
159 octets
Kevin Cruijssen
1
@KevinCruijssen Attendez ... quoi? Je vous félicite! J'ai essayé de le faire, mais je n'ai pas trouvé le moyen de le faire, et pourtant vous l'avez fait! Très sympa :-)
Olivier Grégoire Le
1
Peut-être que vous voyez quelque chose de plus à combiner le iet en jquelque sorte? Ou quelque chose de plus court j++%7<1?10:32avec de la magie au niveau des bits? Mais je vous laisse ça. Je retourne au travail, lol. ;)
Kevin Cruijssen
1
Ah, bien sûr .. Beau travail d'équipe! ;) PS: Où est le wsigle? Pourquoi pas hpour en-tête?
Kevin Cruijssen
1
@KevinCruijssen wpour "jour de w eek". En outre, le peu de tournoiement ne peut que conduire à (i%7+6)/7*22+10ce qui est beaucoup plus long.
Olivier Grégoire Le
2

PHP ,197 189 187 octets

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

Essayez-le en ligne!

L'entrée est STDIN comme une chaîne de date. Courez avec 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 

Vérifier tous les cas de test

Ou 174 octets avec des chiffres simples et sans remplissage.

640 Ko
la source
1

Excel VBA, 190 159 octets

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

Prend une entrée sous la forme d'une chaîne de date valide pour VBA Excel (par exemple, 19 février 2020; 19/02/2020; 19 février 2019) et renvoie un tableau avec le calendrier donné centré sur celui-ci.

William Porter
la source
Vous pouvez obtenir cette solution jusqu'à 159 en supprimant les espaces de cette solution,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 Merci, utilisait uniquement l'éditeur intégré qui peuplait automatiquement ces espaces.
William Porter
0

Rouge , 153 131 octets

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

Essayez-le en ligne!

Galen Ivanov
la source
0

T-SQL, 203 octets

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 version en ligne est légèrement différente, cette version publiée fonctionne dans MS-SQL Studio Management. Il enregistre 1 octet par rapport à la version en ligne, mais ne donne pas le résultat correct en ligne

Essayez-le en ligne

t-clausen.dk
la source
0

Python 2 , 115 octets

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

Essayez-le en ligne!

Vous ne savez pas si cela est autorisé ... prend les données de STDIN dans le formulaire date(year, month, day). Cela peut aussi être représenté comme __import__('datetime').date(year, month, day). Ce sont vraiment des __import__('datetime').dateobjets.

Erik le golfeur
la source