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 code-golf , 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
où N
est 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
var QUESTION_ID=64785,OVERRIDE_USER=45162;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Réponses:
TI-BASIC, 15 octets * 0,75 = 11,25
Testé sur ma calculatrice TI-84 +
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
->1125
ont é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.
la source
dayofWK(
,Ans
qui ont chacun 2 et 1 octets.PHP,
6548424136 (+2 pour-F
) = 38 octetsPrend l'entrée comme premier argument de ligne de commande. Fonctionne avec des avertissements, qui sont acceptables selon nos règles. Estampes
NovDD
, oùDD
est 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
la source
"4thuXI"
. Vous pouvez même laisser l'espace entre les années"4thuXI2015"
.-F
, l'entrée peut être raccourcie"4thuXI$argn"
.Md
pas besoin de guillemets, avecE_NOTICE
handicapé.Mathematica,
5938 octetsla source
WolframAlpha["Thanksgiving " <> #] &
où la date est entrée sous forme de chaîne.JavaScript (ES6),
424031 octets - 25% = 23,25Depuis 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 unDate
objet 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 duquel0..6
nous voulons mapperpuis ajoutez 22. Il se trouve que
(11 - new Date(a,10).getDay()) % 7
cela fera l'affaire. Comme @Thomas Kwa l’a fait remarquer, c’est la même chose que28-new Date(a,8).getDay()
28 moins le jour de la semaine du 1er septembre.la source
Japt ,
4337363529 octets - 25% = 21,75Japt est une version abrégée de Ja vaScri pt .
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:
Ce qui évalue à:
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 ):
(J'aimerais tellement avoir implémenté cela plus tôt!)
la source
Vitsy , 44 octets
Je calcule avec des mathématiques pures !
Golfé:
Ungolfed (a déplacé l'appel de méthode sur la première ligne pour le rendre lisible):
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é.
la source
Python, 38 * 0,75 = 28,5 octets
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.
la source
f=
."Nov "+`...`
-40%7==2
mais-40%-7==-5
JavaScript (ES6), 43,5
Le nombre réel d'octets est de 58. Le bonus de -25% s'applique => 58 * 0.75 = 43.5
Assez droit
et idiotcomme cela pourrait être, sans solutions de contournement ou calculs compliqués.De-golf (ES5) + démo:
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+18
par22
, 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:22
para<=4?26-a:a+21
la source
a<4?x:a>4?y:a+18
équivalent àa<4?x:a>4?y:22
?TeaScript,
353324 octets - 25% = 18C'est la même méthode que ma réponse JavaScript , qui utilise la formule intelligente de Thomas Kwa .
Version alternative avec explication
la source
Jython,
141155 octetsUtilise les classes Java Calendar et Scanner avec la syntaxe Python.
Edit: Problèmes de syntaxe mineurs, 14 octets ajoutés.
Voir aussi ma version de Brainfuck .
la source
Python,
838178 octetsla source
import datetime as d
et puis vous pouvez utiliserd
pour chaque fois que vous utilisezdatetime
dans votre programme.import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
from datetime import*
est encore un peu plus courte, car vous aurez pas besoin ded.
plusExcel,
36715453 - 25% = 39,75 octetsSuppose 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).
Joliment imprimé:
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:
Et maintenant que j'ai fait le nécessaire pour obtenir un calcul concis en Smalltalk, il a été reporté dans Excel:
(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.
la source
PowerShell,
676484725845 octetsNous prenons notre entier d’entrée sous forme de
$a
, et produisons immédiatementNov
une nouvelle ligne. Ensuite, nous prenons$a
et nous y ajoutons des zéros et le 1er septembre avec00$a/9/1
avant de générer un nouveaudate
et de déterminer ceDayOfWeek
que 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 de28
pour 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
datetime
ne prend pas en charge les années inférieures à0
.Merci à TessellatingHeckler et Toby Speight pour leur aide.
la source
"{0:D3}/Nov/$_" -f $a
est plus courte que"$($a.ToString("000"))/Nov/$_"
et produit le même résultat, et je pense que vous pourriez utiliser à la11
place deNov
Nov
c'é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!date "11/1/$a"
résultatsThursday, 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.Golfscript, 25 * 0,75 = 18,75 octets
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:la source
TSQL,
478296 octetsJuste 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 ...Ungolfed:
la source
(28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7
) Ouais, lire d'autres réponses a tendance à beaucoup aider.Pyth,
3028 * 75% = 21 octetsJe suis sûr à 100% que cela pourrait être raccourci, mais bon, c'est mon premier programme Pyth! \ o /
Suite de tests
Affiche la date au
dd.mm
format.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.
la source
Exceller,
6448Année en A1
= DATE (A1,11, CHOISIR (JOUR DE LA SEMAINE (DATE (A1,11,1)), 26,25,24,23,22,28,27))la source
13
octetsTEXT
depuis=TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")
- la sortie est un entier sans formatage.Befunge, 41 octets
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 (
d
en 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 la5+7%-
soustraction d' un nombre de jours de la semaine du 28 e (le47*
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:
la source
Matlab, 78 octets
la source
Ruby,
605857 * 0,75 = 42,75 octets58 octets
60 octets
Ungolfed:
Usage:
la source
VBA, 124 octets * 75% = 93 octets
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
Format
partie.la source
PHP 5.3+, 59 octets
Cela utilise la fonction PHP intégrée
strtotime
pour analyser la date.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
gmdate
pour éviter les problèmes de fuseau horaire, mais cela fonctionne aussi bien en utilisantdate
(du moins, là où je vis).la source
T-SQL
215 octets248 * 0.75 = 186 octetsUngolfed
qui avec cet échafaudage de test
rendements comme souhaité
la source
Pike ,
87 91 107 7776 octets - 25% = 57laisser 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.
la source
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.Smalltalk - Squeak et Pharo ,
6957544935343332 à 25% = 24 octets"Nov. N":
69B49B (-25% = 36,75B)11nn (anInt):
575432B (-25% = 24B)Versions précédentes
11nn sortie
Sortie novembre
nn sortie
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é!
la source
GNU coreutils, 35 bytes
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:
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é.la source
TSQL,
5352 octetsViolon
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)
la source
Perl, 92 octets
EDIT: format de sortie fixe, bug corrigé, par exemple résultat 2012, utilisé "pour" format plus court. Merci à msh210.
la source
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.