伊深の隠れ家

備忘録かも~

POKEMON WORDLE(ポケモンWordle)の最適解導出プログラム

wordle.mega-yadoran.jp

ポケモンWordleなるものの最適解を自動で計算してくれるプログラムを
pythonの練習がてら書いてみました。

自己流なので記法とかヤバいから、マナー違反な書き方だとか
「ここはこうした方が効率がいい」とか色々意見が噴出しそう。

上記のものを解くために書いたけれど、
普通のWordleも解けるはず。辞書えぐそうだけど。

import numpy as np
global names_copy

#==============================
def shakeOff(names):
    tmp = np.array([])
    for i in range(len(names)):
        if len(names[i]) == 5:
            tmp = np.append(tmp, names[i])
    return(tmp)
#==============================
def analyse_frequency(names):
    # get_all_characters_and_unique_characters
    all_characters = np.array([])
    for i in range(len(names)):
        for j in range(5):
            all_characters = np.append(all_characters,names[i][j])
    unique_characters = np.array([])
    unique_characters = np.unique(all_characters)

    # create_array
    analysis_result = np.array([])
    for i in range(len(unique_characters)):
        analysis_result = np.append(analysis_result,unique_characters[i])
        analysis_result = np.append(analysis_result,0)
        analysis_result = np.append(analysis_result,0)
    analysis_result = np.array(analysis_result).reshape(-1, 3)

    # get_frequency_and_get_maximum_value
    maximum_value=1
    for i in range(len(analysis_result)):
        character = analysis_result[i][0]
        analysis_result[i][1] = np.count_nonzero(all_characters == character)
        if maximum_value < int(analysis_result[i][1]):
            maximum_value = int(analysis_result[i][1])

    # get_score
    i=0
    for i in range(len(analysis_result)):
        analysis_result[i][2] = round(int(analysis_result[i][1])/maximum_value*100)   
    return(analysis_result)

def find_candidate(analysis_result):
    # create_array
    names_and_scores = np.array([])
    for i in range(len(names)):
        names_and_scores = np.append(names_and_scores,names[i])
        names_and_scores = np.append(names_and_scores,0)
    names_and_scores = np.array(names_and_scores).reshape(-1, 2)

    # get_score
    for i in range(len(analysis_result)):
        for j in range(len(names_and_scores)):
            if analysis_result[i][0] in names_and_scores[j][0]:
                names_and_scores[j][1] =int(names_and_scores[j][1]) + int(analysis_result[i][2])

    # find_maximum_score
    scores = np.array([])
    scores = names_and_scores[:, 1].astype(np.int64)
    score_index = np.argmax(scores)
    candidate = names_and_scores[score_index][0]
    return(candidate)
#==============================
def get_match_status():
    print('')
    print('一致状況を入力してください')
    print('0:不一致(灰色)、1:文字一致(橙色)、2:一致(緑色)')
    print('(例):灰橙灰緑灰 → 01020')
    while True:
        try:
            status_code = int(input())
            if status_code < 0:
                status_code = 'ERROR'
                status_code = int(status_code)
            status_code = str(status_code).zfill(5)
            if len(status_code) != 5:
                status_code = 'ERROR'
                status_code = int(status_code)
            for i in range(3,10):
                if status_code.find(str(i)) != -1:
                    status_code = 'ERROR'
                    status_code = int(status_code)
            break
        except ValueError:
            print('入力されたステータスの値が不正です')
            print('')
    return(status_code)
#==============================
def update_names(names):
    names_tmp = np.array([])
    status_table = np.array([])

    for i in range(5):
        status_table = np.append(status_table, candidate[i])
    for i in range(5):
        status_table = np.append(status_table, match_status[i])
    status_table = np.array(status_table).reshape(2, 5)
    
    for i in range(5):
        if status_table[1][i] == '0':
            unuse_character = status_table[0][i]
            for j in range(len(names)):
                if unuse_character not in names[j]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])
        if status_table[1][i] == '1':
            use_character = status_table[0][i]
            for j in range(len(names)):
                if use_character in names[j]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])              

            for j in range(len(names)):
                if use_character not in names[j][i]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])
        if status_table[1][i] == '2':
            use_character = status_table[0][i]
            for j in range(len(names)):
                if use_character in names[j][i]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])
    return(names)
# ==============================

