计算RFC 2550时间戳


26

RFC 2550是一个讽刺性提案(于1999年4月1日发布),其时间戳可以节省空间的ASCII表示形式,可以支持任何日期(甚至包括在Universe开始之前的日期以及在Universe预计结束之后的日期)。用于计算符合RFC 2550时间戳是作为算法如下(注意:所有范围包括开始,但排除端- 0至10000的所有的装置n,其中0 <= n < 10000):

  • 年份格式
    • 0到10,000年:一个四位数的十进制数字,在左边用零填充。
    • 10,000到100,000年:5位数的十进制数字,以字符A为前缀。
    • 100,000至10 30年:年份的十进制数字,以大写ASCII字母为前缀,其英文字母的索引等于十进制年份的位数,减5(B代表6位数字的年份,C代表7的年份)位数年份等)。
    • 10 30到10 56年:与10,000到10 30相同的格式,以A开头的字母,并^在字符串前面加上插入号()(因此,10 30表示为^A1000000000000000000000000000000,10 31表示为通过^B10000000000000000000000000000000)。
    • 10 56到10 732年:年份以两个插入符号和两个ASCII大写字母为前缀。大写字母组成一个以26为基数的数字,代表年份中的数字数量,减去57。
    • 10 732年及以后:使用10 56到10 732的相同格式,并在必要时通过添加附加的脱字号和大写字母来扩展格式。
    • BCE年(0年之前):计算年的绝对值的年字符串。然后,将所有字母替换为其以26为底的补码(A <-> Z,B <-> Y等),将所有数字替换为其以10为底的补码(0 <-> 9、1 <-> 8,等),并用感叹号(!)替换插入符号。如果年份字符串是4位或更少(即-1到-10,000),请在正斜杠(/)之前加上。如果年份字符串未以正斜杠或感叹号作为前缀,请在星号(*)前面加上。
  • 月,日,小时,分钟和秒:由于这些值最多只能是2位数字,因此它们按重要性的降序简单地附加在年份字符串的右边,并在必要时用零填充2位数字的字符串。
  • 更高的精度:如果需要更高的精度(以毫秒,微秒,纳秒等形式),则将这些值用0到3位数字进行左填充(因为每个值都是1/1000前一个值,因此最多为999)。并以重要性从小到大的顺序附加到时间戳的末尾。

这种格式的优点是词法排序等效于相应时间戳的数字排序-如果时间A在时间B之前,那么当应用词法排序时,A的时间戳将在B的时间戳之前。

挑战

给定任意长的数字列表(例如[year, month, day, hour, minute, second, millisecond],按重要性从高到低的顺序对应于时间值),请输出相应的RFC 2550时间戳。

规则

  • 解决方案必须适用于任何给定的输入。唯一的限制应该是时间和可用内存。
  • 输入可以采用任何合理,方便的格式(例如,数字列表,字符串列表,由单个非数字字符分隔的字符串等)。
  • 输入将始终包含至少一个值(年份)。附加值始终按重要性降序排列(例如,输入将永远不包含无月值的日值,或第二个值后跟月值)。
  • 输入将始终是有效时间(例如,2月30日将没有任何时间戳记)。
  • 禁止计算RFC 2550时间戳的内建函数。

例子

这些示例将输入作为单个字符串使用,各个值之间用句点(.)分隔。

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

参考实施

#!/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应该*V3035567339896938984978971吗?
尼尔

11
@Neil直到我们发明负数月份。Negember。
Mego

1
@TaylorScott 附加精度:如果需要附加精度(以毫秒,微秒,纳秒等形式),则将这些值用零填充到3位。
Mego,

2
在我看来,问题中给出的规范实际上与RFC2550不匹配。据我了解,一旦您经过三个插入符号,字母的数量应该比插入符号的数量增加得更快,因为它是从斐波那契数列衍生而来的(4个插入符号表示5个字母,5个插入符号表示8个字母,依此类推)。假设我们应该忽略RFC的那个方面?
James Holderness '18年

1
@JamesHolderness你是对的,我搞砸了规格。但是,现在纠正它为时已晚,因为已经有可能无效的答案。
Mego

Answers:


5

JavaScript(ES6),325个字节

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>

令人震惊的长。


您介意添加堆栈代码段以便于测试吗?
Mego,2016年

@Mego完成。还修复了一些拼写错误(由于换行使我困惑,我在复制和粘贴时不小心删除了一些代码。糟糕!)
Neil

3

Befunge,418384字节

很难预先知道Befunge程序可能会结束多大,而当我开始从事这项工作时,我认为它实际上可能有竞争的机会。原来我错了。

~: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-:^

在线尝试!


3

Perl 5中328 322 317 301 + 1(-a)= 302个字节

$_=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

在线尝试!

不打高尔夫球

$_=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字节

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;}

输入as String-array和return-type作为String

事实证明它很长(如预期),但肯定可以打更多的球。我很高兴在摆弄了一段时间后它可以工作了。

在这里尝试。

