La RFC 2550 est une proposition satirique (publiée le 1er avril 1999) pour une représentation ASCII à faible encombrement des horodatages qui peuvent prendre en charge n'importe quelle date (même celles antérieures au début de l'univers et celles passées avant la fin prévue de l'univers). L'algorithme de calcul d'un horodatage conforme à la RFC 2550 est le suivant (remarque: toutes les plages incluent le début mais excluent la fin - 0 à 10 000 signifie tout n
où 0 <= n < 10000
):
- Format de l'année
- Années 0 à 10 000: un nombre décimal à 4 chiffres, rempli à gauche de zéros.
- Années 10 000 à 100 000: un nombre décimal à 5 chiffres, précédé du caractère A.
- Années 100 000 à 10 30 : le nombre décimal de l'année, préfixé par la lettre ASCII majuscule dont l'index de l'alphabet anglais est égal au nombre de chiffres de l'année décimale, moins 5 (B pour les années à 6 chiffres, C pour 7 - années chiffres, etc.).
- Années 10 30 à 10 56 : le même format que 10 000 à 10 30 , en commençant les lettres par A et en préfixant en plus un caret (
^
) à la chaîne (donc l'année 10 30 est représentée par^A1000000000000000000000000000000
, et l'année 10 31 est représentée par^B10000000000000000000000000000000
). - Années 10 56 à 10 732 : l'année est préfixée par deux carets et deux lettres majuscules ASCII. Les lettres majuscules forment un nombre en base 26 représentant le nombre de chiffres dans l'année, moins 57.
- À partir de 10 732 ans: le même format est utilisé pour 10 56 à 10 732 , en le prolongeant en ajoutant un caret et une lettre majuscule si nécessaire.
- Années BCE (avant l'année 0): calculez la chaîne d'année de la valeur absolue de l'année. Ensuite, remplacez toutes les lettres par leur complément en base 26 (A <-> Z, B <-> Y, etc.), remplacez tous les chiffres par leur complément en base 10 (0 <-- 9, 1 <-> 8, etc.) et remplacez les points d'insertion par des points d'exclamation (
!
). Si la chaîne de l'année est de 4 chiffres ou moins (c'est-à-dire -1 à -10 000), ajoutez une barre oblique (/
). Si la chaîne de l'année n'est pas précédée d'une barre oblique ou d'un point d'exclamation, ajoutez un astérisque (*
).
- Mois, jours, heures, minutes et secondes : comme ces valeurs ne sont que de 2 chiffres au maximum, elles sont simplement ajoutées à droite de la chaîne de l'année, par ordre décroissant de signification, complétées à gauche par des zéros si nécessaire pour former Chaînes à 2 chiffres.
- Précision supplémentaire : si une précision supplémentaire (sous forme de millisecondes, microsecondes, nanosecondes, etc.) est nécessaire, ces valeurs sont remplies à gauche avec des zéros à 3 chiffres (car chaque valeur est
1/1000
de la valeur précédente, et donc au maximum999
) et ajouté à la fin de l'horodatage, par ordre décroissant d'importance.
Ce format présente l'avantage que le tri lexical est équivalent au tri numérique de l'horodatage correspondant - si l'heure A précède l'heure B, alors l'horodatage pour A viendra avant l'horodatage pour B lorsque le tri lexical est appliqué.
Le défi
Étant donné une liste arbitrairement longue de valeurs numériques (correspondant à des valeurs temporelles dans un ordre décroissant de signification, par exemple [year, month, day, hour, minute, second, millisecond]
), émettez l'horodatage RFC 2550 correspondant.
Règles
- Les solutions doivent fonctionner pour toute entrée donnée. Les seules limitations devraient être le temps et la mémoire disponible.
- L'entrée peut être prise dans n'importe quel format raisonnable et pratique (comme une liste de chiffres, une liste de chaînes, une chaîne délimitée par un seul caractère non numérique, etc.).
- L'entrée contiendra toujours au moins une valeur (l'année). Les valeurs supplémentaires sont toujours en ordre décroissant de signification (par exemple, l'entrée ne contiendra jamais une valeur de jour sans valeur de mois, ou une deuxième valeur suivie d'une valeur de mois).
- L'entrée sera toujours une heure valide (par exemple, il n'y aura pas d'horodatage pour le 30 février).
- Les buildins qui calculent les horodatages RFC 2550 sont interdits.
Exemples
Ces exemples utilisent l'entrée comme une seule chaîne, les valeurs individuelles étant séparées par des points ( .
).
1000.12.31.13.45.16.8 -> 10001231134516008
12.1.5.1 -> 0012010501
45941 -> A45941
8675309.11.16 -> C86753091116
47883552573911529811831375872990.1.1.2.3.5.8.13 -> ^B478835525739115298118313758729900101020305008013
4052107100422150625478207675901330514555829957419806023121389455865117429470888094459661251.2.3.5.7.11 -> ^^BI40521071004221506254782076759013305145558299574198060231213894558651174294708880944596612510203050711
-696443266.1.3.6.10.15.21.28 -> *V3035567330103061015021028
-5342 -> /4657
-4458159579886412234725624633605648497202 -> !Q5541840420113587765274375366394351502797
Implémentation de référence
#!/usr/bin/env python
import string
# thanks to Leaky Nun for help with this
def base26(n):
if n == 0:
return ''
digits = []
while n:
n -= 1
n, digit = divmod(n, 26)
digit += 1
if digit < 0:
n += 1
digit -= 26
digits.append(digit)
return ''.join(string.ascii_uppercase[x-1] for x in digits[::-1])
year, *vals = input().split('.')
res = ""
negative = False
if year[0] == '-':
negative = True
year = year[1:]
if len(year) < 5:
y = "{0:0>4}".format(year)
elif len(year) <= 30:
y = "{0}{1}".format(string.ascii_uppercase[len(year)-5], year)
else:
b26len = base26(len(year)-30)
y = "{0}{1}{2}".format('^'*len(b26len), b26len, year)
if negative:
y = y.translate(str.maketrans(string.ascii_uppercase+string.digits+'^', string.ascii_uppercase[::-1]+string.digits[::-1]+'!'))
if len(year) == 4:
y = '/' + y
if y[0] not in ['/', '!']:
y = '*' + y
res += y
for val in vals[:5]: #month, day, hour, minute, second
res += '{0:0>2}'.format(val)
for val in vals[5:]: #fractional seconds
res += '{0:0>3}'.format(val)
print(res)
-696443266.1.3.6.10.15.21.28
être*V3035567339896938984978971
?Réponses:
JavaScript (ES6), 325 octets
Étonnamment long.
la source
Befunge,
418384 octetsIl est difficile de dire à l'avance à quel point un programme Befunge est susceptible de se terminer, et quand j'ai commencé à travailler sur ce sujet, je pensais qu'il pourrait avoir une chance de participer. Il s'avère que j'avais tort.
Essayez-le en ligne!
la source
Perl 5 ,
328 322 317301 + 1 (-a
) = 302 octetsEssayez-le en ligne!
Non golfé
la source
Java 8,
653640637623 octetsEntrez as
String
-array et return-type asString
.Il s'est avéré être assez long (comme prévu), mais peut certainement être joué au golf encore plus. Je suis juste content que ça marche après avoir joué avec ça pendant un bon moment ..
Essayez-le ici.
Explication:
for(String p:s){
: Boucle sur les piècesif(p.charAt(0)<46){p=p.substring(1);f=1;}
: Déterminez si c'est négatif, et si c'est le cas, supprimez le signe moins et définissez un indicateur pour réduire les octetst=p.length();
: Obtenir le nombre de chiffresif(i++<1){
: Si c'est le premier chiffre (l'année):t<5?"000".substring(t-1)
: Si c'est 0-100 000 (exclusif): ajoutez des zéros non significatifs si nécessairet<32?(char)(t+60)
: Si c'est 100 000-10 30 (exclusif): Ajoutez une lettre principalet<58?"^"+(char)(t+34)
: S'il est 10 30 -10 732 (exclusif): Ajouter un littéral"^"
+ lettre principaleif(t>57)for(r+="^^",u=675;u<t-57;u*=26)r+="^";
: Ajoutez la quantité appropriée de littéral"^"
+x="";for(String c:Long.toString(t-57,26).toUpperCase().split(""))x+=z.charAt((y+q).indexOf(c));r+=x;
: lettres principales (conversion de la base 26 en alphabet)r+=p;
: Ajouter l'année elle-même à la chaîne de résultatsif(f>0){
: Si l'année a été négative:x=t<5?"/":t<32?"*":r.replace("^","!").replaceAll("[^!]","");
: Créer une chaîne temporairex
avec le bon/
,*
ou un ou plusieurs!
for(char c c:r.toCharArray())x+=c>93?"":"ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210".charAt((z+y).indexOf(c));
: Faites la conversion (A↔Z, B↔Y, 0↔9, 1↔8, etc.)r=x;
: Et puis définissez le résultat sur cette chaîne temporairex
else
: Si c'est le mois, les jours, les heures, les minutes, les secondes, les millisecondes, les microsecondes, les nanosecondes ou moins:i>6?t<2?"00"+p:t<3?0+p:p
: Si elle est inférieure ou égale à quelques millisecondes: Ajoutez des zéros non significatifs si nécessaire:t<2?0+p:p;
: Sinon (mois, jours, heures, minutes, secondes): Ajouter un zéro de début unique si nécessairereturn r
: Retourner le résultatla source
Input may be taken in any reasonable, convenient format (such as a list of numerics, a list of strings, a string delimited by a single non-digit character, etc.).
- vous pouvez prendre la saisie comme une liste de chiffres et ignorer le fractionnement et la conversion coûteux.long
64 bits étant le plus grand) sont trop petites en Java pour certaines entrées, elles sont doncString
plus courtes quejava.math.BigInteger
.String
Cependant, je l'ai changé en un tableau, donc je n'ai pas besoin de faire la division par points, ce qui a économisé quelques octets, alors merci.Excel VBA,
500486485470 octetsFonction de fenêtre immédiate VBE anonyme
La fonction de fenêtre immédiate VBE anonyme qui prend les entrées comme année de
[A1]
, mois de[B1]
, jours de[C1]
, heures de[D1]
, minutes de[E1]
, secondes de[F1]
et un tableau de précision supplémentaire en option de[G1:Z1]
, calcule l'horodatage RFC2550 et les sorties vers la fenêtre immédiate VBE. Utilise la fonction d'assistance déclarée ci-dessous.Fonction d'assistance
Fonction d'assistance déclarée qui prend un nombre d'entrée et renvoie ce nombre en base-26 tel que
1->A
et26->Z
Doit être placé dans un module public.
Usage
Doit être utilisé dans un module clair, ou le module doit être effacé avant l' exécution que les vars
j
,o
etp
sont supposés être dans leur état par défaut, non initialisée au début de l' exécution du code. Pourj
, qui est uneVariant\Integer
variable, cette valeur par défaut est0
et pouro
etp
, qui sont desVariant\String
variables, cette valeur par défaut est la chaîne vide (""
).L'entrée, un tableau de chaînes, est extraite de
1:1
l'ActiveSheet et la sortie est vers la fenêtre immédiate VBE.Exemple d'E / S
Sub
Version de routineLa sous-routine déclarée qui prend les entrées comme année de
[A1]
, mois de[B1]
, jours de[C1]
, heures de[D1]
, minutes de[E1]
, secondes de[F1]
et un tableau de précision supplémentaire en option de[G1:Z1]
, calcule l'horodatage RFC2550 et les sorties vers la fenêtre immédiate VBE.Usage
La saisie dans la plage
[A1:ZZ1]
peut être effectuée soit manuellement, en tapant dans les cellules, de l'extrême gauche à l'extrême droite, selon les besoins, soit en l'affectant à partir de la fenêtre immédiate du VBE.À noter, en raison de la conversion automatique des nombres Excel en notation scientifique, tout nombre dont la longueur en base 10 est égale ou supérieure à 12 chiffres doit être inséré explicitement dans la cellule sous forme de texte, soit en définissant la cellule comme une cellule de texte, soit en ajoutant le littéral
'
au début de la valeur de la celluleExemple d'E / S
Non golfé et expliqué
la source
Gelée ,
165126octetsEssayez-le en ligne!
La ligne 4 effectue le formatage de l'année à l'aide des lignes 2 et 3. La première et la dernière ligne traitent du remplissage nul des éléments de l'entrée à leur longueur appropriée, puis les concaténent avec l'année formatée.
_µ‘l26Ċṗ@€ØAẎị@
trouve le préfixe de base 26. Il prend la puissance cartésienne de l'alphabet (ØA
) pour chaque nombre entre 1 et ceil (log 26 (étage (log 10 (année)) - n + 1)) (où n est soit 30 soit 4), puis obtient des index dans cette liste avec plancher (log 10 (année)) - n (ị@
).ç30;€”^UZF
formats années> = 10 30 (®L>30¤?
)ç4⁶;
formats années <10 30 . ( Modifier : enregistré un octet en utilisant⁶;
au lieu de;@⁶
)1RḊ
ḟ
donne un préfixe vide pour les années <10 5 (®L>4¤?
). Il prend la liste des chiffres puis filtre chaque élément en lui-même. Il suffit de l'utiliser pour céder,[]
car⁸
cela ne fonctionne pas ici.Cela ne fait qu'évaluer[]
.⁸
et[]
ne fonctionnent pas ici et je n'ai pas pu trouver 2 autres octets qui retournent une liste vide.;®AṾ€¤
ajoute l'année au préfixe puis l'aplatit.L=4”/x
préfixe a/
si la longueur de l'année est 4 dans la déclaration do de®S<0¤¡
.2£FiЀ¹ị€2£UF¤
prend les compléments deA .. Z
,0 .. 9
et^ /*!
si l'année est négative (®S<0¤¡
).2£
fait référence au deuxième lien,ØD,“^ *!”,ØA
qui est la liste[['0' .. '9'], ['^',' ','/','*','!'], ['A' .. 'Z']]
. Avec une année formatée comme^C125...
ce lien, trouve l'index de chaque caractère dans la version aplatie de2£
puis utilise ces indices pour construire une nouvelle chaîne à partir de la version aplatie de l'2£
endroit où chaque sous-liste est inversée, c'est['9' .. '0','!','*','/',' ','^','Z' .. 'A']
-à- dire le rendement!X874...
./
mappe sur lui-même car il est préfixé avant que tout ne soit pris en compte.J'ai fini par l'inclure dans l'instruction do précédente (L=4a®S<0x@”/;
ajoute un/
début d'année négative[-9999 .. -0001]
. Je suppose que cela peut être raccourci.¡
) et j'ai économisé 7 octets car je n'avais pas besoin de tester les années négatives deux fois.Il y a beaucoup d'utilisations de laJe me suis mis¡
ligne 4 et je pense qu'elles pourraient être compressées en utilisant à la?
place, mais je ne sais pas comment les faire fonctionner.?
au travail et j'ai économisé quelques octets.James Holderness a souligné que ma première soumission ne traitait pas des années avec 30 chiffres corrects. Il s'est avéré que le bug était pour n'importe quelle année qui avait besoin d'un
Z
préfixe de base 26. Il s'avère que je ne pouvais pas utiliserṃ
parce que lorsque vous convertissez 26 en base 26, cela vous donne[1,0]
au lieu de26
(duh). Au lieu de cela, j'ai utilisé des paires commandées avec remplacement. Je ne pense pas qu'il y ait un atome pour ça mais s'il y en a je peux économiser quelques octets. La résolution de ce problème m'a coûté environ 40 octets. Certainement mon plus long programme Jelly à ce jour. Edit : Trouvé un moyen plus court de faire le produit cartésien. J'ai réalisé que je n'étais pas sûr que le dernier fonctionnait pour les préfixes avec plus de deux lettres de toute façon, mais la nouvelle méthode fonctionne.Désolé pour les nombreuses fois où j'ai édité ce post, je continue de découvrir des moyens de le raccourcir.
la source