RFC 2550タイムスタンプを計算する


26

RFC 2550は、任意の日付をサポートできるタイムスタンプのスペース効率のよいASCII表現(1999年4月1日公開)の​​風刺的な提案です(宇宙の始まりより前のものと宇宙の予測された終わりより後のものも含む)。(: -万の手段すべてに0すべての範囲は、開始が含まれるが、最後を除外ノートを次のようにRFC 2550準拠のタイムスタンプを計算するためのアルゴリズムがあります):n0 <= n < 10000

  • 年の形式
    • 0〜10,000年:左にゼロが埋め込まれた4桁の10進数。
    • 年10,000〜100,000:文字Aを前に付けた5桁の10進数。
    • 年100,000〜10 30:年の10 進数。英語のアルファベットのインデックスが10進数の年の桁数から5を引いたものに等しい大文字のASCII文字を先頭に付けます(6桁の年の場合はB、7の場合はC桁の年など)。
    • 年10 30 10 56 10 10,000と同じフォーマット:30、Aとの上に文字を開始し、さらにキャレット(接頭辞^年10ように(文字列に)30で表され^A1000000000000000000000000000000、年が10 31が表されていますによります^B10000000000000000000000000000000)。
    • 年間10 56 10への732:今年は2つのキャレットと文字の大文字2つのASCIIで付けられます。大文字は、年の桁数から57を引いた26を底とする数値を形成します。
    • 年10 732は、以降:10に対して同じフォーマット56 10へ732は、必要な場合、追加のキャレットと大文字を追加して延びる、使用されています。
    • BCE年(0年より前):年の絶対値の年文字列を計算します。次に、すべての文字を基数26の補数(A <-> Z、B <-> Yなど)に置き換え、すべての数字を基数10の補数(0 <-> 9、1 <-> 8、など)、キャレットを感嘆符(!)に置き換えます。年の文字列が4桁以下(つまり、-1〜-10,000)の場合は、スラッシュ(/)を先頭に追加します。年の文字列の前にスラッシュまたは感嘆符が付いていない場合は、アスタリスク(*)を付加します。
  • 月、日、時間、分、秒:これらの値は最大でも2桁であるため、年の文字列の右側に、重要度の高い順に単純に追加され、必要に応じてゼロで左詰めされます2桁の文字列。
  • 追加の精度:追加の精度(ミリ秒、マイクロ秒、ナノ秒などの形式)が必要な場合、これらの値はゼロで左詰めされ、3桁になります(各値は1/1000前の値であり、最大でであるため999)タイムスタンプの最後に、重要度の高い順に追加されます。

この形式には、対応するタイムスタンプの数値ソートと同等の字句ソートの利点があります-時刻Aが時刻Bの前に来ると、字句ソートが適用されるときにAのタイムスタンプがBのタイムスタンプの前になります。

チャレンジ

任意の長さの数値のリスト(重要度の降順の時間値に対応するなど[year, month, day, hour, minute, second, millisecond])を指定すると、対応するRFC 2550タイムスタンプを出力します。

