2019年1月31日木曜日

Flickrの短縮URL

Twitterで奥村晴彦さんがつぶやいている。これはたぶんPythonかなと思ったらそのようである。以下引用。
全然関係ないけど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

0 件のコメント: