quand est Thanksgiving?


38

Contexte

Certains jours fériés ont des dates fixes et faciles à retenir, comme le 31 octobre, le 25 décembre, etc. Certains veulent cependant être gênants. Ils sont spécifiés comme des choses comme "le premier lundi de septembre" ou "le quatrième jeudi de novembre". Comment suis-je supposé savoir quand c'est?

Tout ce que je sais, c'est que Thanksgiving approche à grands pas et j'ai donc besoin d'un programme pour m'aider à comprendre quand. Certaines personnes disent même que c'est demain , alors votre programme doit être aussi bref que possible pour que je puisse le retaper à temps.

Le défi

Créez un programme ou une fonction qui, pour une année comportant jusqu'à quatre chiffres (par exemple, 2015 ou 1984), affiche ou renvoie la date de Thanksgiving des États-Unis pour cette année. Thanksgiving est défini comme le quatrième jeudi de novembre selon la page Wikipedia . (Indice: cette page contient également des informations intéressantes sur le modèle de date.)

Entrée : un nombre décimal avec un maximum de quatre chiffres représentant une année à l'ère commune (CE). Exemples: 987, 1984, 2101

Sortie : la date, y compris le mois et le jour, à laquelle Thanksgiving tombe ou tomberait s'il existait cette année-là. Cela peut être dans n'importe quel format raisonnable; utilisez votre meilleur jugement. Utilisez le calendrier grégorien dans tous les cas, même s'il n'était pas utilisé à ce moment-là.

(Remarque: assurez-vous de bien gérer les années bissextiles!)

Cas de test Entrée 1:

2015

Sortie 1:

Nov 26

Entrée 2:

1917

Sortie 2:

Nov 22

Notation

Les soumissions seront notées en octets . Je recommande ce site Web pour garder une trace de votre nombre d'octets, bien que vous puissiez utiliser n'importe quel compteur.

Bonus

-25% de votre score si vous traitez les dates de BCE comme des nombres négatifs (par exemple, -480 serait l'année de la bataille de Thermopyles).

Entrée de test élémentaire négative:

-480

Sortie correspondante:

Nov 25

C'est du , donc le score le plus bas gagne!

Edit: Je marque la soumission TI-BASIC de Thomas Kwa comme acceptée. Ne laissez pas cela vous décourager de soumettre de nouvelles entrées!

Classements

Voici un extrait de pile permettant de générer un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:

# Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


25
Pour tous ceux qui se demandent quand Thanksgiving arrivera cette année: Thanksgiving sera demain.
TheNumberOne

6
Mais j'ai eu l'action de grâce le 10 octobre? Je suis désolé de dire que votre question est en retard.
JimmyJazzx

5
@Downgoat Utilisez le compteur d'octets de votre choix. C'est juste celui que j'utilise personnellement et que je recommanderais.
mardi

22
"Certains jours fériés ont des dates fixes et faciles à retenir, comme le 31 octobre au 25 décembre". Ces exemples sont faciles à retenir car ils sont vraiment le même jour: octal 31 == virgule 25. ;-)
Adrian McCarthy

7
Pour une réponse qui fait le bonus, devrait-il y avoir une année 0 entre -1 et 1 ou pas?
Feersum

Réponses:


40

TI-BASIC, 15 octets * 0,75 = 11,25

Testé sur ma calculatrice TI-84 +

