RFC 2550 ist ein satirischer Vorschlag (veröffentlicht am 1. April 1999) für eine platzsparende ASCII-Darstellung von Zeitstempeln, die jedes Datum unterstützen können (auch solche vor dem Beginn des Universums und solche nach dem prognostizierten Ende des Universums). Der Algorithmus zur Berechnung eines RFC 2550 konforme Zeitstempel folgt wie (Anmerkung: alle Bereiche umfassen den Start , aber ausschließen das Ende - 0 bis 10.000 Mittel alle n
wo 0 <= n < 10000
):
- Jahresformat
- Jahre 0 bis 10.000: eine 4-stellige Dezimalzahl, links mit Nullen aufgefüllt.
- Jahre 10.000 bis 100.000: eine 5-stellige Dezimalzahl mit vorangestelltem Buchstaben A.
- Jahre 100.000 bis 10 30 : Die Dezimalzahl für das Jahr, vorangestellt mit dem ASCII-Großbuchstaben, dessen Index im englischen Alphabet der Anzahl der Stellen im Dezimaljahr entspricht, minus 5 (B für 6-stellige Jahre, C für 7) Jahre usw.).
- Jahre 10 30 bis 10 56 : dasselbe Format wie 10.000 bis 10 30 , wobei die Buchstaben mit A beginnen und
^
der Zeichenfolge zusätzlich ein Caret ( ) vorangestellt wird (also das Jahr 10 30 durch^A1000000000000000000000000000000
und das Jahr 10 31 durch dargestellt wird) von^B10000000000000000000000000000000
). - Jahre 10 56 bis 10 732 : Dem Jahr werden zwei Carets und zwei ASCII-Großbuchstaben vorangestellt. Die Großbuchstaben bilden eine Zahl zur Basis 26, die die Anzahl der Stellen im Jahr minus 57 darstellt.
- Ab 10 732 Jahren: Es wird dasselbe Format für 10 56 bis 10 732 verwendet. Bei Bedarf werden ein zusätzliches Caret und ein Großbuchstabe hinzugefügt.
- BCE-Jahre (vor Jahr 0): Berechnet die Jahreszeichenfolge des absoluten Wertes des Jahres. Ersetzen Sie dann alle Buchstaben durch das Basiskomplement 26 (A <-> Z, B <-> Y usw.) und alle Ziffern durch das Basiskomplement 10 (0 <-> 9, 1 <-> 8). usw.) und ersetzen Sie Carets durch Ausrufezeichen (
!
). Wenn die Jahreszeichenfolge 4 Stellen oder weniger enthält (dh -1 bis -10.000), stellen Sie einen Schrägstrich (/
) voran . Wenn der Jahreszeichenfolge kein Schrägstrich oder Ausrufezeichen vorangestellt ist, stellen Sie ein Sternchen (*
) voran .
- Monate, Tage, Stunden, Minuten und Sekunden : Da es sich bei diesen Werten immer nur um höchstens 2 Ziffern handelt, werden sie einfach in absteigender Reihenfolge der Signifikanz rechts von der Jahreszeichenfolge angehängt und bei Bedarf mit Nullen links aufgefüllt 2-stellige Zeichenfolge.
- Zusätzliche Genauigkeit : Wenn eine zusätzliche Genauigkeit (in Form von Millisekunden, Mikrosekunden, Nanosekunden usw.) erforderlich ist, werden diese Werte mit Nullen bis zu drei Stellen links aufgefüllt (da jeder Wert
1/1000
den vorherigen Wert hat und somit höchstens999
). und in absteigender Reihenfolge der Signifikanz an das Ende des Zeitstempels angehängt.
Dieses Format hat den Vorteil, dass die lexikalische Sortierung der numerischen Sortierung des entsprechenden Zeitstempels entspricht. Wenn Zeit A vor Zeit B liegt, liegt der Zeitstempel für A vor dem Zeitstempel für B, wenn die lexikalische Sortierung angewendet wird.
Die Herausforderung
Geben Sie bei einer beliebig langen Liste numerischer Werte (die beispielsweise Zeitwerten in absteigender Reihenfolge der Signifikanz [year, month, day, hour, minute, second, millisecond]
entsprechen) den entsprechenden RFC 2550-Zeitstempel aus.
Regeln
- Lösungen müssen für jede Eingabe funktionieren. Die einzigen Einschränkungen sollten die Zeit und der verfügbare Speicher sein.
- Die Eingabe kann in jedem vernünftigen, praktischen Format erfolgen (z. B. eine Liste von Ziffern, eine Liste von Zeichenfolgen, eine Zeichenfolge, die durch ein einzelnes nichtstelliges Zeichen begrenzt ist, usw.).
- Die Eingabe enthält immer mindestens einen Wert (das Jahr). Zusätzliche Werte sind immer in absteigender Reihenfolge der Signifikanz (z. B. enthält die Eingabe niemals einen Tageswert ohne einen Monatswert oder einen zweiten Wert, gefolgt von einem Monatswert).
- Die Eingabe wird immer eine gültige Zeit sein (z. B. werden für den 30. Februar keine Zeitstempel angezeigt).
- Builtins, die RFC 2550-Zeitstempel berechnen, sind verboten.
Beispiele
In diesen Beispielen wird die Eingabe als einzelne Zeichenfolge verwendet, wobei die einzelnen Werte durch Punkte ( .
) getrennt sind.
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
Referenzimplementierung
#!/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
doch sein*V3035567339896938984978971
?Antworten:
JavaScript (ES6), 325 Byte
Schockierend lang.
quelle
Befunge,
418384 BytesEs ist schwer im Voraus zu sagen, wie groß ein Befunge-Programm voraussichtlich sein wird, und als ich anfing, daran zu arbeiten, dachte ich, dass es tatsächlich eine Chance hat, mitzumachen. Es stellte sich heraus, dass ich falsch lag.
Probieren Sie es online!
quelle
Perl 5 ,
328 322 317301 + 1 (-a
) = 302 BytesProbieren Sie es online!
Ungolfed
quelle
Java 8,
653640637623 BytesEingabe als
String
-array und Rückgabetyp alsString
.Hat sich als ziemlich lang herausgestellt (wie erwartet), kann aber definitiv noch mehr golfen werden. Ich bin nur froh, dass es funktioniert, nachdem ich eine ganze Weile damit rumgespielt habe.
Probieren Sie es hier aus.
Erläuterung:
for(String p:s){
: Schleifen Sie über die Teileif(p.charAt(0)<46){p=p.substring(1);f=1;}
: Bestimmen Sie, ob es negativ ist, und entfernen Sie das Minuszeichen, und setzen Sie ein Flag, um Bytes zu reduzierent=p.length();
: Ermittelt die Anzahl der Ziffernif(i++<1){
: Wenn es die erste Zahl ist (das Jahr):t<5?"000".substring(t-1)
: Wenn es 0-100.000 ist (exklusiv): Fügen Sie bei Bedarf führende Nullen hinzut<32?(char)(t+60)
: Wenn es 100.000-10 30 ist (exklusiv): Fügen Sie einen führenden Buchstaben hinzut<58?"^"+(char)(t+34)
: Wenn es 10 30 -10 732 (exklusiv) ist: Fügen Sie einen wörtlichen"^"
+ führenden Buchstaben hinzuif(t>57)for(r+="^^",u=675;u<t-57;u*=26)r+="^";
: Addiere die entsprechende Menge an wörtlichen"^"
+x="";for(String c:Long.toString(t-57,26).toUpperCase().split(""))x+=z.charAt((y+q).indexOf(c));r+=x;
: führenden Buchstaben (Basis-26 zur Alphabet-Konvertierung)r+=p;
: Addiere das Jahr selbst zum Ergebnis-Stringif(f>0){
: Wenn das Jahr negativ war:x=t<5?"/":t<32?"*":r.replace("^","!").replaceAll("[^!]","");
Erstellen Sie eine temporäre String:x
mit dem richtigen/
,*
oder einem oder mehr!
for(char c c:r.toCharArray())x+=c>93?"":"ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210".charAt((z+y).indexOf(c));
: Führen Sie die Konvertierung durch (AowntownZ, BowntownY, 0owntown9, 1owntown8 usw.)r=x;
: Und dann setzen Sie das Ergebnis auf diese temporäre Zeichenfolgex
else
: Wenn es sich um Monat, Tage, Stunden, Minuten, Sekunden, Millisekunden, Mikrosekunden, Nanosekunden oder weniger handelt:i>6?t<2?"00"+p:t<3?0+p:p
: Wenn es Millisekunden oder weniger sind: Fügen Sie bei Bedarf führende Nullen hinzu:t<2?0+p:p;
: Andernfalls (Monat, Tage, Stunden, Minuten, Sekunden): Fügen Sie bei Bedarf eine einzelne führende Null hinzureturn r
: Das Ergebnis zurückgebenquelle
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.).
- Sie könnten Eingaben als eine Liste von Zahlen verwenden und die kostspielige Aufteilung und Konvertierung überspringen.long
wobei 64 Bit die größten sind) in Java für einige Eingaben zu klein und daherString
kürzer alsjava.math.BigInteger
. Ich habe es allerdings in einString
-array geändert, sodass ich nicht die Aufteilung nach Punkten vornehmen muss, wodurch einige Bytes gespart wurden. Also danke.Excel VBA,
500486485470 BytesAnonyme VBE-Sofortfensterfunktion
Die Funktion "Anonymes VBE-Sofortfenster", die Eingaben als Jahr von
[A1]
, Monat von[B1]
, Tag von[C1]
, Stunde von[D1]
, Minute von[E1]
, Sekunde von[F1]
und ein optionales Array mit zusätzlicher Genauigkeit von[G1:Z1]
annimmt, berechnet den RFC2550-Zeitstempel und gibt sie an das VBE-Sofortfenster aus. Verwendet die unten angegebene Hilfsfunktion.Hilfsfunktion
Deklarierte Hilfsfunktion, die eine eingegebene Nummer annimmt und diese Nummer in Basis 26 zurückgibt, so dass
1->A
und26->Z
Muss in einem öffentlichen Modul platziert werden.
Verwendung
Muss in einem klaren Modul verwendet werden, oder das Modul muß die Vars vor der Ausführung gelöscht werden
j
,o
undp
davon ausgegangen werden in ihrem Standard, nicht initialisierten Zustand zu Beginn der Ausführung des Codes sein. Fürj
, die eine istVariant\Integer
variabel, dieser Standardwert ist0
und füro
undp
, welcheVariant\String
Variablen Dieser Standardwert ist die leere Zeichenfolge (""
).Die Eingabe, ein Array von Zeichenfolgen, wird aus
1:1
dem ActiveSheet übernommen und in das VBE-Direktfenster ausgegeben.Beispiel-E / A
Sub
Routine-VersionDeklarierte Subroutine, die Eingaben als Jahr von
[A1]
, Monat von[B1]
, Tag von[C1]
, Stunde von[D1]
, Minute von[E1]
, Sekunde von[F1]
und ein optionales Array mit zusätzlicher Genauigkeit von[G1:Z1]
annimmt, berechnet den RFC2550-Zeitstempel und gibt diese in das VBE-Direktfenster aus.Verwendung
Die Eingabe in den Bereich
[A1:ZZ1]
kann entweder manuell erfolgen, indem Sie nach Bedarf von links nach rechts in die Zellen tippen, oder indem Sie sie über das VBE-Direktfenster zuweisen.Aufgrund der automatischen Konvertierung von Excel-Zahlen in wissenschaftliche Notation müssen Zahlen mit einer Basislänge von 10 oder mehr als 12 Stellen explizit als Text in die Zelle eingefügt werden, indem die Zelle entweder als Textzelle oder als Textzelle festgelegt wird indem Sie das Literal
'
vor den Anfang des Zellenwerts stellenBeispiel-E / A
Ungolfed und erklärt
quelle
Jelly ,
165126 BytesProbieren Sie es online!
In Zeile 4 wird die Jahresformatierung mit Hilfe der Zeilen 2 und 3 durchgeführt. In der ersten und letzten Zeile werden die Elemente der Eingabe auf die richtige Länge aufgefüllt und anschließend mit dem formatierten Jahr verkettet.
_µ‘l26Ċṗ@€ØAẎị@
findet das Präfix der Basis 26. Es nimmt die kartesische Potenz des Alphabets (ØA
) für jede Zahl zwischen 1 und ceil (log 26 (floor (log 10 (year)) - n + 1)) (wobei n entweder 30 oder 4 ist) und erhält dann Indizes in diese Liste mit Boden (log 10 (Jahr)) - n (ị@
).ç30;€”^UZF
Formate Jahre> = 10 30 (®L>30¤?
)ç4⁶;
Formate Jahre <10 30 . ( Bearbeiten : Speichern eines Bytes mit⁶;
anstelle von;@⁶
)1RḊ
ḟ
gibt ein leeres Präfix für Jahre <10 5 (®L>4¤?
) an. Es nimmt die Liste der Ziffern und filtert dann jedes Element in sich heraus. Nur dies zu nutzen, um zu ergeben,[]
weil es⁸
hier nicht funktioniert.Dies wird nur zu ausgewertet[]
.⁸
und[]
arbeite hier nicht und ich konnte keine weiteren 2 Bytes finden, die eine leere Liste zurückgeben.;®AṾ€¤
Hängt das Jahr an das Präfix an und glättet es dann.L=4”/x
Präfixe a,/
wenn die Länge des Jahres in der do-Anweisung von 4 ist®S<0¤¡
.2£FiЀ¹ị€2£UF¤
nimmt die KomplementeA .. Z
,0 .. 9
und^ /*!
wenn das Jahr negativ ist (®S<0¤¡
).2£
verweist auf den zweiten Link,ØD,“^ *!”,ØA
der die Liste ist[['0' .. '9'], ['^',' ','/','*','!'], ['A' .. 'Z']]
. Bei einem formatierten Jahr wie^C125...
diesem findet der Link den Index jedes Zeichens in der reduzierten Version2£
und verwendet dann diese Indizes, um eine neue Zeichenfolge aus der2£
reduzierten Version zu erstellen, in der jede Unterliste umgekehrt ist, dh['9' .. '0','!','*','/',' ','^','Z' .. 'A']
ergibt!X874...
./
wird sich selbst zugeordnet, weil ihm ein Präfix vorangestellt wird, bevor das Komplement vollständig ist.Am Ende habe ich dies in die vorherige do-Anweisung (L=4a®S<0x@”/;
fügt a/
zu Beginn der negativen Jahre hinzu[-9999 .. -0001]
. Ich vermute, dies kann verkürzt werden.¡
) aufgenommen und 7 Bytes gespart, weil ich dann nicht zweimal auf negative Jahre testen musste.Es gibt viele Verwendungen vonIch musste¡
in Zeile 4, und ich denke, sie könnten durch Verwendung von komprimiert werden,?
aber ich bin nicht sicher, wie ich diese zum Laufen bringen kann.?
arbeiten und sparte ein paar Bytes.James Holderness wies darauf hin, dass meine erste Einreichung Jahre mit 30 Ziffern nicht richtig handhabte. Es stellte sich heraus, dass der Fehler für jedes Jahr ein
Z
Präfix in der Basis 26 benötigte . Es stellte sich heraus, dass ich es nicht verwenden konnte,ṃ
da es Ihnen[1,0]
statt26
(duh) gibt, wenn Sie 26 in Basis 26 konvertieren . Stattdessen habe ich bestellte Paare mit Ersatz verwendet. Ich glaube nicht, dass es dafür ein Atom gibt, aber wenn ja, kann ich ein paar Bytes sparen. Die Behebung dieses Problems kostete mich ~ 40 Bytes. Auf jeden Fall mein bisher längstes Jelly-Programm. Bearbeiten : Es wurde ein kürzerer Weg gefunden, um das kartesische Produkt herzustellen. Mir wurde klar, dass ich nicht sicher war, ob der letzte für Präfixe mit mehr als zwei Buchstaben funktioniert, aber der neue Weg funktioniert.Es tut mir leid, dass ich diesen Beitrag so oft bearbeitet habe, aber ich entdecke immer wieder Möglichkeiten, ihn zu verkürzen.
quelle