# ダイパまで
names = np.array(['フシギダネ', 'フシギソウ', 'フシギバナ', 'リザードン', 'カメックス', 'キャタピー', 'トランセル', 'バタフリー', 'ピジョット', 'オニスズメ', 'オニドリル', 'アーボック', 'ピカチュウ', 'ライチュウ', 'サンドパン', 'ニドラン♀', 'ニドリーナ', 'ニドクイン', 'ニドラン♂', 'ニドリーノ', 'ニドキング', 'キュウコン', 'ゴルバット', 'ナゾノクサ', 'クサイハナ', 'ラフレシア', 'パラセクト', 'モルフォン', 'ダグトリオ', 'ペルシアン', 'ゴルダック', 'オコリザル', 'ウインディ', 'ニョロボン', 'ユンゲラー', 'フーディン', 'ワンリキー', 'ゴーリキー', 'カイリキー', 'マダツボミ', 'ウツボット', 'メノクラゲ', 'ドククラゲ', 'イシツブテ', 'ゴローニャ', 'ギャロップ', 'レアコイル', 'ドードリオ', 'ベトベター', 'ベトベトン', 'シェルダー', 'パルシェン', 'スリーパー', 'キングラー', 'ビリリダマ', 'マルマイン', 'サワムラー', 'エビワラー', 'ベロリンガ', 'マタドガス', 'サイホーン', 'モンジャラ', 'トサキント', 'アズマオウ', 'ヒトデマン', 'スターミー', 'バリヤード', 'ストライク', 'ルージュラ', 'ケンタロス', 'コイキング', 'ギャラドス', 'シャワーズ', 'サンダース', 'ブースター', 'オムナイト', 'オムスター', 'カブトプス', 'フリーザー', 'ファイヤー', 'ミニリュウ', 'ハクリュー', 'カイリュー', 'ミュウツー', 'チコリータ', 'ベイリーフ', 'メガニウム', 'ヒノアラシ', 'マグマラシ', 'バクフーン', 'アリゲイツ', 'オーダイル', 'ヨルノズク', 'レディアン', 'アリアドス', 'クロバット', 'チョンチー', 'ランターン', 'トゲチック', 'ネイティオ', 'デンリュウ', 'キレイハナ', 'ウソッキー', 'ニョロトノ', 'ヒマナッツ', 'ヤンヤンマ', 'ブラッキー', 'ヤミカラス', 'ヤドキング', 'アンノーン', 'ソーナンス', 'キリンリキ', 'クヌギダマ', 'フォレトス', 'グライガー', 'ハガネール', 'グランブル', 'ハリーセン', 'ヘラクロス', 'マグマッグ', 'マグカルゴ', 'テッポウオ', 'デリバード', 'マンタイン', 'エアームド', 'キングドラ', 'ドンファン', 'ポリゴン2', 'カポエラー', 'ムチュール', 'エレキッド', 'ミルタンク', 'ヨーギラス', 'サナギラス', 'バンギラス', 'ジュプトル', 'ジュカイン', 'ワカシャモ', 'バシャーモ', 'ミズゴロウ', 'ヌマクロー', 'ラグラージ', 'ジグザグマ', 'マッスグマ', 'カラサリス', 'アゲハント', 'ドクケイル', 'ハスブレロ', 'ルンパッパ', 'ダーテング', 'オオスバメ', 'ペリッパー', 'サーナイト', 'アメモース', 'キノガッサ', 'ヤルキモノ', 'ケッキング', 'テッカニン', 'ゴニョニョ', 'バクオング', 'マクノシタ', 'ハリテヤマ', 'エネコロロ', 'ボスゴドラ', 'チャーレム', 'ライボルト', 'バルビート', 'イルミーゼ', 'マルノーム', 'サメハダー', 'ホエルオー', 'ブーピッグ', 'パッチール', 'ナックラー', 'ビブラーバ', 'フライゴン', 'チルタリス', 'ザングース', 'ハブネーク', 'ルナトーン', 'ソルロック', 'ドジョッチ', 'シザリガー', 'ネンドール', 'ユレイドル', 'アーマルド', 'ミロカロス', 'カクレオン', 'カゲボウズ', 'ジュペッタ', 'サマヨール', 'トロピウス', 'ユキワラシ', 'オニゴーリ', 'タマザラシ', 'トドグラー', 'トドゼルガ', 'ハンテール', 'サクラビス', 'ジーランス', 'ボーマンダ', 'メタグロス', 'レジロック', 'レジアイス', 'レジスチル', 'ラティアス', 'ラティオス', 'カイオーガ', 'グラードン', 'レックウザ', 'デオキシス', 'ハヤシガメ', 'ドダイトス', 'モウカザル', 'ゴウカザル', 'ポッチャマ', 'ポッタイシ', 'エンペルト', 'ムクバード', 'ムクホーク', 'コロボーシ', 'コロトック', 'レントラー', 'ロズレイド', 'ズガイドス', 'ラムパルド', 'タテトプス', 'トリデプス', 'ミノムッチ', 'ミノマダム', 'ガーメイル', 'ミツハニー', 'ビークイン', 'フローゼル', 'チェリンボ', 'カラナクシ', 'トリトドン', 'エテボース', 'フワライド', 'ミミロップ', 'ムウマージ', 'ドンカラス', 'ニャルマー', 'ブニャット', 'リーシャン', 'スカンプー', 'スカタンク', 'ドーミラー', 'ドータクン', 'ガブリアス', 'ヒポポタス', 'カバルドン', 'ドラピオン', 'グレッグル', 'ドクロッグ', 'マスキッパ', 'ケイコウオ', 'ネオラント', 'ユキカブリ', 'ユキノオー', 'マニューラ', 'ジバコイル', 'ベロベルト', 'ドサイドン', 'モジャンボ', 'エレキブル', 'ブーバーン', 'トゲキッス', 'メガヤンマ', 'リーフィア', 'グレイシア', 'グライオン', 'ポリゴンZ', 'エルレイド', 'ダイノーズ', 'ヨノワール', 'ユキメノコ', 'エムリット', 'ディアルガ', 'ヒードラン', 'レジギガス', 'ギラティナ', 'クレセリア', 'ダークライ', 'アルセウス'])