1129-dayOfWk(Ans+ᴇ4,9,1

Les remerciements ont lieu le 29 novembre, moins le jour de la semaine du 1er septembre, où 1 est le dimanche et 7 le samedi. Cette sortie dans le format MMDD.

Les cas de test: 2015-> 1126, 1917-> 1122, -480-> 1125ont été vérifiés. TI-BASIC semble utiliser le calendrier grégorien pour toutes les dates.

TI-BASIC ne prend pas en charge les années négatives, mais cela donne un bonus car nous ajoutons 10000 à l’entrée. Comme le calendrier grégorien a une période de 400 ans, cela ne change pas le jour de la semaine.


5
Merde sainte. xD Je n'aurais jamais pensé que cela aurait fonctionné de la sorte, +1.
Addison Crump

Bonne idée d'ajouter 10000. Bien.
agtoever

Je compte 23 lettres. Comment cela peut-il être 15 octets?
Stephan Schinkel

1
@StephanSchinkel TI-BASIC utilise des jetons qui sont stockés dans la mémoire de la calculatrice. Je crois que tous les caractères ici sont d'un octet, à l'exception des jetons dayofWK(, Ansqui ont chacun 2 et 1 octets.
FryAmTheEggman

Vous l'avez testé sur une calculatrice? sensationnel.

23

PHP, 65 48 42 41 36 (+2 pour -F) = 38 octets

<?date(Md,strtotime("4thuXI$argn"));

Prend l'entrée comme premier argument de ligne de commande. Fonctionne avec des avertissements, qui sont acceptables selon nos règles. Estampes NovDD, où DDest le jour de Thanksgiving.

Aucun lien en ligne, car ideone ne prend pas en charge les arguments de ligne de commande et je ne connais pas d'interprète en ligne capable de le faire.

Merci à Alexander O'Mara pour m'avoir appris un nouveau tour et surtout pour une réduction significative


2
C'est plus drôle que Mathematica.
lirtosiast

2
@Tryth encore plus court: "4thuXI". Vous pouvez même laisser l'espace entre les années "4thuXI2015".
Alexander O'Mara

1
En utilisant l'option de ligne de commande -F, l'entrée peut être raccourcie "4thuXI$argn".
primo

3
Attends, ça marche vraiment? C'est ... c'est juste ... je ne même pas ...
ETHproductions

1
Travaille pour moi . Pendant que j'y suis, Mdpas besoin de guillemets, avec E_NOTICEhandicapé.
Primo

18

Mathematica, 59 38 octets

DayRange[{#,11},{#,12},Thursday][[4]]&

+1 malin. Il y a aussi WolframAlpha["Thanksgiving " <> #] &où la date est entrée sous forme de chaîne.
DavidC

WolframAlpha est de retour aux États-Unis à partir de 1863 (date à laquelle Lincoln l'a déclaré le dernier jeudi de novembre). Les États-Unis ont
célébré

@DavidCarraher Cependant, le PO indique que le programme doit fonctionner pendant au moins 0 - 9999 CE
LegionMammal978

17

JavaScript (ES6), 42 40 31 octets - 25% = 23,25

a=>28.11-new Date(a,8).getDay()

Depuis la date "peut être dans n'importe quel format raisonnable", cette fonction utilise DD.MM. J'ai écrit une réponse TeaScript avec une technique différente, mais cette formule était plus courte.

Explication

Comme les mois sont à base zéro, new Date(a,10) retourne un Dateobjet représentant le 1er novembre de l'année spécifiée.

Depuis getDay()renvoie un nombre représentant le jour de la semaine à partir duquel 0..6nous voulons mapper

Su Mo Tu We Th Fr Sa 
0  1  2  3  4  5  6  
to to to to to to to
4  3  2  1  0  6  5  

puis ajoutez 22. Il se trouve que (11 - new Date(a,10).getDay()) % 7cela fera l'affaire. Comme @Thomas Kwa l’a fait remarquer, c’est la même chose que 28-new Date(a,8).getDay()28 moins le jour de la semaine du 1er septembre.


Belle solution, j'aime sa brièveté et le fait que c'est toujours plus compréhensible que la plupart des entrées.
Marko Grešak

16

Japt , 43 37 36 35 29 octets - 25% = 21,75

Japt est une version abrégée de Ja vaScri pt .

`{28.11-?w D?e(U,8).getDay()}

Hahaha, j'ai trouvé vraiment truc astucieux: l'interpréteur ignore les crochets dans les chaînes (utilisés pour insérer du code) tout en les décompressant afin de pouvoir compresser tout le code source pour sauvegarder un octet>: D

Les deux ?s devraient être les Unicode Unprintables U + 0098 et U + 0085, respectivement.Essayez-le en ligne!

Après décompression, le code se présente comme suit:

"{28.11-new Date(U,8).getDay()}"

Ce qui évalue à:

""+(28.11-new Date(U,8).getDay())+""

Ce qui donne le bon résultat.

Utilise la technique d’intrépidcoder , sortie au format dd.mm. Prend correctement en charge les années négatives. Suggestions bienvenues!

Edit: À partir du 2 décembre, vous pouvez maintenant utiliser ce code de 11 octets (marquant 8,25 points ):

28.11-ÐU8 e

(J'aimerais tellement avoir implémenté cela plus tôt!)


Très bien fait.
mardi

C'est maintenant plus long que JavaScript vanille. Thomas Kwa a une formule beaucoup plus courte .
Intrepidcoder

@intrepidcoder Merci, corrigé.
ETHproductions

12

Vitsy , 44 octets

Je calcule avec des mathématiques pures !

Golfé:

Ve2 * V2-V41m + Vaa * Dv1m-Vv4 * 1m + 7M-baa * / + N
/ D1M-

Ungolfed (a déplacé l'appel de méthode sur la première ligne pour le rendre lisible):

Ve2 * V2-V4 / D1M- + Vaa * Dv / D1M - Vv4 * / D1M- + 7M-baa * / + N

V Enregistrez l'entrée en tant que variable finale.
 e2 * Poussez 28 sur la pile.
    V Poussez l'entrée dans la pile.
     2- Soustraire deux.
       V4 / D1M - Obtenir le sol (entrée / 4).
              + Ajoutez-le au total.
               Vaa * Dv / D1M - Récupère le sol (entrée / 100) et économise 100 en tant que temp
                                    variable dans le processus.
                          - Soustrayez-le du total.
                           Vv4 * / D1M- Obtenir le sol (entrée / 400).
                                    + Ajoutez-le au total.
                                     7M Modulo par sept.
                                       - Soustrayez le résultat de 28.
                                        baa * / + Ajouter .11
                                              N Sortie sous forme de nombre.

Il y a probablement un meilleur algorithme pour cela (et c'est probablement horriblement joué au golf), mais pour ceux qui le demandent, mon algorithme vient d' ici .

Essayez-le en ligne!

Est-ce que je reçois des points bonus pour le calculer et avoir exactement 42 octets? Rêves ruinés.

Merci à @ Hosch250 de m'avoir signalé que je me trompais. : D Fixé.


2
Non, mais vous obtenez un +1 de ma part;)
Conor O'Brien

Il est dit que Thanksgiving en 2016 est le 28 novembre. C'est vraiment le 24 novembre.
Hosch250

@ Hosch250 Vous avez raison - corrigé maintenant.
Addison Crump

10

Python, 38 * 0,75 = 28,5 octets

lambda x:28.11-(x-2+x/4-x/100+x/400)%7

Cela fonctionne avec les années négatives de la manière spécifiée dans la question, bien que l’on ait attiré mon attention sur le fait qu’il n’ya pas d’année 0 dans le calendrier grégorien, ce comportement est donc un peu suspect.


1
Vous pouvez laisser tomber f=.
Feersum

1
Comment ça marche pour les dates négatives? Le modulo en Python s'applique-t-il aux négatifs? : O
Addison Crump

Il devrait être plus court pour utiliser des reps de chaîne,"Nov "+`...`
xnor

@VoteToClose Python modulo donne une réponse avec le même signe que le deuxième argument. Ainsi, -40%7==2mais-40%-7==-5
quintopia

@quintopia Attends, attends, je suis un idiot. D'accord. Ça a du sens.
Addison Crump

10

JavaScript (ES6), 43,5

Le nombre réel d'octets est de 58. Le bonus de -25% s'applique => 58 * 0.75 = 43.5

s=>new Date(s,10,(a=new Date(s,10).getDay())<5?26-a:a+21)

Assez droit et idiot comme cela pourrait être, sans solutions de contournement ou calculs compliqués.

De-golf (ES5) + démo:

function t(s) {
    a = new Date(s, 10).getDay();
    alert(new Date(s,10,a<=4?26-a:a+21))
}

t(prompt())

Notez que la nouvelle année 0-100 produit 1900-2000 ans. Cependant, il semble que 0-100 ans donnent la même date que 1900-2000, à en juger par les autres réponses.


Remplacer a+18par 22, car il est appelé uniquement dans "else", et "else" ne se produit que si a n'est ni supérieur ni inférieur à 4, c'est-à-dire exactement 4.


Remplacer a<4?26-a:a>4?a+21:22para<=4?26-a:a+21


2
Pardonnez-moi si je me trompe, mais n'est pas a<4?x:a>4?y:a+18équivalent à a<4?x:a>4?y:22?
ETHproductions

BTW, il me dit la mauvaise année pour toute entrée de 0 à 99. Je ne sais pas si cela compte, cependant.
ETHproductions

@Eth LOL bien sûr, vous avez raison, je ne pensais pas que
c'était

@Eth hm, 0 à 99 est en effet faux, laissez-moi essayer de résoudre ce problème.
nicael

@Eth Il semble que 0-100 donne la même date que 1900-2000, à en juger par les autres réponses.
nicael

8

TeaScript, 35 33 24 octets - 25% = 18

28.11-new D(x,8).getDay¡

C'est la même méthode que ma réponse JavaScript , qui utilise la formule intelligente de Thomas Kwa .

Version alternative avec explication

r(22,28)F(#/h/t(new D(x,10,l)))+'-11'

r(22,28)    // Range from 22 to 28
        F(    // filter, keeps elements for which the function returns true. 
          #    // Expands to function(l,i,a,b)
           /h/    // RegExp literal, Thursday is the only day with an 'h'.
              t(    // test, true if date string contains an 'h'.
                new D(x,10,l) // Create date object
                             ))+'-11' // Append '-11' for the month.

C'est 35 caractères, mais 36 octets pour ¡:)
nicael

@nicael Pas par ce site , ce n'est pas;)
ETHproductions

Hm, avoir 36 ans avec mothereff.in/… .
Nicael

@Downgoat utilise généralement ce format , dans lequel tous les caractères jusqu'à U + 00FF ont un octet.
ETHproductions

5

Jython, 141 155 octets

Utilise les classes Java Calendar et Scanner avec la syntaxe Python.

import java.util.Scanner as s;import java.util.Calendar as c
d=c.getInstance();k=s(System.in);d.set(c.YEAR,k.nextInt());d.set(c.DAY_OF_WEEK,c.THURSDAY)

Edit: Problèmes de syntaxe mineurs, 14 octets ajoutés.

Voir aussi ma version de Brainfuck .


5

Python, 83 81 78 octets

from datetime import*
lambda a:'Nov '+`((10-datetime(a,11,1).weekday())%7)+22`
  • -2 octets: ajout d'un nom à importer (merci @ Κριτικσι Λίθος)
  • -1 octets: remplacé par * import ** (merci @FryAmTheEggman)
  • -2 octets: changé en repr pour convertir le jour (merci @willem)

1
Juste une suggestion pour réduire le nombre d'octets: utilisez import datetime as det puis vous pouvez utiliser dpour chaque fois que vous utilisez datetimedans votre programme.
Kritixi Lithos

2
Vous pouvez aussi essayer des pandas. import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
Willem

@ ΚριτικσιΛίθος mais alors datetime.datetime ne serait que d.datetime, n'est-ce pas?
TanMath

2
from datetime import*est encore un peu plus courte, car vous aurez pas besoin de d.plus
FryAmTheEggman

5

Excel, 367 154 53 - 25% = 39,75 octets

Suppose que l'année est conservée dans la cellule A1, au format Date. Renvoie le nombre entier du jour de novembre où Thanksgiving est tenu.

Cela ne représente que les années bissextiles normales. Cela ne tient pas compte du fait que les années 2100, 2200 et 2300 ne sont pas des années bissextiles.

Ceci est uniquement conçu pour fonctionner à partir de 1621 - c'est-à-dire depuis le début de Thanksgiving. (Bien que cela fonctionne certainement jusqu’à 0 après JC).

=IF(MOD(YEAR(A1),4)=0,IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

Joliment imprimé:

=IF(MOD(YEAR(A1),4)=0,
    IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),
    IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

Gah! Au lieu de faire un calcul basé sur le 1er janvier, puis de faire beaucoup de calculs d'année bissextile pour tenir compte du 29 février, j'aurais dû me baser sur les calculs du 1er novembre , mais rend l’implémentation dépendante du format de date par défaut de votre installation Excel. Cette version est conçue pour jj / mm / aaaa:

 =IF(WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy"))))<6,  
     1127-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))),
     1134-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))))

Et maintenant que j'ai fait le nécessaire pour obtenir un calcul concis en Smalltalk, il a été reporté dans Excel:

=DATE(A1,11,MOD(12-WEEKDAY(DATE(9600+A1,11,1)),7)+22)

(avec l'année toujours en A1, mais sous forme d'entier). Cela fonctionne même pour les années 2100, 2200 et 2300, pour toutes les dates à partir de 7700BC / E, en utilisant le tour de répétition de date de Thomas Kwa.


1
Lorsque j'essaie avec des dates antérieures à 1900, cela ne fonctionne pas dans ma copie d'Excel.
Angelo Fuchs

La version longue ne fonctionne pas aussi bien.
Angelo Fuchs

Pour les anciennes dates, utilisez le classeur Excel de l'utilisateur antérieur à 1900. < exceluser.com/downloads/examples/post_900_123/index.html >
Euan M

Des questions sur le fait que cela fonctionne de côté, je ne pense pas que vous soyez autorisé à produire uniquement la date de novembre; vous avez besoin d'un "nov" ou d'un "11" sous une forme ou une autre.
lirtosiast

@Thomas Kwa La date entrée est l'année, au format date. Le calcul calcule ensuite le jour de la semaine où tombe le 1er novembre, puis calcule la date du quatrième jeudi de novembre.
Euan M

4

PowerShell, 67 64 84 72 58 45 octets

param($a)'Nov';28-(date "00$a/9/1").DayOfWeek

Nous prenons notre entier d’entrée sous forme de $a, et produisons immédiatement Novune nouvelle ligne. Ensuite, nous prenons $aet nous y ajoutons des zéros et le 1er septembre avec 00$a/9/1avant de générer un nouveau dateet de déterminer ce DayOfWeekque c'est. Si le 1er septembre est un dimanche ( .DayOfWeekégal à 0), Thanksgiving est le 28. Si le 1er septembre est un lundi ( .DayOfWeekégal à 1), Thanksgiving est le 27. Etc. Ainsi, nous soustrayons ce jour de la semaine de 28pour sortir notre réponse.

La préparation à l'avance avec des zéros doubles correspond aux années à un ou deux chiffres sans interrompre l'analyse pour les années à trois ou quatre chiffres. Ne fonctionne pas pour les nombres négatifs, car .NET datetimene prend pas en charge les années inférieures à0 .

Merci à TessellatingHeckler et Toby Speight pour leur aide.


"{0:D3}/Nov/$_" -f $aest plus courte que "$($a.ToString("000"))/Nov/$_"et produit le même résultat, et je pense que vous pourriez utiliser à la 11place deNov
n0rd

@ nOrd Ah, excellent! Oui, Novc'était un vestige de l'époque où j'essayais de le faire reconnaître correctement les années à deux chiffres, alors je vais échanger ça aussi. Merci!
AdmBorkBork

@TessellatingHeckler Cette approche fonctionne, mais vous devez ajouter deux zéros pour tenir compte des années à un chiffre. Sinon, vous revenez au 20XX que j'ai rencontré. Merci pour l'aide - j'ai mis à jour la réponse.
AdmBorkBork

1
@TessellatingHeckler Sur mon système, au moins, entrer des années à un chiffre dans les date "11/1/$a"résultats Thursday, November 1, 2007 12:00:00 AM. En effet, nous ne modifions pas la propriété Calendar.TwoDigitYearMax . Par conséquent, lors de son analyse , nous sommes bloqués avec un double remplissage à zéro pour résoudre ce problème.
AdmBorkBork

C'est vrai. Double rembourrage c'est.
TessellatingHeckler

3

Golfscript, 25 * 0,75 = 18,75 octets

~.4/.25/.4/2---+7%28\--11

Ceci utilise la formule de Sakamoto pour le jour de la semaine. Comme il y a des gens qui font ça, le résultat est sous la forme dd-mm. Ma soumission précédente peut être trouvée ci-dessous:

~.4/.25/.4/2---+7%"Nov "28@-

3

TSQL, 478 296 octets

Juste pour les funsies. En règle générale, vous auriez un tableau dimensionnel de date pour simplifier, select * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'mais en l’absence de cela ...

create function a(@y varchar(4))returns date as begin declare @d date,@i int=0 set @d=convert(date,@y+'-11-01')declare @t table(d date,c int identity)while @i<28 begin if datepart(weekday,@d)=5 insert @t(d) select @d select @d=dateadd(d,1,@d),@i+=1 end select @d=d from @t where c=4 return @d end

Ungolfed:

if exists(select * from sys.objects where name='a' and [type]='FN') drop function a
go

create function a(@y varchar(4))returns date
-- select dbo.a('2015')
as
begin
    declare @d date,@i int=0;

    set @d=convert(date,@y+'-11-01'); -- cannot golf out dashes for dates <year 1000

    declare @t table(d date,c int identity)

    while @i<28 
    begin -- populate "November" array
        if datepart(weekday,@d)=5 insert @t(d) select @d -- assumes @@datefirst = 7
        select @d=dateadd(d,1,@d),@i+=1
    end;

    select @d=d from @t where c=4 

    return @d

end

Est-ce vraiment le chemin le plus court?
lirtosiast

Je suppose que je ne suis peut-être pas familiarisé avec les règles du code golf, mais la réponse crée un objet de base de données qui accepte les entrées et renvoie la sortie correspondant au PO. Il pourrait y avoir un raccourcissement évident si l'entrée pouvait être acceptée dans le code en ligne, mais c'était ma pensée pour le type d'objet de fonction. Je suis sûr que cela pourrait être joué plus loin dans les deux cas. @ThomasKwa, avez-vous des suggestions?
Peter Vandivier

Eh bien, il me semble que vous pourriez utiliser la formule mathématique pure mentionnée dans cette réponse et ne pas vous embêter avec tout ce que vous faites avec les objets date.
lirtosiast

Ce n’est pas une solution purement mathématique, mais la lecture de cette réponse m’a définitivement donné l’idée de jouer au golf 200 caractères. Merci!!
Peter Vandivier

(Je voulais dire (28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7) Ouais, lire d'autres réponses a tendance à beaucoup aider.
lirtosiast

3

Pyth, 30 28 * 75% = 21 octets

Je suis sûr à 100% que cela pourrait être raccourci, mais bon, c'est mon premier programme Pyth! \ o /

-28.11%+-+-Q2/Q4/Q100/Q400 7

Suite de tests

Affiche la date au dd.mmformat.

S'il vous plaît, suggérez des façons de jouer au golf si vous le pouvez! J'aimerais en savoir plus sur Pyth.


2

Exceller, 64 48

Année en A1

= DATE (A1,11, CHOISIR (JOUR DE LA SEMAINE (DATE (A1,11,1)), 26,25,24,23,22,28,27))

=DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22)

Comme Excel est basé sur la localisation et je voudrais tester cela. Veuillez expliquer ce que font les fonctions afin que je puisse choisir celle qui convient dans ma langue.
Angelo Fuchs

1
En outre, cela ne fonctionne pas pour les dates antérieures à 1900 (du moins dans ma copie d'Excel)
Angelo Fuchs

En outre, vous avez enregistré des 13octets TEXTdepuis =TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")- la sortie est un entier sans formatage.
user3819867

@ user3819867, voilà comment Excel stocke ses dates. le formatage est laissé à l'utilisateur
SeanC

@ AngeleloFuchs, DATE renvoie une valeur de date en utilisant l'année, le mois et le jour comme paramètres. MOD renvoie le reste d'une division (module). WEEKDAY renvoie le jour de la semaine d'une date (1 = dimanche, 2 = lundi, etc.).
SeanC

2

Befunge, 41 octets

47*&:::4"d"*/\"d"/-\4/++5+7%-" voN",,,,.@

Courez sur cet interprète .

Explication: Une année courante est 365 = 1 mod 7 jours, donc l'année plus tous les 4 e année, moins tous les 100 e ( den ascii) année, plus tous les 400 e années représente les jours bissextiles (y compris l'année actuelle). Le résultat de :::4"d"*/\"d"/-\4/++peut alors être pensé que 5 Mars e , le premier jour après Février tombe le même jour que le premier jour de l'année dans les années communes. Après que nous calibrons au modèle avec la 5+7%-soustraction d' un nombre de jours de la semaine du 28 e (le 47*stocké précédemment) Novembre. Puis imprimez.

Une version corrigée pour les années BC est actuellement plus longue que le bonus prévu, à 59 -25% = 44.25 octets:

47*&v
!`0:<+*"(F"_v#
" voN",,,,.@>:::4"d"*/\"d"/-\4/++5+7%-

2

Matlab, 78 octets

x=find(all(bsxfun(@eq,datestr(datenum(input(''),11,1:30),'ddd'),'Thu')'));x(4)

2

Ruby, 60 58 57 * 0,75 = 42,75 octets

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

58 octets

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

60 octets

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11,1).wday]+21}"}

Ungolfed:

-> y {
  puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"
}

Usage:

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

=> Nov 26

0

VBA, 124 octets * 75% = 93 octets

Function e(y)
For i = 1 To 7
x = DateSerial(y, 11, 21) + i
If Weekday(x) = 5 Then e = Format(x, "mmm dd")
Next
End Function

Je ne sais pas si les espaces comptent, c'est entre 102 et 124, n'hésitez pas à le modifier.
Si les entiers sont une sortie valide, je suis ravi de supprimer la Formatpartie.


Les espaces comptent; si elles sont inutiles pour le programme, vous pouvez les supprimer.
lirtosiast

0

PHP 5.3+, 59 octets

Cela utilise la fonction PHP intégrée strtotimepour analyser la date.

<?=gmdate('M d',strtotime("Next Thursday $_GET[Y]-11-19"));

Cela suppose que la valeur soit transmise au paramètre GET Y OU à php-cli Y=<year>.

Il essaie de trouver le prochain jeudi après le 19 novembre.
Jusqu'ici, avec les tests que j'ai faits, cela fonctionne bien.

Sachez que les années à deux chiffres peuvent être interprétées différemment.

J'utilise gmdatepour éviter les problèmes de fuseau horaire, mais cela fonctionne aussi bien en utilisant date(du moins, là où je vis).


1
Une réponse n'est pas un endroit approprié pour discuter de la validité d'une méthode de saisie. J'ai créé cette option dans la méta-publication d'E / S par défaut (afin que la communauté puisse voter) et déplacé votre conversation vers le chat . (CC @Mego)
Dennis

0

T-SQL 215 octets 248 * 0.75 = 186 octets

create function t(@y int)returns table return select x=convert(char(6),x,107)from(select x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)from(select d=21+n from(values(0),(1),(2),(3),(4),(5),(6))b(n))c)t where datepart(weekday,x)=5

Ungolfed

set nocount on;
if object_id('dbo.t') is not null drop function dbo.t
go

create function t(@y int)returns table return
    select x=convert(char(6),x,107)
    from (
        select
        x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)
        from (
            select d=21+n 
            from (values (0),(1),(2),(3),(4),(5),(6))b(n)
        )c
    )t
    where datepart(weekday,x)=5
go

qui avec cet échafaudage de test

select 
  [ 2015 = Nov. 26]=(select x from dbo.t( 2015))
 ,[ 1917 = Nov. 22]=(select x from dbo.t( 1917))
 ,[ 1752 = Nov. 23]=(select x from dbo.t( 1752))
 ,[ 1582 = Nov. 25]=(select x from dbo.t( 1582))
 ,[ 1400 = Nov. 27]=(select x from dbo.t( 1400))
 ,[ -480 = Nov. 25]=(select x from dbo.t( -480))
 ,[-5480 = Nov. 28]=(select x from dbo.t(-5480))
;
go

rendements comme souhaité

2015 = Nov. 26  1917 = Nov. 22  1752 = Nov. 23  1582 = Nov. 25  1400 = Nov. 27  -480 = Nov. 25 -5480 = Nov. 28
--------------- --------------- --------------- --------------- --------------- --------------- ---------------
Nov 26          Nov 22          Nov 23          Nov 25          Nov 27          Nov 25          Nov 28

0

Pike , 87 91 107 77 76 octets - 25% = 57

string t(int y){return"Nov "+((11-Calendar.Day(y,11,1)->week_day())%7+22);}

laisser l'ancien pour la comparaison parce que je le trouve plus intelligent en termes de tirer parti du module Calendrier, mais ce qui précède est beaucoup plus court.

string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}

Cela ne semble pas prendre d'entrée.
Peter Taylor

Ouais, j'ai été dérouté par cela, certaines solutions ont une définition de fonction et d'autres utilisent simplement une variable qui n'est définie nulle part, donc je ne suis pas sûr de ce que je suis supposé utiliser pour le décompte.
eMBee

Je pense que les réponses que vous voyez comme utilisant " une variable qui n'est définie nulle part " utilisent en réalité une syntaxe de déclaration de fonction très courte. Il y a une ou deux réponses qui utilisent des esolangs qui ont un traitement spécial pour stdin et sont donc favorables à l'écriture de programmes complets. Je ne connais pas Pike, mais si vous pouvez supprimer les blancs et abréger le nom de la fonction à obtenir, string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}cela compte pour 107 octets.
Peter Taylor

Je pensais en avoir vu quelques-unes qui n'étaient pas des déclarations de fonctions, mais elles semblent avoir été corrigées, seul l'exemple de smalltalk ne convient pas. si cela est valide, je pourrais raser encore 17 octets de celui-ci ...
eMBee

La version Smalltalk est écrite en tant que programme - en particulier une expression Workspace. On nous a dit que nous recevions une contribution plutôt que de la solliciter.
Euan M

0

Smalltalk - Squeak et Pharo , 69 57 54 49 35 34 33 32 à 25% = 24 octets

"Nov. N": 69B 49B (-25% = 36,75B)
11nn (anInt): 57 54 32B (-25% = 24B)

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn
 Methods Date>>y:m:d: and >>w created as duplicates 
 of year:month:day and weekdayIndex"
(12-(Date y:y m:11d:1)w)\\7+1122

Versions précédentes

11nn sortie

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn"
(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

"Year supplied as an integer value, y  
 Result provided as an integer value, d, prefixed by 11"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

Sortie novembre

"Year supplied as an integer value, y  Result provided as a string, 'Nov nn'"
'Nov ', (12-(Date year:y month:11 day:1) weekdayIndex\\7+22) asString

nn sortie

"Year supplied as an integer value, y  Result provided as an integer value, d"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+22

nb Ceci est fourni en tant que programme - en particulier une expression d'espace de travail - plutôt qu'en tant que méthode.

Il suppose que la saisie est une donnée (comme indiqué dans la formulation "étant donné une année comportant jusqu'à quatre chiffres". L'
inclusion de la déclaration et la saisie de la saisie ajouteraient 11 autres caractères:

|y|y:=2015.(12-(Date y:y m:11 d:1)w)\\7+1122

Merci à eMBee pour avoir montré comment supprimer encore un caractère: les espaces immédiatement avant le "w".

En fait, cela m'a inspiré pour essayer de supprimer les espaces avant "d:":
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
qui a fonctionné!


Selon la clarification de l'OP , la version du numéro de jour n'est pas valide.
Mego

Je suis d'accord - mais étant donné qu'il y a pas mal de versions avec un nombre de jours uniquement dans la liste, je les ai mises ici pour une comparaison de pommes à pommes
Euan M

0

GNU coreutils, 35 bytes

seq -f$1-11-2%g 2 8|date -f-|grep h

Il suffit de chercher un jeudi dans la semaine du 22 au 28 novembre. Exécutez-le dans les paramètres régionaux C ou POSIX, étant donné que jeudi est la seule abréviation du jour contenant un «h».


Voici une réponse plus intelligente, mais un octet plus long:

echo Nov $((28-`date -d$1-5-5 +%w`))

Nous récupérons le numéro du jour de la semaine d'une date dans une semaine assez arbitraire entre mars et septembre (le jour et le mois ont donc un chiffre chacun et nous ne sommes pas affectés par un jour bissextile possible). Nous choisissons le jour pour qu’il soit un dimanche ( %w==0) lorsque Thanksgiving aura lieu le 28. Nous pouvons ensuite soustraire cette valeur de 28 pour obtenir le jeudi approprié.


2
Cela fonctionne à moins que Sean Connery ne l'exécute.
bkul

0

TSQL, 53 52 octets

DECLARE @ CHAR(4)=2000

PRINT DATEADD(d,59,DATEDIFF(d,1,DATEADD(m,9,@))/7*7)

Violon

Calculant le lundi avant ou le 2 septembre et ajoutant 59 jours

(mieux que de calculer le lundi avant ou le 4 octobre et d’ajouter 31 jours car octobre est le 10ème mois et économiser 1 octet)


-1

Perl, 92 octets

use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print "Nov $_":0for 22..28

EDIT: format de sortie fixe, bug corrigé, par exemple résultat 2012, utilisé "pour" format plus court. Merci à msh210.


Ceci est plus court et fait la même chose: use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29. Mais les deux scripts souffrent des mêmes défauts: (1) ils n'impriment pas la représentation du mois comme il est requis; (2) leur sortie est incorrecte pour par exemple 2012.
msh210
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.