全然関係ないけどFlickrの短縮URLの理屈がわかった。Base58だ
n = 8348087410
a = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
e = ""
while n != 0:
e = a[n % 58] + e
n //= 58
print("https://flic.kr/p/ " + e)
後学のために,Juliaに翻訳してみた。
n = 8348087410
a = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
e = ""
while n != 0
m = n % 58 +1
e = a[m:m] * e
n = n ÷ 58
end
print("flic.kr/p/" * e)
その過程で,Pythonの文法を調べようとしたところ,KEKの山本昇さんのPython入門(初級編)リリース0.1がひっかかった。山本昇さんは阪大理学部の森田研の隣の内山研に在席しており,私の2学年下かな。素粒子の理論の研究室では当時かなり珍しいことであったのだが,修論でコンピュータを使ったシミュレーションを行っていたのが印象深い。Lattice QCDなどがはやる前です。
さて,Juliaに翻訳する際の主な注意
(1) Juliaでは文字列定数は文字定数の配列になるので,データを1文字の文字列として取り出したい場合は,m:m のような範囲指定をする必要がある。
(2) Juliaでは文字列定数の配列は添字が1から始まる(Pythonでは0から)。そのために nを58で割った剰余に1を加えている。
(3) Juliaでは文字列の結合には * を用いる(Pythonでは + )。
(4) Juliaでは整数の除算には÷を用いる(Pythonでは // )。
(5) JuliaではWhileなどの制御文は end で閉じる。字下げも不要である。
ついでに,逆変換のプログラムも考える。
(6) Juliaでは文字列eの頭を削るには strip(e, e[1])とする。
(7) Juliaでは文字列eの頭の文字を切り出すには first(e)とする。
(8) Juliaでは文字列aと文字cのマッチする添字を得るには findfirst(isequal(c),a)とする。
これらから,
function frickr(key)
e = " "*key
a = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
n = 0
while e != ""
n = n * 58
e = strip(e,e[1])
m = findfirst(isequal(first(e)),a)
n = n + m - 1
# println((m,n,e))
if length(e)==1
return n
end
end
end
frickr("dHG8xy")
8348087410
ついでに,逆変換のプログラムも考える。
(6) Juliaでは文字列eの頭を削るには strip(e, e[1])とする。
(7) Juliaでは文字列eの頭の文字を切り出すには first(e)とする。
(8) Juliaでは文字列aと文字cのマッチする添字を得るには findfirst(isequal(c),a)とする。
これらから,
function frickr(key)
e = " "*key
a = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
n = 0
while e != ""
n = n * 58
e = strip(e,e[1])
m = findfirst(isequal(first(e)),a)
n = n + m - 1
# println((m,n,e))
if length(e)==1
return n
end
end
end
frickr("dHG8xy")
8348087410
0 件のコメント:
コメントを投稿