ルール

  • ソリューションは、任意の入力に対して機能する必要があります。唯一の制限は、時間と使用可能なメモリです。
  • 入力は、合理的で便利な形式(数値のリスト、文字列のリスト、単一の非数字文字で区切られた文字列など)で取得できます。
  • 入力には常に少なくとも1つの値(年)が含まれます。追加の値は常に重要度の降順です(たとえば、入力に月の値のない日の値、または月の値が続く2番目の値が含まれることはありません)。
  • 入力は常に有効な時間です(たとえば、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マイナス月を発明するまで。ネゲバー。
メゴ

1
@TaylorScott 追加の精度:追加の精度(ミリ秒、マイクロ秒、ナノ秒などの形式)が必要な場合、それらの値にはゼロが3桁で左詰めされます。
メゴ

2
質問で与えられた仕様が実際にRFC2550と一致しないように思えます。私が理解しているように、3つのキャレットを超えると、フィボナッチシリーズから派生しているため、文字数はキャレットよりも速く増加するはずです(4つのキャレットは5文字を意味し、5つのキャレットは8文字を意味します) RFCのその側面を無視すべきだと仮定しますか?
ジェームズホルダーネス

1
@JamesHoldernessあなたは正しい、私は仕様を台無しにした。ただし、無効になる回答が既にあるため、修正するには遅すぎます。
メゴ

回答:


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完了。また、入り込んだ誤字を修正しました(行の折り返しが混乱したため、コピーして貼り付けるときに誤ってコードの一部を削除しました。おっと。)
ニール

3

Befunge、418 384バイト

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

パール5328 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;}

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;:先行文字(base-26からアルファベット変換)
      • r+=p;:結果ストリングに年自体を追加します
      • if(f>0){:年が負の場合:
        • x=t<5?"/":t<32?"*":r.replace("^","!").replaceAll("[^!]","");x正しい/*または1つまたは複数の一時文字列を作成します!
        • 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.).-入力を数値のリストとして受け取り、コストのかかる分割と変換をスキップできます。
メゴ

1
@Mego残念ながら、デフォルトの数値(long64ビットが最大)は、一部の入力に対してJavaでは小さすぎるためString、より短くなりjava.math.BigIntegerます。Stringただし、これを-arrayに変更したので、ドットで分割する必要はありませんでした。
ケビンCruijssen

2

Excel VBA、500 486 485 470バイト

匿名VBEイミディエイトウィンドウ関数

年から[A1]、月から[B1]、日から[C1]、時間から[D1]、分から[E1]、秒、[F1]およびオプションの追加の精度配列として入力を受け取る匿名VBEイミディエイトウィンドウ関数は[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

使用法

明確なモジュールに使用されなければならない、またはモジュールはVARSとして、実行前にクリアしなければならないjopのコードの実行の開始時にデフォルト、初期化されていない状態であると想定されています。以下のためjである、Variant\Integer変数は、このデフォルト値がある0とのためopされている、Variant\String変数、このデフォルト値は空の文字列です("")。

文字列の配列である入力1:1はActiveSheet から取得され、出力は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が数値を科学表記法に自動変換するため、セルをテキストセルに設定するか、12桁以上の基数10の数値をテキストとしてセルに明示的に挿入するか、'セルの値の先頭にリテラルを追加することにより

サンプル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のプレフィックスを見つけます。ØA1からceil(log 26(floor(log 10(year))-n + 1))(nは30または4のいずれか)までの各数値に対して、アルファベットのデカルトパワー()を取り、このリストにインデックスを取得しますfloor(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ある2番目のリンクを参照します[['0' .. '9'], ['^',' ','/','*','!'], ['A' .. 'Z']]^C125...このリンクのようなフォーマットされた年では、のフラット化されたバージョンで各文字のインデックスを見つけ、それらのインデックスを使用して、各サブリストが反転するフラット化されたバージョンから新しい文字列を作成['9' .. '0','!','*','/',' ','^','Z' .. 'A']!X874...ます。/すべてが補完される前に接頭辞が付けられるため、それ自体にマッピングされます。
  • L=4a®S<0x@”/;/で負の年の始まりにa を追加し[-9999 .. -0001]ます。私の推測では、これは短くすることができます。前回のdoステートメント(¡)にこれを含めることになり、マイナスの年を2回テストする必要がなかったため、7バイトを節約しました。

¡行4 には多くの用途があり、?代わりに使用することで圧縮できると思いますが、それらを機能させる方法はわかりません。私は持って?仕事にして数バイトを救いました。

ジェームス・ホルダーネスは、私の最初の提出は30桁の正確さで何年も処理しなかったことを指摘しました。バグはZ、ベース26の接頭辞が必要な任意の年のものであることが判明しました。26をbase 26に変換すると[1,0]26(duh)の代わりに得られるため、使用できませんでした。代わりに、交換用の注文ペアを使用しました。そのためのアトムはないと思いますが、もしあれば、数バイト節約できます。これを修正すると、約40バイトのコストがかかりました。間違いなくこれまでで一番長いJellyプログラム。編集:デカルト積を行うより短い方法を見つけました。とにかく、最後の文字が2文字以上のプレフィックスで機能するかどうかわからなかったが、新しい方法は機能することがわかった。

この投稿を何度も編集して申し訳ありませんが、短縮する方法を発見し続けています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.