Étant donné un an et un mois, découvrez le pourcentage de jours de travail au cours dudit mois. Les jours ouvrables sont du lundi au vendredi, sans égard aux jours fériés ou autres choses spéciales. Le calendrier grégorien est utilisé.
Contribution
Une année et un mois au format ISO 8601 (AAAA-MM). L'année a toujours quatre chiffres, le mois a toujours deux chiffres. L'année donnée ne sera pas antérieure à 1582.
Production
La sortie est le pourcentage de jours de travail (selon la définition ci-dessus) dans le mois donné, arrondi à un nombre entier. Aucun signe de pourcentage ou chiffre fractionnaire ne suit.
Échantillon 1
Input Output
2010-05 68
Échantillon 2
Input Output
2010-06 73
Échantillon 3
Input Output
1920-10 68
Échantillon 4
Input Output
2817-12 68
Une semaine s'est écoulée, une réponse a été acceptée. Pour les curieux, la taille des soumissions reçues lors de notre concours:
129 - Coque Z
174 - VB.NET
222 - C
233 - C
300 - C
Ainsi que nos propres solutions (non classées):
75 - PowerShell
93 - Ruby
112 - Coque Bourne
echo 100
Réponses:
Perl 64 bits, 67
68Perl 5.10 ou version ultérieure, exécutez avec
perl -E 'code here'
ouperl -M5.010 filename
Concessions sur la taille du code:
date
sortie ne commence pas par un S. majusculeLC_ALL=C
.2> /dev/null
si bouleversé.pour une raison quelconque, ma version deNécessite une version 64 bits dedate
considère 2817-12 un mois invalide. Qui savait, la nouvelle apocalypse GNU est attendue!date
pour les dates après 2038. (Merci Joey)la source
PHP - 135
Je l'ai fait en PHP car j'avais un problème similaire à traiter il y a quelques jours.
(Un peu) De manière plus lisible, et sans avis sur les constantes utilisées comme chaînes:
Ceci est rendu possible par un algorithme très simple pour calculer le nombre de jours de travail dans un mois: vérifiez la semaine du 29, 30 et 31 (si ces dates existent), et ajoutez 20.
la source
-R
, cette approche peut être golfée jusqu'à 86 octets (63,7%):$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
Voir les étapes de golf.<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 caractères
la source
Bash + coreutils, 82 octets
la source
Windows PowerShell, 80
la source
[int]
vraiment sûrs ? J'aurais tendance à croire que c'est des planchers.[int]1.5
et le[int]2.5
rendement2
. Ce comportement exact provoque souvent des problèmes dans les tâches où une division au sol est nécessaire (ce qui nécessite alors un supplément[Math]::Floor()
), mais dans ce cas, cela ne fait pas de mal et «arrondir à même» s'applique uniquement aux nombres dont la fin.5
ne peut pas se produire ici.[int]
dans PowerShell est généralement plus une conversion qu'un cast :-). Des choses comme le[int[]][char[]]'abc'
travail aussi que vous ne pouvez pas travailler dans de nombreuses autres langues.$input
->$args
enregistre un octet.D: 186 caractères
Plus lisiblement:
la source
Python - 142
Merci à fR0DDY pour le bit de calendrier.
la source
Ruby,
124119111Requiert Ruby 1.9 en raison de l'éclatement de l'année et du mois avant l'argument "jour" -1 et
?-
pour"-"
. Pour Ruby 1.8, nous devons ajouter 2 caractères:Edit : Rasez cinq personnages sur la base de l'aide de @ Dogbert.
Edit : Rasez huit autres personnages sur la base de l'aide de @ steenslag.
la source
'-'
pourrait être écrit comme?-
dans Ruby 1.9PHP 5.2, 88 octets
Bien que j'aie déjà joué à la solution de zneak jusqu'à 85 octets (je viens d'en trouver un de plus), voici la mienne:
je doute que je puisse presser encore trois octets ici.
prend l'entrée de STDIN: Exécuter avec
echo <yyyy>-<mm> | php -nR '<code>'
.La chaîne
$a
mappe les jours par mois (date(t)
) et le jour de la semaine du premier jour du mois (date(N)
: lundi = 1, dimanche = 7) au pourcentage de jours de travail-67;strtotime
convertit l'entrée en horodatage UNIX; le reste du code fait le hachage.+1 octet pour les anciens PHP 5: remplacez
N
parw
et$a=_...;
par$a="..."
.un autre +3 octets pour PHP 4: insérer
.-1
après$argn
.-5 octets pour PHP 5.5 ou version ultérieure (postdate le défi):
supprimez tout avant
echo
et remplacez$a
par"4444444255555236666304777411"
.la source
%7
au lieu de%28
.Rebol -
118113Non golfé:
la source
C #, 158 octets
Méthode anonyme qui renvoie le pourcentage requis.
Programme complet avec méthode non testée et commentée et cas de test:
Fonction alternative, qui ajoute des valeurs négatives au nombre de jours ouvrables, en changeant le signe dans le retour sans coût supplémentaire en octets:
la source
Oracle SQL, 110 octets
Il fonctionne avec l'hypothèse que les données d'entrée sont stockées dans une table en utilisant
date
le type de données, par exemplela source
APL (Dyalog Unicode) , 55 octets SBCS
Fonction de préfixe tacite anonyme.
⊂
joindre une date pour le traiter dans son ensemble(2 5)2{
…}¨
Appliquez la fonction suivante là-dessus, mais avec les arguments de gauche[2,5]
et2
:⎕CY'dfns'
copier la bibliothèque "dfns"⍵⊣
jeter le rapport en faveur de la date' '@5⊢
remplacer le 5ème caractère (-
) par un espace⍎
exécutez cela pour obtenir la liste à deux élémentscal
appeler la fonction de calendrier sur ce' ',
ajouter une colonne d'espaces à celle¯2⌽
faire pivoter les deux dernières colonnes (samedi) vers l'avant⍺↓
supprimer l'argument de gauche nombre de lignes (2, en-têtes) et de colonnes (si spécifié; 5 = sam + dim)↓
diviser la matrice en liste de lignes⍕
format (aplatit avec insertion de double interligne)⍎
exécuter (transforme les nombres de jours restants en une liste numérique plate)≢
compter ceux2÷/
divisez chaque paire (il n'y en a qu'une)100×
multiplier par cent.5+
ajouter un demi⌊
solEssayez-le en ligne!
la source
Perl 6 , 78 octets
Essayez-le en ligne!
la source