说明:

  • for(String p:s){:循环零件
    • if(p.charAt(0)<46){p=p.substring(1);f=1;}:确定是否为负,如果为负,则删除减号并设置标志以减少字节
    • t=p.length();:获取位数
    • if(i++<1){:如果是第一个数字(年份):
      • t<5?"000".substring(t-1):如果是0-100,000(不包括):则在必要时添加前导零
      • t<32?(char)(t+60):如果是100,000-10 30(不包括):添加前导字母
      • t<58?"^"+(char)(t+34):如果是10 30 -10 732(不包括):添加文字"^"+前导字母
      • 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;:前导字母(以26为基数到字母转换)
      • r+=p;:将年份本身添加到结果字符串中
      • if(f>0){:如果年份为负数:
        • x=t<5?"/":t<32?"*":r.replace("^","!").replaceAll("[^!]","");x使用正确的/*一个或多个创建临时字符串!
        • for(char c c:r.toCharArray())x+=c>93?"":"ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210".charAt((z+y).indexOf(c));:进行转换(A↔Z,B↔Y,0↔9、1↔8等)
        • r=x;:然后将结果设置为此临时字符串 x
    • else:如果是月,日,小时,分钟,秒,毫秒,微秒,纳秒或更小:
      • i>6?t<2?"00"+p:t<3?0+p:p:如果毫秒或更小:如有必要,添加前导零
      • :t<2?0+p:p;:其他(月,日,小时,分钟,秒):如有必要,添加单个前导零
  • return r:返回结果

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.).-您可以将输入作为数字列表,而无需进行昂贵的拆分和转换。
Mego,

1
@Mego不幸的是long,对于某些输入,Java中的默认数字(最大64位)太小,因此String比短java.math.BigInteger。我确实将其更改为String-array,所以我不需要按点分割,节省了一些字节,所以谢谢。
凯文·克鲁伊森

2

Excel VBA中,500 486 485 470个字节

匿名VBE立即窗口功能

匿名VBE即时窗口函数,将输入作为年份,从[A1]年月开始[B1],从天开始[C1],从天开始,从小时开始[D1],从分钟开始[E1],从分钟开始,从秒开始[F1],从中[G1:Z1]选出一个额外的精度数组,计算RFC2550时间戳并将其输出到VBE立即窗口。在下面利用已声明的辅助函数。

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

辅助功能

声明的辅助函数,该函数接受输入数字并以26为底的基数返回该数字,使得1->A26->Z

必须放置在公共模块中。

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

用法

必须在clear模块中使用,或者必须在执行之前以vars的形式清除该模块jop假定它们在代码执行开始时处于默认的未初始化状态。对于j,这是一个Variant\Integer变量,该默认值是0,对于op,这是Variant\String变量,该默认值是空字符串("")。

输入(字符串数组)从1:1ActiveSheet上获取,输出到VBE立即窗口。

样品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

Sub常规版

声明的子例程将输入作为年份[A1],从年开始,从月开始[B1],从天开始[C1],从小时开始[D1],从分钟开始[E1],从分钟开始,从秒开始,从中输入[F1]一个可选的额外精度数组[G1:Z1],以计算RFC2550时间戳并将其输出到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

用法

[A1:ZZ1]可以根据需要手动输入范围,也可以根据需要从最左边到最右边键入单元格,也可以通过从VBE立即窗口分配来进行输入。

值得注意的是,由于Excel将数字自动转换为科学计数法,因此任何以10为基数的长度等于或大于12位数字的数字都必须通过将单元格设置为文本单元格或将单元格显式地插入文本单元格中。通过将文字'放在单元格值的开头

样品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

脱胎换骨和解释

''  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

果冻165126字节

ḣ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

在线尝试!

第4行在第2行和第3行的帮助下进行年份格式化。第一行和最后一行处理将输入元素零填充到适当的长度,然后将它们与格式化的年份连接起来。

  • _µ‘l26Ċṗ@€ØAẎị@查找以26为前缀的前缀。ØA对于介于1和ceil之间的每个数字,它采用字母()的笛卡尔幂(log 26(floor(log 10(year))-n + 1))(其中n为30或4),然后将索引添加到此列表中底数(log 10(年))-n(ị@)。
  • ç30;€”^UZF 格式年份> = 10 30®L>30¤?
  • ç4⁶;格式<10 30年。(编辑:使用⁶;代替保存了一个字节;@⁶
  • 1RḊ 给出年份<10 5®L>4¤?)的空前缀。它获取数字列表,然后过滤掉自身中的每个元素。只使用它来产生,[]因为在这里不起作用。 这只是计算为[]并且[]在这里不工作,我找不到另外2个字节返回空列表。
  • ;®AṾ€¤ 将年份附加到前缀,然后将其展平。
  • L=4”/x/如果年份的长度在的do语句中为4,则前缀a ®S<0¤¡
  • 2£FiЀ¹ị€2£UF¤取的补数A .. Z0 .. 9并且^ /*!如果年份为负数(®S<0¤¡)。指第二个链接,ØD,“^ *!”,ØA即列表[['0' .. '9'], ['^',' ','/','*','!'], ['A' .. 'Z']]。对于像^C125...这样的格式化年份,此链接在展平版本中查找每个字符的索引,然后使用这些索引从每个子列表均被反转的展平版本构造新字符串,即['9' .. '0','!','*','/',' ','^','Z' .. 'A']yield !X874.../映射到自身,因为它在所有内容都补完之前就已加上前缀。
  • L=4a®S<0x@”/;在中添加/负数的开始[-9999 .. -0001]。我的猜测是这可以缩短。我最终在前一个do语句(¡)中包含了这个字节,并节省了7个字节,因为这样我就不需要两次测试负数年。

¡第4行有很多用途,我认为可以通过使用?来压缩它们,但我不确定如何使它们起作用。我开始?工作并保存了一些字节。

詹姆斯·霍尔德内斯(James Holderness)指出,我的第一次提交没有用30位正确数字处理年份。原来,该错误适用于任何需要以Z26为前缀的前缀的年份。事实证明我无法使用,因为当您将26转换为26时,它会[1,0]代替26(duh)。相反,我使用有序对替换。我认为这不是一个原子,但是如果存在,我可以节省一些字节。解决这个问题最终花费了我约40个字节。绝对是我最长的果冻程序。编辑:找到了一种做笛卡尔积的较短方法。我意识到我不确定最后一个是否可以为两个以上字母组成的前缀工作,但是新方法是否有效。

很抱歉,我编辑了这篇文章很多次,我一直在寻找缩短它的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.