Tính toán dấu thời gian RFC 2550


26

RFC 2550 là một đề xuất châm biếm (xuất bản vào ngày 1 tháng 4 năm 1999) cho một biểu diễn dấu thời gian ASCII hiệu quả trong không gian có thể hỗ trợ bất kỳ ngày nào (ngay cả những ngày trước khi bắt đầu vũ trụ và những ngày đã qua dự đoán của vũ trụ). Thuật toán tính toán dấu thời gian tuân thủ RFC 2550 như sau (lưu ý: tất cả các phạm vi bao gồm bắt đầu nhưng loại trừ kết thúc - 0 đến 10.000 có nghĩa là tất cả nở đâu 0 <= n < 10000):

  • Định dạng năm
    • Năm 0 đến 10.000: số thập phân gồm 4 chữ số, được đệm trái bằng số không.
    • Năm 10.000 đến 100.000: số thập phân gồm 5 chữ số, có tiền tố là ký tự A.
    • Năm 100.000 đến 10 30 : số thập phân của năm, có tiền tố là chữ cái ASCII viết hoa có chỉ số trong bảng chữ cái tiếng Anh bằng số chữ số trong năm thập phân, trừ 5 (B cho 6 năm chữ số, C cho 7 -thần năm, v.v.).
    • Năm 10 30 đến 10 56 : cùng định dạng từ 10.000 đến 10 30 , bắt đầu các chữ cái bằng A và thêm tiền tố vào một dấu mũ ( ^) vào chuỗi (vì vậy năm 10 30 được biểu thị ^A1000000000000000000000000000000và năm 10 31 được biểu thị bởi ^B10000000000000000000000000000000).
    • Năm 10 56 đến 10 732 : năm được tiền tố bởi hai dấu mũ và hai chữ cái viết hoa ASCII. Các chữ cái viết hoa tạo thành một số cơ sở-26 đại diện cho số chữ số trong năm, trừ 57.
    • Năm 10 732 trở đi: định dạng tương tự cho 10 56 đến 10 732 được sử dụng, mở rộng nó bằng cách thêm một dấu mũ và chữ hoa khi cần thiết.
    • Năm BCE (trước năm 0): tính chuỗi năm của giá trị tuyệt đối của năm. Sau đó, thay thế tất cả các chữ cái bằng phần bù cơ sở 26 của chúng (A <-> Z, B <-> Y, v.v.), thay thế tất cả các chữ số bằng phần bù cơ số 10 của chúng (0 <-> 9, 1 <-> 8, v.v.) và thay thế dấu mũ bằng dấu chấm than ( !). Nếu chuỗi năm có 4 chữ số trở xuống (nghĩa là -1 đến -10.000), hãy thêm dấu gạch chéo ( /). Nếu chuỗi năm không được bắt đầu bằng dấu gạch chéo về phía trước hoặc dấu chấm than, hãy thêm dấu hoa thị ( *).
  • Tháng, ngày, giờ, phút và giây : vì các giá trị này chỉ có tối đa 2 chữ số, chúng chỉ đơn giản được gắn vào bên phải của chuỗi năm, theo thứ tự giảm dần có ý nghĩa, được đệm trái bằng số 0 nếu cần để hình thành Chuỗi 2 chữ số.
  • Độ chính xác bổ sung : nếu độ chính xác bổ sung (dưới dạng mili giây, micro giây, nano giây, v.v.) là cần thiết, các giá trị đó được đệm trái với số 0 đến 3 chữ số (vì mỗi giá trị là 1/1000giá trị trước đó và do đó nhiều nhất là 999) và được thêm vào cuối dấu thời gian, theo thứ tự giảm dần có ý nghĩa.

Định dạng này có lợi ích của việc sắp xếp từ vựng tương đương với sắp xếp số của dấu thời gian tương ứng - nếu thời gian A đến trước thời gian B, thì dấu thời gian cho A sẽ xuất hiện trước dấu thời gian cho B khi áp dụng sắp xếp từ vựng.

Các thách thức

