Les premiers mercredis
Votre tâche consiste à compter le nombre de mercredis qui tombent un premier jour du mois dans une année particulière. Par exemple, 7-13-16
c'est un premier mercredi. Par souci de cohérence, utilisez le calendrier grégorien pour toutes les dates.
Contribution
L'entrée dans votre programme / fonction sera d'un an (par exemple 2016
) et est flexible. L'année sera un nombre entier compris entre 1912 et 2233 inclus.
Sortie
La sortie est également flexible et devrait être le nombre de mercredis principaux (par exemple 18
).
Notation
C'est le code-golf donc le code le plus court en octets gagne!
Cas de test
entrée -> sortie
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18
Python 2,
95936867 octetsMerci à @Josay d'avoir joué au golf sur 1 octet!
Testez-le sur Ideone .
la source
0x10ea2c8dbb06c5619
au lieu de19501370182350951961
.big_constant//5**long_expression
mais comment diable êtes-vous venu avec cette constante et cette expression? C'est fou: DBrain-Flak ,
6588,2310,2308, 2290 octetsTout d'abord, je n'ai pas écrit près de 100% de ce programme, ce qui est probablement mis en évidence par l'énorme taille du programme. La plupart de ce code a été écrit par mon propre algorithme de golf Brain-Flak . Avec un script python supplémentaire, j'ai écrit pour l'inviter dans la bonne direction.
Essayez-le en ligne!
Bien que ce programme soit assez long pour le golf de code, il est vraiment assez court pour Brain-Flak. Actuellement, le record du monde pour la division entière est supérieur à 1000 octets.
Explication
L'algorithme est assez simple. Parce qu'il y a un nombre limité d'années disponibles (321), il pousse simplement les réponses dans l'ordre inverse sous l'entrée et utilise un algorithme de recherche pour trouver la bonne réponse. Bien que le codage en dur de toutes les 321 possibilités puisse sembler plutôt inefficace avec une tâche aussi complexe que celle-ci et un langage aussi ésotérique que le brain-flak, cela pourrait très bien être la meilleure solution. (Je prévois de le découvrir dans la semaine à venir).
Étant donné que la plupart des 321 nombres ont environ 18 en moyenne et qu'ils diffèrent très peu d'une année à l'autre au lieu de pousser tous les nombres individuellement, je pousse la première année (2233) normalement, puis je double et modifie un peu la valeur pour chaque année après. De cette façon, au lieu de payer pour pousser ~ 18 pour les 321 années, je ne paie que pour pousser ~ 2 pour chaque année.
Une fois que toutes les réponses ont été poussées, il soustrait 1912 de l'entrée
({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])
(cela peut être sous-optimal, j'ai réécrit l'optimiseur pour ignorer certaines valeurs que je pensais ne pas être optimales car les numéros de codage en dur sont un processus super-exponentiel et l'exécuter jusqu'à la fin peut avoir quelques jours).Il soustrait ensuite un du premier élément et fait apparaître le deuxième élément jusqu'à ce que le résultat atteigne zéro,
{({}[()]<{}>)}
.Il fait apparaître le zéro
{}
et tous les éléments sous l'élément supérieur({}<{{}}>)
.la source
n
etm
qui ont des longueursk
etl
, je suppose,n+m
auraient une longueurk+l
? Et alorsn*m
?n*m
seraitk+4m-4
oul+4n-4
. En effet, la multiplication est codée en dur. Nous poussons d'abord lesn
m-1
temps. Pour ce faire, nous avons besoin dek
symboles pour exprimern
et de2m-2
symboles pour exprimer les poussées (chaque poussée est composée de 2 symboles). Ensuite, nous passons desm-1
heures, ce qui nous coûte un supplément2m-2
(les pop coûtent également 2 symboles). Cela totalise àk+4m-4
. on peut aussi multiplierm*n
(propriété commutative) pour obtenirl+4n-4
. Le résultat sera le plus court des deux.+1
coûte 2,*2
coûte 4,*3
coûte 8,*4
coûte 12, ce qui est plus cher que*2*2
, donc cela ne vaut pas la peine (sur les nombres inférieurs à 1000, je n'en ai trouvé que 10 qui n'ont pas utilisé*2
: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135). Pour 1912, le mieux que j'ai pu faire était((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2
avec une longueur de 52.Bash + utilitaires communs, 39
Prend l'année en entrée comme paramètre de ligne de commande. Produit généralement des messages comme celui-ci à STDERR - Je pense que c'est légal selon cette méta-réponse :
Si vous souhaitez supprimer explicitement la sortie STDERR, vous pouvez le faire à la place pour un score de 43 :
la source
gd_GB.utf8
, où tous les noms de jours sont abrégésDi
.Octave, 86 octets
Ce n'est pas rapide, d'aucune façon. Mais ce n'est pas vraiment le but d'un golf de code, n'est-ce pas?
Octave peut suivre les dates par "numéro de date" - nombre de jours écoulés où le 1er janvier 0 est le jour 1. Selon cette mesure, le 3 janvier 1912 (le premier mercredi de notre série) est le jour 698 346. Commencez par là, et parcourez tous les 7 jours (tous les mercredis) jusqu'à la fin de 2233, et ajoutez 1 si l'année est l'année cible ET le mois-jour est premier.
la source
Python 2.7,
166,165, 150 octetsIl y a certainement place à amélioration ici. Je suis plutôt novice dans le golf en python. Cela utilise le
datetime
module. Il parcourt tous les jours de l'année en ajoutant un à un accumulateur s'il correspond au critère. Il imprime ensuite le résultat. La plupart des tâches lourdes sont dans le module, le code peut donc être assez mince.Un octet enregistré grâce à Morgan Thrapp et 15 octets enregistrés par Pietu1998 .
la source
n%x==0
surn%x<1
.-1
n'est pas nécessaire car lrange
'index de fin est exclusif. De plus, vous pouvez convertir lefilter
en un générateur.[0for x in range(2,n)if n%x<1]
any(...)
ouall(...)
au lieu denot filter(...)
.all
vous pouvez enregistrer tout un tas.c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
J, 44 octets
Je viens de découvrir que J a intégré des manipulations de date.
Usage
Des commandes supplémentaires sont utilisées pour formater plusieurs entrées / sorties.
Explication
la source
PowerShell v3 +,
9995 octetsApproche par force brute -
Prend l'entrée
$y
, boucle de1
à12
, stocke temporairement le mois dans$m
, puis boucle sur chaque prime de2
à31
. Pour chacun d'eux, nous construisons unGet-Date
de ce jour particulier, puis sélectionnons uniquement ceux avecDayOfWeek
-eq
ual à3
(c.-à-d., Mercredi). Encapsule tout cela dans une parenthèse pour formuler un tableau, et prend.Count
celui - ci.Alternativement, approche mathématique -
PowerShell v3 +, 105 octets
En fin de compte, c'est juste un cheveu plus long que l'approche par force brute, mais je l'inclus ici car cela peut être bénéfique pour les autres.
Prend à nouveau l'entrée
$y
comme l'année. Cette fois, nous effectuons des opérations strictement mathématiques basées sur le premier jour de l'année. Nous calculons d'abord le jour de la semaine et le stockons$a
pour une utilisation ultérieure. Cela indexe dans le premier tableau, ce qui nous donne le nombre qui est généralement correct. Nous devons ajouter à cela un deuxième indice selon qu'il s'agit d'une année bissextile potentielle, qu'il s'agisse d'un dimanche, d'un mardi, d'un mercredi ou d'un jeudi et en fonction de l'année.Ceci est basé sur l'observation suivante. La première colonne est le jour de la semaine du 1er janvier, la seconde est la sortie habituelle. À moins que l'année ne soit l'un des nombres intermédiaires, c'est plutôt le nombre en parens. La dernière colonne décrit le fonctionnement de l'indexation% 5.
Remarque: les deux supposent qu'il
en-us
s'agit du paramètre PowerShell actuel pour les informations de culture / date. Le formatage de la date et leDayOfWeek
nombre peuvent devoir être ajustés en conséquence pour d'autres variantes de culture.la source
Ruby, 83 + 15 (
-rdate -rprime
drapeaux) = 98 octetsEssayez-le en ligne! (Les modules importés sont en ligne car idk si je peux utiliser des drapeaux dans repl.it)
la source
JavaScript ES6,
187182181179 octets179 Échangé dans une boucle for pour la boucle while
181 Compacté le ternaire
182 Combiné les deux boucles
187
la source
Lot, 248 octets
Explication:
d
est le jour de la semaine, avec0
pour lundi, qui est commodément le 1er janvier 1912.l
est un indicateur indiquant si l'année est une année bissextile,1
pour 1912. Nous passons ensuite de 1913 à l'année d'entrée, en mettant à jour le jour de semaine et recalculer le drapeau de l'année bissextile au fur et à mesure. Enfin, nous utilisons le drapeau de l'année bissextile et le jour de la semaine pour indexer ce qui est en fait une déclaration de gros commutateur pour déterminern
le nombre de mercredis principaux. Mettren
à 20 et la décrémenter avec l'automne est cependant moins cher que d'utiliser la logique de contrôle de flux, mais le résultat est que si le 1er janvier d'une année non bissextile est jeudi ou dimanche, il y a 16 mercredis principaux et ainsi de suite pour les autres cas .la source
JavaScript ES6
206203199197 197195183182179Pas le plus court, mais le mieux que je puisse faire pour l'instant ... Suggestions de golf bienvenues ...
Changements:
3>=x?3-x:10-x
à6-(x+10)%7
, enregistrement: 3 Modifications des emplacements de déclaration;x=w.getDay();z=D(w,6-(x+10)%7)
avecz=D(w,6-(w.getDay()+10)%7)
, enregistrement: 4Z=0
de lafor
boucle à la déclaration Date et pousséz=D(w,6-(x+10)%7)
dans lafor
boucle pour ranger, sauvegarde: 2w=new Date(a,Z=0,1)
déclaration décalée enfor
boucle, fusion avec law
déclaration existante , sauvegarde: 2+!!
pour~~
réduire et toujours convertirp(d=1)
deNaN
à0
, permettant à la fonction Prime Test de continuer à fonctionner, économisant: 1W
,for
boucle redéfinie - en sens inverse à partir du 31 décembre, écriture de l'Date
objet en tant que variable distincte, puis réécriture de lafor
boucle dans l'eval
appel; enregistrement 3.@PandaCoder, je vous rattrape, mec!
la source
R,
149147 octetsTestez-le sur Ideone .
la source
Groovy, 126
Groovy n'a pas de validation de nombre premier, a dû le construire aussi.
la source