19日に更新してた

アフィリエイトはないよ

jupyter notebook で易占をできるようにしてみた。

コイン3枚法で作ってみました。

解説にリンクが欲しかったので、

tankyuu.net
1percent-better.com
ekikyo.net
ekikyou-dokugaku.com

の4サイトさんの爻辞へのリンクを作ってます。

こんな感じの表示になります。

import datetime
import random
import re
from IPython.display import HTML

random.seed()

# 本卦 爻
honka_raw = [[random.randint(0,1) for j in range(3)] for i in range(6)]

honka = [1 if sum(raw)>=2 else 0 for raw in honka_raw]

kou = [n for n, raw in enumerate(honka_raw) if sum(raw)==0 or sum(raw)==3 ]

# 之卦
sika = [abs(k-1) if n in kou else k for n,k in enumerate(honka) if len(kou)>0]

# 互卦
goka = honka[1:4] + honka[2:5]

# 賓卦
hinka = honka[::-1]

# 裏卦
rika = [abs(i-1) for i in honka]

ke_list = [['01', '43', '14', '34', '09', '05', '26', '11'],
          ['10', '58', '38', '54', '61', '60', '41', '19'],
          ['13', '49', '30', '55', '37', '63', '22', '36'],
          ['25', '17', '21', '51', '42', '03', '27', '24'],
          ['44', '28', '50', '32', '57', '48', '18', '46'],
          ['06', '47', '64', '40', '59', '29', '04', '07'],
          ['33', '31', '56', '62', '53', '39', '52', '15'],
          ['12', '45', '35', '16', '20', '08', '23', '02']]

ke_list2 = [['乾為天', '沢天夬', '火天大有', '雷天大壮', '風天小畜', '水天需', '山天大畜', '地天泰'],
          ['天沢履', '兌為沢', '火沢睽', '雷沢帰妹', '風沢中孚', '水沢節', '山沢損', '地沢臨'],
          ['天火同人', '沢火革', '離為火', '雷火豊', '風火家人', '水火既済', '山火賁', '地火明夷'],
          ['天雷无妄', '沢雷随', '火雷噬嗑', '震為雷', '風雷益', '水雷屯', '山雷頤', '地雷復'],
          ['天風姤', '沢風大過', '火風鼎', '雷風恒', '巽為風', '水風井', '山風蠱', '地風升'],
          ['天水訟', '沢水困', '火水未済', '雷水解', '風水渙', '坎為水', '山水蒙', '地水師'],
          ['天山遯', '沢山咸', '火山旅', '雷山小過', '風山漸', '水山蹇', '艮為山', '地山謙'],
          ['天地否', '沢地萃', '火地晋', '雷地豫', '風地観', '水地比', '山地剥', '坤為地']]

ke_list3 = ['keniten',
 'koniti',
 'suiraityun',
 'sansuimou',
 'suitenzyu',
 'tensuisyou',
 'tisuisi',
 'suitihi',
 'fuutensyoutiku',
 'tentakuri',
 'titentai',
 'tentihi',
 'tenkadouzin',
 'katentaiyuu',
 'tizanken',
 'raitiyo',
 'takuraizui',
 'sanpuuko',
 'titakurin',
 'fuutikan',
 'karaizeigou',
 'sankahi',
 'santihaku',
 'tiraifuku',
 'tenraimumou',
 'santentaitiku',
 'sanraii',
 'takufuutaika',
 'kanisui',
 'riika',
 'takuzankan',
 'raifuukou',
 'tenzanton',
 'raitentaisou',
 'katisin',
 'tikameii',
 'fuukakazin',
 'katakukei',
 'suizanken',
 'raisuikai',
 'santakuson',
 'fuuraieki',
 'takutenkai',
 'tenpuukou',
 'takutisui',
 'tifuusyou',
 'takusuikon',
 'suifuusei',
 'takkakaku',
 'kafuutei',
 'sinirai',
 'gonisan',
 'fuuzanzen',
 'raitakukimai',
 'raikahou',
 'kazanryo',
 'sonifuu',
 'daitaku',
 'fuusuikan',
 'suitakusetu',
 'fuutakutyuufu',
 'raizansyouka',
 'suikakisei',
 'kasuibisei']

ke_list4 = ['36_meii',
 '9_shouchiku',
 '5_ju',
 '33_ton',
 '62_shoka',
 '41_son',
 '8_hi',
 '29_kan',
 '26_taichiku',
 '16_yo',
 '19_rin',
 '54_kimai',
 '3_chun',
 '15_ken',
 '11_tai',
 '47_kon',
 '43_kai',
 '20_kan',
 '34_taiso',
 '28_taika',
 '7_shi',
 '40_kai',
 '61_chufu',
 '38_kei',
 '24_fuku',
 '46_shou',
 '39_ken',
 '6_shou',
 '44_kou',
 '45_sui',
 '50_tei',
 '60_setsu',
 '22_hi',
 '48_sei',
 '56_ryo',
 '42_eki',
 '2_kon',
 '25_mubo',
 '59_kan',
 '53_zen',
 '4_mou',
 '32_kou',
 '12_hi',
 '1_ken',
 '55_hou',
 '51_shin',
 '64_bisei',
 '17_zui',
 '14_taiyu',
 '13_doujin',
 '37_kajin',
 '21_zeigou',
 '58_da',
 '35_shin',
 '49_kaku',
 '57_son',
 '30_ri',
 '18_ko',
 '23_haku',
 '63_kisei',
 '27_i',
 '31_kan',
 '10_ri',
 '52_gon']

hatike=[[1, 1, 1],
         [1, 1, 0],
         [1, 0, 1],
         [1, 0, 0],
         [0, 1, 1],
         [0, 1, 0],
         [0, 0, 1],
         [0, 0, 0]]

hatike_list=[['乾', 'https://ekikyo.net/8ka/ken.html'],
             ['兌', 'https://ekikyo.net/8ka/da.html'],
             ['離', 'https://ekikyo.net/8ka/ri.html'],
             ['震', 'https://ekikyo.net/8ka/sin.html'],
             ['巽', 'https://ekikyo.net/8ka/son.html'],
             ['坎', 'https://ekikyo.net/8ka/kan.html'],
             ['艮', 'https://ekikyo.net/8ka/gon.html'],
             ['坤', 'https://ekikyo.net/8ka/kon.html']]

def hatikeHTML(list_in):
    return f'<a href="{hatike_list[hatike.index(list_in[:3])][1]}"target="_blank">{hatike_list[hatike.index(list_in[:3])][0]}</a>',f'<a href="{hatike_list[hatike.index(list_in[3:])][1]}"target="_blank">{hatike_list[hatike.index(list_in[3:])][0]}</a>'

def ekikyonet(list_in):
    return f'<a href="https://ekikyo.net/64ka/{ke_list[hatike.index(list_in[:3])][hatike.index(list_in[3:])]}.html"target="_blank">{ke_list2[hatike.index(list_in[:3])][hatike.index(list_in[3:])]}</a>'

def ekikyodokugaku(list_in,k1='',k2=''):
    return f'<a href="https://ekikyou-dokugaku.com/{ke_list3[int(ke_list[hatike.index(list_in[:3])][hatike.index(list_in[3:])])-1]}{k1}.html"target="_blank">{ke_list2[hatike.index(list_in[:3])][hatike.index(list_in[3:])]}{k2}</a>'

def tankyuunet(list_in):
    return f'<a href="https://tankyuu.net/eki/iching{int(ke_list[hatike.index(list_in[:3])][hatike.index(list_in[3:])])}.html"target="_blank">{ke_list2[hatike.index(list_in[:3])][hatike.index(list_in[3:])]}</a>'

def one_percent(list_in):
    list_out = ke_list[hatike.index(list_in[:3])][hatike.index(list_in[3:])]
    if list_out[0] == "0":
        list_out = list_out[1:]        
    for t in ke_list4:
        if re.match(list_out+"_",t):
            return f'<a href="https://1percent-better.com/oriental_wisdom/iching/hexagram/{t}/"target="_blank">{ke_list2[hatike.index(list_in[:3])][hatike.index(list_in[3:])]}</a>'
    

if len(kou)>0:
    koudic={0:'初',
           1:'二',
           2:'三',
           3:'四',
           4:'五',
           5:'上',}
    if len(kou)==1:
        kou_text=f' {koudic[kou[0]]}爻'
        kou4=kou[0]+1
    else:
        kou_text=''
        kou4=''
        
    kou3=''
    for s in kou:
        kou3 = kou3 + koudic.get(s) +" "
    sikaHTML=f'<tr><td>之卦</td>\
    <td>{tankyuunet(sika)}</td>\
    <td>{one_percent(sika)}</td>\
    <td>{ekikyonet(sika)}</td><td>{kou3}爻変</td>\
    <td>{ekikyodokugaku(sika)}</td>\
    <td>今後の状態</td>\
    <td>{hatikeHTML(sika)[1]}</td><td>{hatikeHTML(sika)[0]}</td></tr>'
    
else:
    kou=''
    kou_text=''
    sikaHTML=''
    kou4=''

sinreki=[str(s).zfill(2) for s in [19,11,34,43,1,44,33,12,20,23,2,24]]
kyuureki=(sinreki+sinreki)[1:13]
if ke_list[hatike.index(honka[:3])][hatike.index(honka[3:])] in sinreki:
    syousoku=f'新暦 {1+sinreki.index(ke_list[hatike.index(honka[:3])][hatike.index(honka[3:])])}月、旧暦 {1+kyuureki.index(ke_list[hatike.index(honka[:3])][hatike.index(honka[3:])])}月'
else:
    syousoku=''

def printhtml():
    display(HTML(f'<h3>{datetime.datetime.now()}</h3>\
    <h1>{naiyou}</h1>\
    <table>\
    <tr>\
    <td></td>\
    <td>tankyuu.net</td>\
    <td>1percent-better.com</td>\
    <td>ekikyo.net</td><td></td>\
    <td>ekikyou-dokugaku.com</td>\
    <td>{syousoku}</td>\
    <td>上爻</td><td>下爻</td>\
    </tr>\
    <tr>\
    <td>本卦</td>\
    <td>{tankyuunet(honka)}</td>\
    <td>{one_percent(honka)}</td>\
    <td>{ekikyonet(honka)}</a></td><td>{kou_text}</td>\
    <td>{ekikyodokugaku(honka,k1=kou4,k2=kou_text)}</td>\
    <td>今の状態</td>\
    <td>{hatikeHTML(honka)[1]}</td><td>{hatikeHTML(honka)[0]}</td>\
    </tr>\
    {sikaHTML}\
    <tr>\
    <td>互卦</td>\
    <td>{tankyuunet(goka)}</td>\
    <td>{one_percent(goka)}</td>\
    <td>{ekikyonet(goka)}</td><td></td>\
    <td>{ekikyodokugaku(goka)}</a></td>\
    <td>今の補足</td>\
    <td>{hatikeHTML(goka)[1]}</td><td>{hatikeHTML(goka)[0]}</td>\
    </tr>\
    <tr>\
    <td>賓卦</td>\
    <td>{tankyuunet(hinka)}</td>\
    <td>{one_percent(hinka)}</td>\
    <td>{ekikyonet(hinka)}</td><td></td>\
    <td>{ekikyodokugaku(hinka)}</td>\
    <td>相手の状態</td>\
    <td>{hatikeHTML(hinka)[1]}</td><td>{hatikeHTML(hinka)[0]}</td></td>\
    </tr>\
    <tr><td>裏卦</td>\
    <td>{tankyuunet(rika)}</td>\
    <td>{one_percent(rika)}</td>\
    <td>{ekikyonet(rika)}</td><td></td>\
    <td>{ekikyodokugaku(rika)}</a></td>\
    <td>裏の意味</td>\
    <td>{hatikeHTML(rika)[1]}</td><td>{hatikeHTML(rika)[0]}</td>\
    </tr>\
    </table>'))

# 内容
naiyou="ここに占いたい内容を書く"

printhtml()

リンク周りを書くにあたっては seleniumスクレイピングしてきたリンクアドレスをリスト化しております。

いろいろと書き直したらもうちょっとスマートになると思うのですが、とりあえず動くのでよしとして、よくわからない課金?サイトにいかなくて良くなったので良かった良かった。

ちなみに Google Colaboratory で動かしたら、re.match がうんたら言って動かなかったのでオンプレミスで*1

*1:よくわかっていないけれど、オンプレミスって言ってみたかった。