names_tmp = np.array([])
names = shakeOff(names)

for i in range(10):
    number_of_candidate = len(names)
    accuracy = round(1/number_of_candidate*100,1)

    frequency_analysis = np.array([])
    frequency_analysis = analyse_frequency(names)
    candidate = find_candidate(frequency_analysis)
    
    print('最有力候補は「', candidate, '」です。(候補数', number_of_candidate, '件、正解率', accuracy, '%)')
    
    match_status = get_match_status()
    print('')

    if match_status == '22222':
        print('正解おめでとうございます!')
        break
    names = update_names(names)

以上。

乱数

・複素力学系の集合を用いれば疑似乱数の生成が上手くできるのでは?
・乱数生成の直前に簡単な命令を走らせて、命令のCPU処理時間が何ミリ秒だったかを検出してその時間をもとに乱数を生成すれば真性乱数チックになるのでは?
・上のを書いていて思ったけれど、PC内のパーツの電圧やCPU温度、ファン回転数等の数字から1桁ずつ持ってきて平方採中法の最初の数字にすれば真性乱数になるのでは?

 

なーんて甘いことを考えてココにメモをする。

Pythonのメモ【基本編】

今までプログラムっぽいものはvbaとbatしか関わってなかったんですが

ちょっとPythonも初めてみようと思いました。

そこでメモ程度に記していきます。

 

print() 文字を表示する
 print("こんにちは")
  →こんにちは
 greeting = "こんにちは"
 print(greeting)
  →こんにちは

 

input() 入力を受け取るボックスを表示する
inputでの入力ボックスに文字を入力すると、データ型が何になるかわからない。
その時に型を指定させるために下記の関数を使うと良い。

 

int() 整数型の数値を指定/変換
float() 浮動小数点型の数値を指定/変換
str() 文字列型を指定/変換
bool() ブーリアン型を指定/変換
 int(input())
  →入力した値が整数型で格納される(文字を入力するとエラーが返ってくる)。

 

len(文字列) 文字列の文字数を表示
 len("123456")
  →6
len(配列) 配列の要素数を表示
 arr = [1, 2, 3, 4, 5]
 len(arr)
  →5

 

文字列[◯] 文字列の◯文字目を取り出す
文字列[◯:△] 文字列の◯~△文字目を取り出す 
文字列[:△] 文字列の最初~◯文字目を取り出す
文字列[◯:] 文字列の◯文字目~最後を取り出す
文字列[:マイナス△] 文字列の最初~末尾から△文字目までを取り出す
文字列[マイナス◯:] 文字列の末尾から△文字目~最後までを取り出す
※便宜上、◯文字目という書き方をしているが、
0からからカウントが始まるため下記のaの「お」は4文字目という扱いになる。
 a = "あいうえおかきくけこ"
 print(a[5])  →か
 print(a[4:6])  →おか
 print(a[:2])  →あい
 print(a[8:])  →けこ
 print(a[:-3])  →あいうえおかき
 print(a[-3:])  →くけ

 

if 条件式:
 Trueのときの処理

 

if 条件式:
 Trueのときの処理
