このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/667
#  Cゲンガーの逆襲! 
#  スレにコントリビュートするために問題作ったよ!! 
#  64ビット変数の基数62のハッシュを作ってみよう。 
#  あぁ、別に64ビットじゃなくてもいいや。とにかく基数62のハッシュを作ってみよう。 
#  これを知っていると、例えばURLの字数短縮したりとかまぁチョイチョイ使い道がある。 
#  数学苦手だからこの程度しかできなくてごめんね。 

#  ちなみに62なのは、数字と、アルファベットの大文字小文字を全部足すと62になるから。 
#  64のほうがキリがいいよね。 

'64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :-
        atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび),
        基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値),
        writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!.

基数62のハッシュを作る(0,_,L,_ハッシュ値) :-
        atomic_list_concat(L,_ハッシュ値),!.
基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :-
        基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号),
        基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値).

基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号) :-
        _剰余 is _実 mod 62,
        _商 is _実 // 62,
        nth0(_剰余,_変換符号ならび,_変換された符号).