Đưa ra một danh sách dài các giá trị số tùy ý (tương ứng với các giá trị thời gian theo thứ tự quan trọng giảm dần, ví dụ [year, month, day, hour, minute, second, millisecond]), xuất ra dấu thời gian RFC 2550 tương ứng.

Quy tắc

  • Các giải pháp phải làm việc cho bất kỳ đầu vào nhất định. Những hạn chế duy nhất nên là thời gian và bộ nhớ có sẵn.
  • Đầu vào có thể được lấy theo bất kỳ định dạng hợp lý, thuận tiện nào (chẳng hạn như danh sách các số, danh sách các chuỗi, một chuỗi được phân tách bằng một ký tự không có chữ số, v.v.).
  • Đầu vào sẽ luôn chứa ít nhất một giá trị (năm). Các giá trị bổ sung luôn theo thứ tự có ý nghĩa giảm dần (ví dụ: đầu vào sẽ không bao giờ chứa giá trị ngày mà không có giá trị tháng hoặc giá trị thứ hai theo sau là giá trị tháng).
  • Đầu vào sẽ luôn là thời gian hợp lệ (ví dụ: sẽ không có bất kỳ dấu thời gian nào cho ngày 30 tháng 2).
  • Nội dung tính toán dấu thời gian RFC 2550 bị cấm.

Ví dụ

Các ví dụ này sử dụng đầu vào dưới dạng một chuỗi, với các giá trị riêng được phân tách bằng dấu chấm ( .).

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

Thực hiện tham khảo

#!/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)

Chắc chắn -696443266.1.3.6.10.15.21.28phải *V3035567339896938984978971vậy chứ?
Neil

11
@Neil Cho đến khi chúng tôi phát minh ra tháng âm. Tháng mười một
Mego

1
@TaylorScott Độ chính xác bổ sung : nếu độ chính xác bổ sung (dưới dạng mili giây, micro giây, nano giây, v.v.) là cần thiết, các giá trị đó được đệm trái với số 0 đến 3 chữ số.
Mego

2
Đối với tôi có vẻ như thông số kỹ thuật được đưa ra trong câu hỏi không thực sự khớp với RFC2550. Theo tôi hiểu, một khi bạn vượt qua ba dấu mũ, số lượng chữ cái sẽ tăng nhanh hơn so với dấu mũ, bởi vì nó xuất phát từ chuỗi Fibonacci (4 dấu có nghĩa là 5 chữ cái, 5 dấu có nghĩa là 8 chữ cái, v.v.) giả sử chúng ta nên bỏ qua khía cạnh đó của RFC?
James Holdiness

1
@JamesHoldiness Bạn nói đúng, tôi đã làm hỏng thông số kỹ thuật. Tuy nhiên, đã quá muộn để sửa nó, vì đã có câu trả lời sẽ bị vô hiệu.
Mego

Câu trả lời:


5

JavaScript (ES6), 325 byte

f=
s=>s.split`.`.map((n,i)=>i?`00${n}`.slice(i>5?-3:-2):n<'0'?g(n.slice(1),'!','*','/').replace(/\w/g,c=>c>'9'?(45-parseInt(c,36)).toString(36):9-c):g(n),g=(n,c='^',d='',e='',l=n.length)=>l<5?e+`000${n}`.slice(-4):l<31?d+(l+5).toString(36)+n:h(l-30,c)+n,h=(n,c)=>n?c+h(--n/26|0,c)+(n%26+10).toString(36):'').join``.toUpperCase()
;
<input oninput=o.value=f(this.value);><input id=o>

Sốc dài.


Bạn có phiền khi thêm Stack Snippet để dễ dàng kiểm tra không?
Mego

@Mego Xong. Cũng sửa một số lỗi chính tả xuất hiện (Tôi đã vô tình xóa một số mã khi sao chép và dán vì gói dòng làm tôi bối rối. Rất tiếc.)
Neil

3

Befunge, 418 384 byte

Thật khó để nói trước một chương trình Befunge lớn như thế nào có khả năng kết thúc, và khi tôi bắt đầu làm việc này, tôi nghĩ rằng nó thực sự có thể có một số cơ hội cạnh tranh. Hóa ra tôi đã sai.

~:59*-!:00p:2*1\-10p:9*68*+20p>0>#~$_v
68*-:0\`30p\>>:"P"%\"P"/9+p30g#v_1+:~>
0\`v`\0:\p04<<:+1g04-$<_\49+2*v>0>+#1:#\4#g\#0`#2_130p040p5-::01-`\49+2*-:
v:$_\50p\$:130g:1+30p:!^!:-1\*<>g*"A"++\49+2*/50g1-:
_$1+7g00g40g!**:!>_40g:!v!:\g8<^00*55*g01%*2+94:p05
|#9/"P"\%"P":<:_,#!>#:<$_1-00g^v3$\_\#`\0:>#g+
>10g*20g+,1+:^v\&\0+2`4:_@#`<0+<
/*v*86%+55:p00<_$$>:#,_$1+~0^
^!>+\55+/00g1-:^

Hãy thử trực tuyến!


3

Perl 5 , 328 322 317 301 + 1 ( -a) = 302 byte

$_=shift@F;if(($l=y/-//c)<5){s/^/0 x(4-$l)/e}elsif($l<57){s/^/'^'x($l>30).chr 65+($l-5)%26/e}else{$l-=57;do{s/\^*\K/'^'.chr 65+$l%26/e}while$l=int$l/26;s/^\^\K\D-?\d/^A$&/}if(s/-//){s%^....$%/$&%;eval join'',reverse'!/',0..9,A..Z,"y/A-Z0-9^/";s%^[^!/]%*$&%}printf$_.'%02d'x(@F>5?5:@F).'%03d'x(@F-5),@F

Hãy thử trực tuyến!

Bị đánh cắp

$_=shift@F; # Store the year in the default variable for easier regex

if(($l=y/-//c)<5){      # if the length of the year is less than 5
    s/^/0 x(4-$l)/e         # pad with leading zeros to 4 digits
}elsif($l<57){          # if the length is less than 57
    s/^/'^'x($l>30).chr 65+($l-5)%26/e  # put a carat at the front if there are more than 30 characters
                        # and map the length minus 5 to A-Z
}else{
    $l-=57;         # offset the length by 57
    do{         
        s/\^*\K/'^'.chr 65+$l%26/e # put a carat at the front and map the length to base 26 (A-Z)
    }while$l=int$l/26;  # until the length is down to 0
    s/^\^\K\D-?\d/^A$&/ # insert an extra '^A' to pad the result to at least 2 characters if there was only 1
}
if(s/-//){          # if the year is negative
    s%^....$%/$&%;          # put a '/' in front of a 4 digit year
    eval join'',reverse'!/',0..9,A..Z,"y/A-Z0-9^/"; # map A-Z,0-9, and ^ to Z-A,9-0, and ! respectively
    s%^[^!/]%*$&%           # add a * at the front if there are no other indicators
}
printf$_.           # output the year
'%02d'x(@F>5?5:@F).             # followed by the month, day, hour, and minutes, padded to 2 digits
'%03d'x(@F-5),@F                # followed by fractional seconds, padded to three digits

3

Java 8, 653 640 637 623 byte

s->{String r="",q="ABCDEFGHIJKLMNOP",z=q+"QRSTUVWXYZ",y="0123456789",x;int i=0,f=0,t,u;for(String p:s){if(p.charAt(0)<46){p=p.substring(1);f=1;}t=p.length();if(i++<1){r+=(t<5?"000".substring(t-1):t<32?(char)(t+60):t<58?"^"+(char)(t+34):"");if(t>57){for(r+="^^",u=675;u<t-57;u*=26)r+="^";x="";for(String c:Long.toString(t-57,26).toUpperCase().split(""))x+=z.charAt((y+q).indexOf(c));r+=x;}r+=p;if(f>0){x=t<5?"/":t<32?"*":r.replace("^","!").replaceAll("[^!]","");for(char c:r.toCharArray())x+=c>93?"":"ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210".charAt((z+y).indexOf(c));r=x;}}else r+=i>6?t<2?"00"+p:t<3?0+p:p:t<2?0+p:p;}return r;}

Nhập như String -array và kiểu trả về là String.

Hóa ra là khá dài (như mong đợi), nhưng chắc chắn có thể được chơi golf nhiều hơn nữa. Tôi chỉ vui mừng vì nó hoạt động sau khi nghịch với nó khá lâu ..

Hãy thử nó ở đây.

Giải trình:

  • for(String p:s){: Vòng qua các bộ phận
    • if(p.charAt(0)<46){p=p.substring(1);f=1;}: Xác định nếu nó âm tính và nếu có, hãy xóa dấu trừ và đặt cờ để giảm byte
    • t=p.length();: Lấy số lượng chữ số
    • if(i++<1){: Nếu đó là số đầu tiên (năm):
      • t<5?"000".substring(t-1): Nếu là 0-100.000 (độc quyền): thêm các số 0 đứng đầu nếu cần
      • t<32?(char)(t+60): Nếu đó là 100.000-10 30 (độc quyền): Thêm một chữ cái đầu
      • t<58?"^"+(char)(t+34): If it 10 30 -10 732 (độc quyền): Thêm một chữ "^"cái đầu + chữ cái đầu
      • if(t>57)for(r+="^^",u=675;u<t-57;u*=26)r+="^";: Thêm số lượng thích hợp của chữ "^"+ x="";for(String c:Long.toString(t-57,26).toUpperCase().split(""))x+=z.charAt((y+q).indexOf(c));r+=x;: chữ cái đầu (chuyển đổi cơ sở-26 sang bảng chữ cái)
      • r+=p;: Thêm năm vào chuỗi kết quả
      • if(f>0){: Nếu năm âm:
        • x=t<5?"/":t<32?"*":r.replace("^","!").replaceAll("[^!]","");: Tạo một String tạm thời xvới đúng /, *hoặc một hoặc nhiều!
        • for(char c c:r.toCharArray())x+=c>93?"":"ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210".charAt((z+y).indexOf(c));: Thực hiện chuyển đổi (A↔Z, B↔Y, 0↔9, 1↔8, v.v.)
        • r=x;: Và sau đó đặt kết quả cho Chuỗi tạm thời này x
    • else: Nếu đó là tháng, ngày, giờ, phút, giây, mili giây, micro giây, nano giây hoặc nhỏ hơn:
      • i>6?t<2?"00"+p:t<3?0+p:p: Nếu là mili giây hoặc nhỏ hơn: Thêm số 0 đứng đầu nếu cần
      • :t<2?0+p:p;: Khác (tháng, ngày, giờ, phút, giây): Thêm số 0 duy nhất nếu cần
  • return r: Trả lại kết quả

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.).- bạn có thể lấy đầu vào làm danh sách các số và bỏ qua việc chia tách và chuyển đổi tốn kém.
Mego

1
@Mego Thật không may, số mặc định ( longvới 64 bit là lớn nhất) quá nhỏ trong Java đối với một số đầu vào, do đó Stringngắn hơn java.math.BigInteger. Tôi đã thay đổi nó thành một String-array, vì vậy tôi không cần phải phân chia bằng dấu chấm, điều này đã lưu một số byte, cảm ơn.
Kevin Cruijssen

2

VBA Excel, 500 486 485 470 byte

Chức năng cửa sổ tức thời VBE ẩn danh

Hàm cửa sổ tức thời VBE ẩn danh lấy đầu vào là năm [A1], tháng từ [B1], ngày từ [C1], giờ từ [D1], phút từ [E1], giây [F1]và một mảng chính xác bổ sung tùy chọn từ [G1:Z1], tính toán dấu thời gian RFC2550 và xuất ra cửa sổ ngay lập tức VBE. Làm cho việc sử dụng các chức năng của người trợ giúp khai báo dưới đây.

n=Left([A1],1)="-":y=Mid([A1],1-n):l=Len(y):o=IIf(l<5,Right("000"&y,4),IIf(l<31,"",String(Len(b(l-30)),94))&B(l-IIf(l<31,4,30))&y):For Each c In[B1:Z1]:j=j+1:p=p+IIf(c,Format(c,IIf(j>5,"000","00")),""):Next:If n Then For i=1To Len(o):c=Asc(Mid(o,i,1)):Mid$(o,i,1)=Chr(IIf(c<60,105,155)-c):Next:?IIf(l<5,"/",IIf(InStr(1,o,"="),"","*"))Replace(o,"=","!")p:Else?o;p

Chức năng trợ giúp

Chức năng helper tuyên bố rằng có một số đầu vào và trả về con số đó trong cơ sở-26 như vậy 1->A26->Z

Phải được đặt vào một mô-đun công cộng.

Function b(n)
While n
n=n-1
d=n Mod 26+1
n=Int(n/26)
d=d+26*(d<0):n=n-(d<0)
b=Chr(64+d)+b
Wend
End Function

Sử dụng

Phải được sử dụng trong một module rõ ràng, hoặc các module phải được xóa trước khi thực hiện như vars j, opđược giả định là trong mặc định của họ, nhà nước chưa được khởi tạo vào đầu thực hiện các mã. Đối với j, là một Variant\Integerbiến, giá trị mặc định này là 0và cho op, là Variant\Stringcác biến, giá trị mặc định này là chuỗi rỗng ("" ).

Đầu vào, một chuỗi các chuỗi, được lấy từ 1:1trên ActiveSheet và đầu ra là vào cửa sổ ngay lập tức VBE.

Mẫu I / O

[A1:F1]=Split("4052107100422150625478207675901330514555829957419806023121389455865117429470888094459661251.2.3.5.7.11",".")
n=Left([A1],1)="-":y=Mid([A1],1-n):l=Len(y):o=IIf(l<5,Right("000"&y,4),IIf(l<31,"",String(Len(b(l-30)),94))&B(l-IIf(l<31,4,30))&y):For Each c In[B1:ZZ1]:j=j+1:p=p+IIf(c,Format(c,IIf(j>5,"000","00")),""):Next:If n Then For i=1To Len(o):c=Asc(Mid(o,i,1)):Mid$(o,i,1)=Chr(IIf(c<60,105,155)-c):Next:?IIf(l<5,"/",IIf(InStr(1,o,"="),"","*"))Replace(o,"=","!")p:Else?o;p
^^BI40521071004221506254782076759013305145558299574198060231213894558651174294708880944596612510203050711021028

Cells.Clear:j=0:o="":p="" '' clear the worksheet and vars
[A1:H1]=Array("-696443266","1","3","6","10","15","21","28")
n=Left([A1],1)="-":y=Mid([A1],1-n):l=Len(y):o=IIf(l<5,Right("000"&y,4),IIf(l<31,"",String(Len(b(l-30)),94))&B(l-IIf(l<31,4,30))&y):For Each c In[B1:ZZ1]:j=j+1:p=p+IIf(c,Format(c,IIf(j>5,"000","00")),""):Next:If n Then For i=1To Len(o):c=Asc(Mid(o,i,1)):Mid$(o,i,1)=Chr(IIf(c<60,105,155)-c):Next:?IIf(l<5,"/",IIf(InStr(1,o,"="),"","*"))Replace(o,"=","!")p:Else?o;p
*V3035567330103061015021028

Cells.Clear:j=0:o="":p="" '' clear the worksheet and vars
[A1]="45941"
n=Left([A1],1)="-":y=Mid([A1],1-n):l=Len(y):o=IIf(l<5,Right("000"&y,4),IIf(l<31,"",String(Len(b(l-30)),94))&B(l-IIf(l<31,4,30))&y):For Each c In[B1:ZZ1]:j=j+1:p=p+IIf(c,Format(c,IIf(j>5,"000","00")),""):Next:If n Then For i=1To Len(o):c=Asc(Mid(o,i,1)):Mid$(o,i,1)=Chr(IIf(c<60,105,155)-c):Next:?IIf(l<5,"/",IIf(InStr(1,o,"="),"","*"))Replace(o,"=","!")p:Else?o;p
A45941

Cells.Clear:j=0:o="":p="" '' clear the worksheet and vars
[A1:F1]=Split("4052107100422150625478207675901330514555829957419806023121389455865117429470888094459661251.2.3.5.7.11",".")
n=Left([A1],1)="-":y=Mid([A1],1-n):l=Len(y):o=IIf(l<5,Right("000"&y,4),IIf(l<31,"",String(Len(b(l-30)),94))&B(l-IIf(l<31,4,30))&y):For Each c In[B1:ZZ1]:j=j+1:p=p+IIf(c,Format(c,IIf(j>5,"000","00")),""):Next:If n Then For i=1To Len(o):c=Asc(Mid(o,i,1)):Mid$(o,i,1)=Chr(IIf(c<60,105,155)-c):Next:?IIf(l<5,"/",IIf(InStr(1,o,"="),"","*"))Replace(o,"=","!")p:Else?o;p
^^BI40521071004221506254782076759013305145558299574198060231213894558651174294708880944596612510203050711

SubPhiên bản thường lệ

Chương trình con được khai báo lấy đầu vào là năm [A1], tháng từ [B1], ngày từ [C1], giờ từ [D1], phút từ [E1], giây từ [F1]và một mảng chính xác bổ sung tùy chọn từ [G1:Z1], tính toán dấu thời gian RFC2550 và xuất ra cửa sổ ngay lập tức VBE.

Sub R(x)
a=x(0)
n=Left(a,1)="-"'<- that `"` is only there to make sure highlighting is correct
y=Mid(a,1-n)
l=Len(y)
o=IIf(l<5,Right("000"&y,4),IIf(l<31,"",String(Len(b(l-30)),94))&B(l-IIf(l<31,4,30))&y)
If n Then For i=1To Len(o):c=Asc(Mid(o,i,1)):Mid$(o,i,1)=Chr(IIf(c<60,105,155)-c):Next:o=IIf(l<5,"/",IIf(InStr(1,o,"="),"","*"))&Replace(o,"=","!")
For j=1To UBound(x)
o=o+IIf(x(j),Format(x(j),IIf(j>5,"000","00")),"")
Next
[A2]=o
End Sub
Function b(n)
While n
n=n-1
d=n Mod 26+1
n=Int(n/26)
d=d+26*(d<0):n=n-(d<0)
b=Chr(64+d)+b
Wend
End Function

Sử dụng

Nhập vào phạm vi [A1:ZZ1] có thể được thực hiện bằng tay, bằng cách nhập vào các ô, từ ngoài cùng bên phải, khi cần hoặc bằng cách gán từ cửa sổ ngay lập tức VBE.

Lưu ý, do các số tự động chuyển đổi Excel thành ký hiệu khoa học, bất kỳ số nào có độ dài cơ sở 10 bằng hoặc lớn hơn 12 chữ số phải được chèn vào ô một cách rõ ràng dưới dạng văn bản bằng cách đặt ô thành một ô văn bản hoặc bằng cách thêm chữ 'vào đầu giá trị của ô

Mẫu I / O

r Split("4052107100422150625478207675901330514555829957419806023121389455865117429470888094459661251.2.3.5.7.11",".")
?[A2]  '' <- print output to VBE console
^^BI40521071004221506254782076759013305145558299574198060231213894558651174294708880944596612510203050711 ''  <- Output

r Array("47883552573911529811831375872990","1","1","2","3","5","8","13")
?[A2]
^B478835525739115298118313758729900101020305008013

r Array("-696443266","1","3","6","10","15","21","28")
?[A2]
*V3035567330103061015021028

r Array("45941")
?[A2]
A45941

Ungolfed và giải thích

''  Returns RFC2550 timestamp corresponding to passed vars
Public Function RFC2550(ByVal pYear As String, ParamArray Extra() As Variant) As String

    ''  Declare Vars
    Dim Negative As Boolean, _
        leny As Long, _
        i As Long, _
        c As Byte, _
        s As Variant, _
        out As String

    ''  Check if year is negative and store the absolute value of the year
    Let Negative = Left(pYear, 1) = "-"
    Let pYear = Mid(pYear, 1 - Negative)

    ''  Take the length of the year
    Let leny = Len(pYear)
    If leny < 5 Then
        ''  If the length is less than 5, pad the year left to 4 characters 
        ''  using zeros
        Let out = Format("0000", pYear)
    Else
        ''  If the length of the year is greater than 30, then set out to be 
        ''  as string comprised of length-30 instances of `^`
        Let out = IIf(leny < 31, "", String(Len(Base26(leny - 30)), 94)) 
        ''  append the Base26 representation of the length of the year,
        ''  minus 30, if the length is greater than 30
        Let out = out & Base26(leny - IIf(leny < 31, 4, 30)) 
        ''  append the year to out
        Let out = out & pYear
    End If


    If Negative Then
        ''  iterate across out
        For i = 1 To Len(out)
            ''  store the char code for the current char
            Let c = Asc(Mid(out, i, 1))
            ''  swap letter/number with its inverse (0->9,A->Z)
            Mid$(out, i, 1) = Chr(IIf(c < 60, 105, 155) - c)
        Next i

        ''  replace `=` (the inverse of `^`) with `!`
        Let out = Replace(out, "=", "!")
        ''  Prepend either `/`, `*`, or nothing depending on length and 
        ''  start of out
        Let out = IIf(leny < 5, "/", IIf(InStr(1, out, "!"), "", "*")) & out
    End If

    Let i = 1
    For Each s In Extra
        ''  append all of the extra precision data - padding to 2 chars for 
        ''  the first 5 elements in the array (month, day, hour, minute and 
        ''  second) and to 3 chars for all following elements (milli, micro, 
        ''  nano, pico, femto, atto, zepto, yocto - seconds) with the char 0
        Let out = out & IIf(s, Format(s, IIf(i > 5, "000", "00")), "")
        Let i = i + 1
    Next

    ''  return out
    Let RFC2550 = out 

End Function


''  returns non-standard base26 version of input number 
''  1->A, 2->B,... 26->Z
Function Base26(ByVal n As Long) As String

    ''  declare vars
    Dim out As String, _
        digit As Integer

    ''  init out, digit
    Let out = ""
    Let digit = 0

    ''  iterate through n 
    While n
        ''  Decrement, hold the value of the digit
        Let n = n - 1
        Let digit = n Mod 26 + 1

        ''  divide by 26
        Let n = Int(n / 26)

        ''  correct for negative numbers
        If digit < 0 Then Let n = n + 1: Let digit = digit - 26

        ''  prepend char corresponding to the digit to out
        Let out = Chr(64 + digit) & out
    Wend

    ''  return out
    Let Base26 = out
End Function

2

Thạch , 165 126 byte

ḣ5ṫ€3
ØD,“^ /*!”,ØA
_µ‘l26Ċṗ@€ØAẎị@
Lµç30;€”^UZFµç4⁶;µ®L>30¤?µḟ®L>4¤?;®AṾ€¤µL=4”/x2£FiЀị€2£UF¤µ®S<0¤¡
4R¬+DU$UµḢ©Ç;Ñ;ṫ6ṫ€2$$F

Hãy thử trực tuyến!

Dòng 4 thực hiện định dạng năm với sự trợ giúp từ dòng 2 và 3. Dòng đầu tiên và cuối cùng xử lý không đệm các phần tử của đầu vào với độ dài phù hợp của chúng sau đó nối chúng với năm được định dạng.

  • _µ‘l26Ċṗ@€ØAẎị@tìm tiền tố cơ sở 26. Nó lấy sức mạnh cartesian của bảng chữ cái ( ØA) cho mỗi số từ 1 đến trần (log 26 (tầng (log 10 (năm)) - n + 1)) (trong đó n là 30 hoặc 4) sau đó được lập chỉ mục vào danh sách này với sàn (log 10 (năm)) - n ( ị@).
  • ç30;€”^UZF định dạng năm> = 10 30 ( ®L>30¤?)
  • ç4⁶;định dạng năm <10 30 . ( Chỉnh sửa : Đã lưu một byte bằng cách sử dụng ⁶;thay vì ;@⁶)
  • 1RḊ đưa ra một tiền tố trống trong nhiều năm <10 5 ( ®L>4¤?). Nó lấy danh sách các chữ số sau đó lọc ra mọi phần tử trong chính nó. Chỉ sử dụng điều này để mang lại []không làm việc ở đây. Điều này chỉ đánh giá để []. []không làm việc ở đây và tôi không thể tìm thấy 2 byte khác trả về một danh sách trống.
  • ;®AṾ€¤ nối năm vào tiền tố sau đó làm phẳng nó.
  • L=4”/xtiền tố a /nếu độ dài của năm là 4 trong câu lệnh do ®S<0¤¡.
  • 2£FiЀ¹ị€2£UF¤lấy các bổ sung của A .. Z, 0 .. 9^ /*!nếu năm là âm ( ®S<0¤¡). đề cập đến liên kết thứ hai, ØD,“^ *!”,ØAđó là danh sách [['0' .. '9'], ['^',' ','/','*','!'], ['A' .. 'Z']]. Với một năm được định dạng như ^C125...liên kết này, chỉ mục của từng ký tự trong phiên bản được làm phẳng sau đó sử dụng các chỉ số đó để xây dựng một chuỗi mới từ phiên bản được làm phẳng trong đó mỗi danh sách con được đảo ngược, tức là ['9' .. '0','!','*','/',' ','^','Z' .. 'A'], cho năng suất !X874.... /ánh xạ tới chính nó bởi vì nó được thêm tiền tố trước khi mọi thứ được bổ sung.
  • L=4a®S<0x@”/;thêm một /sự khởi đầu của năm tiêu cực trong [-9999 .. -0001]. Tôi đoán là điều này có thể được rút ngắn. Tôi đã kết thúc bao gồm điều này trong câu lệnh do ( ¡) trước đó và lưu 7 byte vì sau đó tôi không cần phải kiểm tra các năm âm hai lần.

Có rất nhiều cách sử dụng ¡trong dòng 4 và tôi nghĩ rằng chúng có thể được nén bằng cách sử dụng ?thay thế nhưng tôi không chắc làm thế nào để chúng hoạt động. Tôi đã ?làm việc và lưu một vài byte.

James Holdiness chỉ ra rằng đệ trình đầu tiên của tôi đã không xử lý nhiều năm với 30 chữ số chính xác. Hóa ra lỗi là cho bất kỳ năm nào cần Ztiền tố cơ sở 26. Hóa ra tôi không thể sử dụng vì khi bạn chuyển đổi 26 sang cơ sở 26, nó mang lại cho bạn [1,0]thay vì 26(duh). Thay vào đó tôi sử dụng các cặp theo thứ tự với sự thay thế. Tôi không nghĩ có một nguyên tử cho điều đó nhưng nếu có tôi có thể tiết kiệm một vài byte. Việc sửa lỗi này đã khiến tôi mất ~ 40 byte. Chắc chắn chương trình Jelly dài nhất của tôi chưa. Chỉnh sửa : Tìm thấy một cách ngắn hơn để làm sản phẩm cartesian. Tôi nhận ra rằng tôi không chắc chắn rằng cái cuối cùng hoạt động với tiền tố có nhiều hơn hai chữ cái nhưng cách mới vẫn hoạt động.

Xin lỗi vì đã nhiều lần tôi chỉnh sửa bài đăng này, tôi chỉ tiếp tục khám phá những cách rút ngắn nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.