Solutions F # connues dans 140 caractères , et c'est un problème de code Rosetta .
Résultat requis sur stdout ou dans une variable de chaîne pour l'année d'entrée 2014
:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
Comme demandé, pour 1900:
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
Et 2000:
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Posé parce que les dates semblent faire ressortir la maladresse dans la plupart des langues. Plus que de permettre des bibliothèques de dates, j'espère les voir! Mais s'il est externe au langage de base, déclarez-le au nom du message (par exemple, C # + NodaTime de Jon Skeet).
Précisions:
- Années 1900 à 3015
- calendrier Grégorien
- S'il en est autrement, tout ce qui est conventionnel pour le Royaume-Uni / Londres.
- Un programme prenant un commutateur de ligne de commande ou stdin est très bien, produisant le résultat à stdout
- Une fonction prenant une valeur pour l'année et renvoyant une chaîne convient également.
Échappatoires standard exclues . Dans l'attente des solutions APL, J, K et de nouvelles bibliothèques de dates.
Réponses:
Dyalog APL avec cal de dfns , 19 octets
Mieux vaut tard que jamais!
Invite pour l'année, retourne la liste des dates au format aaaa md .
⎕
invite pour la saisie numérique et que ce soit l'argument gauche de la{
...}¨
fonction anonyme (trouvée ci-dessous) appliquée à chacun⍳12
les nombres de 1 à 12 (les mois)La fonction anonyme ci-dessus est la suivante:
⍺⍵,
ajouter les arguments de gauche et de droite (c'est-à-dire l'année et le mois)2↑
les deux premiers caractères de⊢⌿
la rangée la plus basse decal
le calendrier pour⍺⍵
argument de gauche et argument de droite (année et mois)TryAPL en ligne:
Revenez à cette page après avoir cliqué ici pour importer
cal
et ses dépendances.Cliquez ici pour exécuter les cas de test.
la source
+
-
<
≤
=
≥
≠
⌈
et⌊
fonctionnent avec des objets de date .Net .Rubis, 91 + 6 = 97
Ça marche assez bien.
select(&:sunday?)
est joli, et étonnamment,*' '
fait tout le formatage par lui-même.la source
chunk
au lieu degroup_by
.Bash 4.x + ncal, 57
Si les séparateurs de nouvelle ligne sont OK au lieu d'espaces, nous pouvons supprimer le
-n
commutateur et l'espace de fin de l'echo
instruction. Et je suppose que cela fonctionnera toujours sans le shebang, j'ai donc supprimé cela aussi:Script d'origine (73 octets):
Usage:
Remarque: les versions Bash antérieures à 4.0 omettent les zéros non significatifs des mois. Cela peut être corrigé avec l'ajout de 5 caractères en changeant
{01..12}
en`seq -w 1 12)`
. Celatail -c-3
peut également provoquer des problèmes sur certains systèmes où la sortie dencal
inclut des espaces de fin, mais je n'en connais aucun.la source
`…`
au lieu d'une bonne habitude$(…)
.#!/bin/bash
pour le golf.IBM DFSORT,
113 lignes de 71, 72 ou 80 caractèresLes deux réponses au format de sortie en colonnes ont résisté à l'épreuve du temps. Cela me donne une "boucle", en quelque sorte, dans la mesure où OUTFIL REPEAT = copie autant de fois l'enregistrement courant.
Technique différente pour arriver à la valeur, qui semble plus longue mais plus courte car je ne peux pas trouver de moyen inconditionnel pour gérer le 12e record de l'année suivante, et le rendre conditionnel signifie notamment
IFTHEN=(WHEN=
, deux fois et d'autres choses. Gagner sur les balançoires (le premier du mois est le moyen le plus simple de le faire) perdre beaucoup sur les ronds-points (exigences de syntaxe particulières).Cela utilise une fonction intégrée (toutes les fonctions de DFSORT sont intégrées) pour trouver le dernier jour du mois. Ajoute ensuite un jour (fonction) pour accéder au premier du mois suivant et utilise la fonction PREVDSUN pour obtenir le dimanche précédent (qui sera toujours le dernier dimanche du mois précédent, comme précédemment).
Lorsque vous transformez l'année (saisie) en une date valide, un numéro de séquence à deux chiffres est utilisé pour le mois, et cette valeur est également copiée pour le jour, car le point de départ n'a pas d'importance tant qu'il est valide, comme nous le sommes après le dernier jour du mois initialement:
5,2
est plus court queC'01'
.Voici le détail:
OPTION COPY - copie le fichier d'entrée dans la sortie
OUTFIL - pour permettre à plusieurs fichiers de sortie, avec une sélection et une mise en forme différentes, de produire des rapports formatés. Utilisé de préférence au plus court en
INREC
raison de l'utilisation deREPEAT=
.REPEAT = 12 - produit 12 copies de chaque enregistrement. Dans cet exemple, il ne peut y avoir qu'un seul enregistrement d'entrée (contrairement à la version précédente) en raison du SEQNUM.
5: - commencez à la colonne 5 du dossier.
SEQNUM, 2, ZD - numéro de séquence, commence par défaut à un, deux chiffres, "décimale zonée" (pour non signé, ce sera le même que le caractère).
1,8 - copiez les octets 1 de la longueur 8 vers l'emplacement actuel (9). En effet, le Y4T doit voir 8, sinon un format de date différent sera utilisé.
Y4T - date au format ccyymmdd (en raison du 8 immédiatement devant).
LASTDAYM - Dernier jour du mois (également possible de la semaine, du trimestre et de l'année).
TOJUL = - sortie date-conversion pour les fonctions de date (TOJUL est un caractère de moins que TOGREG)
9,7 - maintenant qu'il fait 7 longs, Y4T va être CCYYDDD.
ADDDAYS - ajoute un certain nombre de jours, s'ajustant automatiquement si le mois / l'année suivant (peut également être ADDMONS et ADDYEARS)
PREVDSUN - la date julienne entre en jeu, le dimanche précédent est localisé, TOGREG pour obtenir le format de sortie correct, avec le séparateur "-" (pourrait être tout ce que vous aimez comme séparateur)
12X - des blancs pour nettoyer le gâchis qui nous a permis de le faire en si peu de temps
Les résultats de ce qui précède, pour 2014, sont les suivants:
Quelque chose est nécessaire pour dire au SORT quoi faire. Il n'y a pas de défaut.
OPTION COPY
est le plus court,SORT FIELDS=COPY
est équivalent mais plus long.Le travail lui-même effectué cette fois-ci
OUTFIL
(pour permettre l'utilisation de REPEAT). Le code de travail est sans doute l'un de 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) ou 138 (70 + 68) (à l'exclusion des blancs de début, de la poursuite forcée et des blancs de fin).Étant donné que le récepteur devrait savoir ce qu'ils font, je pense que je peux dire que le code DFSORT pour répertorier le dernier dimanche de chaque mois pour n'importe quelle année à partir de 1900 (se déroulera à partir de l'année 0001, mais j'évite la recherche car bien) jusqu'à 9999 (bien que DFSORT prenne en charge les années jusqu'à 9999, la solution précédente ne fonctionnerait pas dans l'année 9999 puisque la 12e date va dans l'année suivante) peut être tweeté.
Pourquoi le code est-il si long, s'il existe des fonctions intégrées particulièrement adaptées?
Les définitions de champ sont éphémères. Un champ est uniquement défini comme un emplacement particulier dans les données (qui est un enregistrement) pour son utilisation immédiate. En d'autres termes, les champs ne sont pas définis en tant que tels, mais sont définis pour chaque utilisation et uniquement pour une utilisation. Les fonctions de date doivent savoir quels (parmi de nombreux) formats de date sont utilisés pour la source, et la sortie doit être dans un format de date, ce qui doit être spécifié.
Maintenant que nous avons une date julienne ... à confirmer?
En a besoin
JCL
Et un fichier d'entrée (une autre ligne de JCL et trois éléments de données instream):
Produit:
Fonctionnera réellement jusqu'à l'année 9999.
DFSORT est le produit de tri IBM Mainframe. Les données peuvent être manipulées, mais comme le tri est essentiel et que les tris sont souvent volumineux et de longue durée, les cartes de contrôle DFSORT n'ont pas de constructions en boucle, donc nous ne pouvons pas mettre un SORT dans une boucle. Rend les choses un peu longues pour des tâches comme le golf.
Pourquoi publier la réponse, c'est parce que DFSORT a une
PREVDday
fonction. Donc, dimanche dernier d'un mois est facile. C'est le dimanche précédent (PREVDSUN) jusqu'au premier jour du mois suivant.C'était aussi amusant de le faire dans un "opérande" (OVERLAY), un peu comme tout faire dans
sprintf
ou similaire.Ici, il n'est pas golfé:
Bien qu'il ne soit pas tout à fait abusif, il ne serait pas habituel de tenter de regrouper tout cela en un seul OVERLAY, et il y a des choses apparemment inutiles qui sont nécessaires pour que tout puisse aller dans un OVERLAY. Il y a de la place pour le golf, mais comme cela ne supprimerait qu'une seule ligne au maximum, je ne suis pas tenté.
L'INREC est traité pour chaque enregistrement.
OVERLAY permet de modifier le contenu d'un enregistrement existant. Si l'enregistrement est étendu au-delà de sa longueur dans le processus, ce n'est pas un problème.
1,4 est l'année qui vient. Il a un littéral de 0201, puis les 1,8 successifs le répètent 11 fois pour donner un long mandrin de 96 octets,
La douzième année du record actuel étendu est ajoutée à 1 et son mois est passé à 1 (janvier).
Les 10 mois restants sont passés de 3 à 11.
Ensuite, il y a 12, dans l'ordre inverse (en raison de la superposition) de ce type de chose:
Le n: est un numéro de colonne sur l'enregistrement. Le X insère un blanc. 89,8 prend les données de cette colonne / longueur, Y4T les traite comme une date CCYYMMDD, PREVDSUM fonctionne le dimanche précédent, TOGREG = Y4T (-) les affiche comme une date grégorienne CCYY-MM-DD.
Parce que vous obtenez des ordures si la source et la cible d'une partie particulière d'un OVERLAY se chevauchent de manière destructrice, la dernière
11:X,18,120,6X)
réorganisation et masque un peu le désordre.Les manuels et les documents peuvent être consultés à l' adresse : http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 et incluent le guide de programmation d'application DFSORT de 900+ pages.
Comme avec tous les produits IBM, tous les manuels sont disponibles gratuitement (à l'exception d'une quantité atrocement petite de très chers que seul un très petit nombre de personnes dans le monde prétendraient même comprendre).
Toutes les cartes de contrôle DFSORT doivent commencer par un blanc. La colonne 72 est uniquement utilisée pour la continuation (tout élément non vide fera l'affaire, mais * est conventionnel). La colonne 72 est suivie d'une zone de numéro de séquence qui est ignorée, ce qui fait que chaque enregistrement 80 octets.
Un autre couple de solutions à venir, peut-être.
la source
Bash, 63 octets
Production:
la source
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 octets-v
param todate
est spécifique à la date BSD. Cela fonctionne donc sur OSX, mais pas sur la plupart des Linux - cela devrait peut-être être indiqué dans la réponse.Python 2 - 189 octets
Entrez la date via STDIN.
Encore beaucoup de golf qui peut être fait. Le programme va un peu à la mer, juste pour le plaisir:
Remarques
zfill
n'est nécessaire pendant des années en raison de la plage d'entrée, ni de jours car ils seront toujours supérieurs à 20Python 2 - 106 octets
La solution pas aussi amusante:
calendar.monthrange
renvoie deux nombres: le jour de la semaine où le mois commence le (w
) et le nombre de jours du mois (n
). La solution est un peu contre-intuitive en raison d'une capture - le jour de la semaine retourné commence à 0 pour lundi , pas dimanche! Cependant, cela est compensé par le fait qu'iln
est basé sur 1.la source
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Modifier les problèmes de fuseau horaire fixe Peut être plus court s'il est récursif. Peut être.
la source
new Date(y,0,++i,9)
. En outre, cela échoue pour les années bissextiles 2100 et supérieures, car JS ne dispose pas d'informations sur ces années bissextiles et n'a donc pasFeb 29
du tout les années bissextiles pour 2100 et supérieures.new Date(2014,0,26,9)
un dimanche donnant uneISO
chaîne correcte ainsigetDay()
que0
.JavaScript, ES6,
222 219199 octetsJe n'ai vu aucune réponse JavaScript dans le wiki rosetta.
Et c'est parti:
Cela crée une fonction
S
qui renvoie une chaîne avec la sortie souhaitée. la fonction s'occupe également des années bissextiles.En raison d'ES6, cela ne fonctionne que dans un dernier Firefox.
Merci à apsillers pour la pointe qui l'a réduit à 200 octets
Trouvez la version non golfée ci-dessous sous forme d'extrait de pile que vous pouvez exécuter ici même:
la source
2100
sortie d' entrée2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02
est incorrecte.Rebol -
120116 80 7976Non golfé + quelques annotations:
Exemple de calcul du dimanche dans la console Rebol:
la source
CJam,
122102 octetsCela n'utilise aucune forme de bibliothèque de dates. On peut aussi encore beaucoup jouer au golf, je pense.
Testez-le ici.
la source
R, 128 caractères
Avec des sauts de ligne:
la source
C # 255
Non golfé
Edit: modifié pour n'imprimer que le dernier dimanche :)
la source
q, 67
la source
"Oh, non, encore lui!"
Java -
259246 octetsVersion non golfée:
Usage:
Production:
Encore une autre réponse "mettons une réponse Java juste pour les coups de pied". Tant pis. Mais, au moins, puisque vous avez pris la peine d'arriver à ce point de ma réponse, je vais essayer de vous ennuyer un peu plus et d'expliquer mon raisonnement.
La méthode
g
reçoit l'année souhaitée et crée pour chaque mois unGregorianCalendar
objet (les mois vont de 0 à 11). Ensuite, le premierc.set
définit le jour de la semaine comme un dimanche et le second déclare que nous voulons la dernière semaine du mois - comme indiqué sur la documentation officielle . LesSystem.out.println
impressions de la date de ce dimanche (si nous faisions cela correctement, l'année serait imprimée commec.get(c.YEAR)
, mais en utilisant ày
nouveau rase 13 caractères), le mois doit être formaté pour ajouter un zéro de tête de janvier à septembre (et le la valeur est incrémentée car, eh bien, les mois ici sont représentés 0-11) et le jour du dernier dimanche est imprimé. Et cette procédure est répétée pour les onze autres mois.la source
C #,
212, 237Avec des sauts de ligne
Sortie pour 2014
la source
C # 171
Fonction renvoyant une chaîne.
Non golfé
la source
C # 194
en utilisant Linq:
Non golfé
Production
la source
Mathematica - 171
Enveloppé dans une fonction anonyme, retourne la chaîne
Premier golf mathématique. J'ai l'impression que cela pourrait être considérablement réduit.
la source
VB-192
Ça pourrait être pire ^^
Ma deuxième et dernière entrée (je ne pense pas que je puisse la réduire)
142
la source
Rubis 76
Utilise un paramètre de ligne de commande
ruby sundays.rb 1900
. Utilise la bibliothèque de dates.la source