else:
 Falseのときの処理

 

if 条件式1:
 条件式1がTrueのときの処理
elif 条件式2:
 条件式1がFalseで条件式2がTrueのときの処理
else:
 Falseのときの処理

 

for 変数 in range(回数):
 反復する処理
処理を指定した回数反復する。
 for i in range(2):
  print(i)
  →0
  →1

for 変数 in range(リスト):
 反復する処理
リストの内容を変数に代入しながら処理を行う。
※処理内に変数が登場しない場合、リストの要素の数だけ処理を反復する。

 

def 関数名():
 処理
自分で関数を作成し、その関数内に記載された処理を実行する。

 

def 関数名(引数1, 引数2):
 戻り値 = 引数1*引数2    (←処理)
 return 戻り値
元の処理にて関数に引数を渡すと、その引数を用いて処理を実行し、
returnで指定されたものを戻り値として元の処理に返す。

 

※以下は7行で1セット
from turtle import *
 カーソルを表示して
forward(100) 前に100進める
right(90) 右に90度曲がる
back(50) 後ろに50進む
left(45) 左に45度曲がる
forward(100) 前に100進める
done() 処理終了

 

0の0乗とは

数学が好きなので、ふと色んなことについて考えることが多い。

今日は「0の0乗」について気になってしまった。

 

0^0は1と考える機会が多い気がするけれど、

直感で分かるように「y=x^x」のグラフを書いてみた。

 

複素平面じゃ実部の変化が直感的にわからないからxy平面にしている。

ちょっと違和感あるけど虚部も一応掲載。

xのx乗(x=0を除く)

x≦1はカンタン。順当に1に近づいていく。

 

0<x<1は計算ですぐ出るけど不思議。

一旦下がるが0に近づくほどまた増える。

 

x<0となるとあら不思議。正と負を行ったり来たり。

(よく考えれば行ったり来たりするのも分かるっちゃ分かる)

 

やっぱり0^0=1と考えるのが妥当なんだなと自分の中で決着。

テイラー展開とか使うこと考えても1とするのがしっくり来る。

 

とは言うものの数学界には、

・0とする派閥

・1とする派閥

・定義なしという派閥

に分かれているらしい。

 

0と定義すると都合の良い場合って何だろう?

なんて考えながら今日の記事は終わり。

 

y=x^x(0<x≦1)の数値が気になったから

また深入りしちゃうかも。

 

 

あ、一応作ったからには複素平面も置いておこう。

1+0iに近いほうが(-0.01)^(-0.01)で、

0+0iに近いほうが(-5.00)^(-5.00)。

xのx乗(-5≦x<0)

 

ロジクール「MX Vertical」レビュー

ウチはこのマウス、発売直後に買いました。

確か2018年終わりでしたかね。

奇抜な見た目でしたが、使いやすいんじゃないかとの直感でポチりました。

 

かれこれ5年も使っていて今も現役ですが、レビューをします。

長く書く気もないので簡潔に。

 

◆良い点

バッテリー持ちについて、使用当初は充電が3-4ヶ月持った。現在でも2ヶ月以上は持つ。気にならない程度で良いかも。

・ポインタの精度は良い。安いマウスにありがちな、いきなりポインタが飛んでくようなことはない。

・マウス上面に精度切り替えボタンが有る。稀に使うタイミングがある。

 

◆悪い点

・バッテリーが少ない警告は無いので、充電切れで突如動かなくなる。

左手で使えない。右利きの人でも訳あって左手で使うタイミングはあると思う。そんな時に使えない。

精密なクリックが出来ない(※解像度の話ではない!)。物理的に、クリック時に右から左へ押される力が働くので、マウスポインタを合わせていてもクリックの際に微妙に位置がずれる。

手首の机につく部分が痛い!これが一番のデメリット。手の重さが全部手の付け根部分にかかって擦れる。なんて説明したら良いかわからない。骨でいうと三角骨とか豆状骨?月状骨?のあたり。知らない人は調べてねゴメン。

 

とまあこんな感じ。

 

バッテリー以外の観点については、このマウスに限らず

同じタイプのエルゴノミックマウス全般に言えるのかな。

 

よくあるタイプのマウスと比べてメリットはあまりない。

むしろ手首擦れて痛いとかクリックがズレるデメリットが目立つ。

とはいえ、買い替えるほどのデメリットという感じでもないから現状使い続けてる、という感じかな。

 

壊れたらトラックボールマウス買うかも。

それより先にMac用のMagic Trackpad買わないとなんだけれどもね。