![見出し画像](https://assets.st-note.com/production/uploads/images/71540176/rectangle_large_type_2_6dc2819dddbe868815bb4dfa16097af1.jpg?width=800)
Matlabでしりとりを実装する
自動でしりとりを行ってくれるアプリを作製しました。
コピペできるコードは末尾にあります。
完成品
![画像1](https://assets.st-note.com/production/uploads/images/16245898/picture_pc_374245b451dddac2338349705be339b1.gif?width=800)
NEXTボタンをクリックするとどんどんしりとりをしていってくれるアプリです。
単語リストの準備
まず、リファレンスとなる単語リストのExcelファイルを作ります。
![スクリーンショット 2022-02-05 195248](https://assets.st-note.com/production/uploads/images/71536438/picture_pc_f9ef63ad7238fe321e682e6f79c37c56.jpg?width=800)
A列: 単語を入力します。漢字は避けて、ひらがなorカタカナで入力します。
B列: LEFT関数で、A列から先頭の文字を取り出します。
C列: RIGHT関数で、A列から末尾の文字を取り出します。
D,E列: B,C列からテキストをコピペします。
F,G列: PHONETIC関数で、D,E列のひらがな/カタカナをどちらか一方に統一します。
H,I列: VLOOKUP関数で、文字を数字に変換します (K,L列に数字-文字の対応表を作っておきます)。
こうやって自分の好きな単語だけで単語リストを作れば、自分だけのしりとりができるというわけですね。今回は七文字の単語縛りにしました。
実装
・環境:MATLAB R2018a
Matlab GUIを使います。GUIの扱い方は公式ヘルプがとても充実しているのでここで言うほどでもないですが、とりあえず
![](https://assets.st-note.com/img/1704087754871-blq93KbJax.png)
でGUIを開きます。
![スクリーンショット 2022-02-05 164831](https://assets.st-note.com/production/uploads/images/71535730/picture_pc_11fcb460c59c725a7242e21a81b7047f.jpg)
以下のようにコンポーネント設置しました。
・エディットテキスト (editPrev): 1つ前の単語が表示されるエリア
・エディットテキスト (editList): 読み込んだ単語リスト名が表示されるエリア
・エディットテキスト (editShiritori): 現在の単語が表示されるエリア
・プッシュボタン (pushbuttonLoad): 単語リストを読み込むボタン
・プッシュボタン (pushbuttonNext): しりとりを実行するボタン
![画像3](https://assets.st-note.com/production/uploads/images/71536074/picture_pc_05fd137ca4e8d0791c3b08bc1148b27e.png?width=800)
GUIの.figファイルを保存すると自動的にコード (.mファイル) ができます。
2つあるプッシュボタンの部分に処理を入力していきます。
プッシュボタン (pushbuttonLoad)
リファレンスとなる単語リストを読み込み、開始単語を表示するボタンです。
まず、単語リストの選択画面を開きます。
![](https://assets.st-note.com/img/1704087772648-vCBfDF3war.png)
開いたファイル名をテキストボックスに表示します。
![](https://assets.st-note.com/img/1704087783766-jcUShpwosx.png)
しりとりの開始単語をランダムに選びます。
rand関数 (0から1の乱数を1つ生成する) を使って単語をランダムに1つ選びます。単語リストの数 (今回811個あります) とrandを掛けることで0~811の乱数を作り、それをceilで切り上げることで1~811の自然数Nをランダムに1つ作ります。そして、単語リストからN番目の単語を choise 変数に格納します。
![](https://assets.st-note.com/img/1704087796222-sBEDSsDohK.png)
prev 構造体に choise 単語を格納します。これは「前の単語」欄に表示されます。prev にはpre, post, choise の3つのフィールドを定義します。
prev.choise 単語そのもの
prev.pre 先頭の文字番号
prev.post 末尾の文字番号
![](https://assets.st-note.com/img/1704087807983-JriK1gt2CZ.png)
最後に、一番大きいテキストボックスに現在の単語を表示します。
1行目で「TagがeditShiritoriのエディットテキストをhEditShiritoriとして定義する」こととなり、2行目で「choiseをStringとしてhEditShiritoriに表示する」となります。
![](https://assets.st-note.com/img/1704087818513-OFXfODPG0A.png)
これでしりとりの準備は完了です。
![スクリーンショット 2022-02-05 202404](https://assets.st-note.com/production/uploads/images/71538649/picture_pc_c06b810cd576804d25dfa0e9040a123b.jpg)
プッシュボタン (pushbuttonNext)
しりとりを進めていく、メインのボタンです。
「前の単語」欄に1個前の単語を表示します。
![](https://assets.st-note.com/img/1704087831273-zvIplpKcY6.png)
次に、単語リストからしりとりが成立する単語をランダムに選びます。
candidates 変数に、先頭の文字が前の単語の末尾と一致する単語リストを格納します。そこから1つをrandsample関数でランダムに選び、xlsread関数で choise 変数に格納します。
![](https://assets.st-note.com/img/1704087844788-MiNyn19bS1.png)
そして、選ばれた単語を現在の単語エリアに表示します。
![](https://assets.st-note.com/img/1704087858414-coWHSBF1uf.png)
最後に、現在の単語を1個前の単語としてprev構造体に格納しておきます。
![](https://assets.st-note.com/img/1704087871128-pLLXPpWwj6.png)
これで、無限にしりとりができます!
![画像6](https://assets.st-note.com/production/uploads/images/71540003/picture_pc_fcfab3e248ce0cb429811cc29ccef1be.gif?width=800)
今後の展望
このままでは同じ単語が2回以上出てしまうので、一度使用した単語 (単語番号) をリスト化して二度と使えないようにしたほうが良いです。さらに、将来的には単語リストから単語を出すのではなく、インターネットから単語を取得・機械学習により許容できる単語化を判断させる、といったしりとりAIを作りたいですね。
「続きをみるには」でコピペできるコードのフルバージョンが読めます。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?