Tâche
Écrivez un programme ou une fonction qui calcule un nom de jour d'une semaine que l'utilisateur saisit.
Entrée sortie
L' entrée est une chaîne de caractères, YYYYMMDD
.
Exemple de valeurs d'entrée:
20110617: 17 juin 2011 19040229: 29 février 1904 06661225: 25 décembre 666 00000101: 1er janvier 0 99991231: 31 décembre 9999
Vous pouvez supposer que toutes les entrées sont valides. Notez que l' année zéro est valide.
La sortie est un entier entre 0
et 6
. Chaque entier représente un nom de jour de la semaine. Vous pouvez décider librement quel entier représente un nom de jour de la semaine, comme celui-ci
0: lundi 1: mardi 2: mercredi ... 6: dimanche
(dans l'ordre) ou celui-ci
0: lundi 1: mercredi 2: dimanche ... 6: samedi
(pas dans l'ordre).
Cas de test
Entrée Sortie hebdomadaire ([0..6 -> lundi..dimanche] est utilisé dans cet exemple.) 20110617 vendredi 4 19500101 dimanche 6 22220202 samedi 5 19000228 mercredi 2 19000301 jeudi 3 19450815 mercredi 2 19040229 lundi 0 19040301 mardi 1 17760704 jeudi 3 20000228 lundi 0 20000229 mardi 1 20000301 mercredi 2 20121223 dimanche 6 00000401 samedi 5 66660606 mercredi 2 59161021 samedi 5
Restriction
Vous ne devez utiliser aucun type de fonction / classe / ... lié à l'horodatage ou à la date, comme la Date
classe dans Java
/ JavaScript
/ ActionScript
ou la getdate
fonction dans PHP
.
Vous devriez utiliser le calendrier grégorien , qui est utilisé par de nombreuses personnes maintenant.
Bien sûr, le code le plus court gagne. Si deux codes ont la même longueur, alors le code avec les votes les plus élevés l'emporte.
(En raison: lorsqu'il y a plus de 5 codes qui ont plus de (ou égal) +1
votes.)
echo 4
.Réponses:
Ruby,
9592 caractèresMise en œuvre simple et simple de Ruby avec 0: lundi, ...
la source
PHP -
10197103125 caractèresCode
Remarque
Malheureusement, en raison du typage dynamique et faible de PHP, l'algorithme Sakamoto ne fonctionne pas correctement sans couvrir explicitement chaque opération de division.
la source
y+y/4-y/100+y/400
.y=4
dans ce cas, renvoie 4, au lieu des 5 correctsy+y/4+y/100+y/400
(où seuls les deux premiers termes entrent en jeu). C'est ce qui afflige ma réponse JavaScript. Est-il possible que des doubles soient créés au lieu des ints? (Mon PHP est trop faible pour le savoir.)C - 129
Cela abuse de la façon dont la division arrondit vers zéro, au moins sur mon système (Linux x86).
La constante magique,,
86400
sert à deux fins:Il se trouve également que c'est le nombre de secondes dans une journée.
la source
y+=m>2;
au lieu dem>2?y++:0;
et rasez quelques octets.Javascript,
126123 caractèresEn utilisant l'algorithme de Sakamoto avec 0 = dimanche:
Je soupçonne que les divisions peuvent s'effondrer, mais pour l'instant je ne le vois pas.
Edit: Amélioration des divisions (pas besoin
~~
quand vous le pouvez~
).la source
Python 2 ,
83116113 113109 octetsImplémente l'algorithme de Sakamoto . Suggestions de golf bienvenues. Essayez-le en ligne!
Edit:
j'aurais dû corriger cela il y a longtemps.-6 octets à partir des suggestions de Jonathan Allan +2 octets pour réellement réparer le code.la source
int('032503514624'[m-1])
sauve 6Perl - 110 octets
Voici une solution à exécuter avec perl -p source.pl OU perl -pe 'here-is-code'.
Copiez-collez simplement les cas de test dans stdin.
Cela semble être le seul code sans variables, constantes de chaîne et divisions.
la source
JavaScript (ES6), 73 octets (non concurrent)
Essayez-le
la source