無いお菓子を発想するプログラム
この世にまだ無いお菓子をガンガン発想するプログラムです。
このプログラムは教育用プログラミング言語「ドリトル」で書きました。
// 無いお菓子を発想するプログラム
// プログラミング言語「ドリトル」
// V3.31以降のインストール版ドリトルで実行してください。
// 2020.06.09 蕪木 孝
// お菓子のデータを以下のサイトのWebAPIで提供して頂く
// お菓子の最新情報「お菓子の虜」 https://sysbird.jp/toriko/
URL = "https://www.sysbird.jp/webapi/"。
// お菓子の虜から5個のお菓子データを取得する
お菓子の虜 = WebAPI ! 作る。
お菓子の虜 : url= URL。
お菓子の虜 : apikey = "guest"。
お菓子の虜 : format = "json"。
お菓子の虜 : max = 5。
お菓子の虜 : order = "r"。 // r はランダム
データ取得確認用ラベル = ラベル ! "データ取得開始" 作る。
取得データ = お菓子の虜 ! 読む。
データ取得確認用ラベル ! "" 書く。
// ユニコード関連の値
半角前カッコ = 0x28。 // '('のコードポイント。
半角後カッコ = 0x29。 // ')'のコードポイント。
全角前カッコ = 0xFF08。 // '('のコードポイント。
全角後カッコ = 0xFF09。 // ')'のコードポイント。
全角カタカナ始め = 0x30A1。 // 'ァ'のコードポイント。
全角カタカナ終り = 0x30FC。 // 'ー'のコードポイント
全角カタカナの総数 = 全角カタカナ終り - 全角カタカナ始め + 1。
// -----ーーーーー ブロックの作成(ブロックとは機能のかたまり) -----ーーーーー
// 機能 : 引数の文字が全角カタカナかどうかを判定する
// 引数 : 判定する1文字
// 戻り値 : はい = 全角カタカナ, いいえ = 全角カタカナ以外
全角カタカナ判定 = 「
| 文字 ; i カタカナフラグ カタカナ1文字 戻り値 |
カタカナフラグ = いいえ。
i = 0。
「i < :全角カタカナの総数」 ! の間 「
カタカナ1文字 = (:全角カタカナ始め + i) ! コード文字。
「文字 == カタカナ1文字」 ! なら 「
カタカナフラグ = はい。
i = :全角カタカナの数。 // 繰り返しを抜ける
」
そうでなければ 「
i = i + 1。
」 実行。
」 実行。
戻り値 = カタカナフラグ。
」。
// 機能 : 引数の文字列の先頭から区切りになる位置を検索する
// 引数 : 検索対象の文字列
// 戻り値 : 区切りの位置
区切り検索 = 「
| 文字列 ; i 区切り位置 文字 文字数 種別 戻り値 |
区切り位置 = 0。
文字 = 文字列 ! 1 1 部分。
「どれか ! (文字 == (:半角前カッコ ! コード文字))
(文字 == (:全角前カッコ ! コード文字)) 本当」 ! なら 「
種別 = 1。 // 後カッコの文字までを検索する
」
そうでなければ 「(全角カタカナ判定 ! (文字) 実行) == はい」 なら 「
種別 = 2。 // 全角カタカナが続く文字までを検索する
」
そうでなければ 「
種別 = 3。 // 上記以外の文字が続くまでを検索する
」 実行。
文字数 = 文字列 ! 長さ?。
i = 2。
「i < 文字数」 ! の間 「
文字 = 文字列 ! (i) 1 部分。
「種別 == 1」 ! なら 「
「どれか ! (文字 == (:半角後カッコ ! コード文字))
(文字 == (:全角後カッコ ! コード文字)) 本当」 ! なら 「
区切り位置 = i。
i = 文字数。 // 繰り返しを抜ける
」 実行。
」
そうでなければ 「種別 == 2」 なら 「
「(全角カタカナ判定 ! (文字) 実行) == いいえ」 ! なら 「
区切り位置 = i - 1。
i = 文字数。 // 繰り返しを抜ける
」 実行。
」
そうでなければ 「
「どれか ! ((全角カタカナ判定 ! (文字) 実行) == はい)
(文字 == (:半角前カッコ ! コード文字))
(文字 == (:全角前カッコ ! コード文字)) 本当」 ! なら 「
区切り位置 = i - 1。
i = 文字数。 // 繰り返しを抜ける
」 実行。
」 実行。
i = i + 1。
」 実行。
「区切り位置 == 0」 ! なら 「区切り位置 = 文字数」 実行。
戻り値 = 区切り位置。
」。
// -----ーーーーー メイン処理 -----ーーーーー
// 1つの商品名を前ワード、後ワードに分けてつなげることで無いお菓子の名前を作る
「取得データ != 未定義」 ! なら 「 // データ取得成功なら
取得データ個数 = 取得データ : count。
// 1つめの商品名から前ワードを作る
商品名 = 取得データ : item_1 : name。
区切り位置 = 区切り検索 ! (商品名) 実行。
前ワード = 商品名 ! 1 (区切り位置) 部分。
//ラベル ! (商品名) 作る。 // デバッグ用
// 2つめ以降の商品名から後ワードを作る
後ワード = "未定"。
i = 2。
「i <= 取得データ個数」! の間 「
文字列 = "商品名 = 取得データ : item_" + i + " : name。"。
文字列 ! 実行。
文字数 = 商品名 ! 長さ?。
//ラベル ! (商品名) 作る。 // デバッグ用
// 商品名を後半部分だけにする
区切り位置 = 区切り検索 ! (商品名) 実行。
商品名 = 商品名 ! (区切り位置 + 1) (文字数 - 区切り位置) 部分。
// 商品名の後半部分から後ワードを作る
区切り位置 = 区切り検索 ! (商品名) 実行。
後ワード = 商品名 ! 1 (区切り位置) 部分。
// 後ワードは2文字以上ならば採用
「(後ワード ! 長さ?) >= 2」 ! なら 「
i = 取得データ個数。 // 後ワードが作れたので繰り返しから抜ける
」 実行。
i = i + 1。 // 後半部分が無かったので次の商品名へ
」 実行。
無いお菓子 = 前ワード + 後ワード。
」
そうでなければ 「
無いお菓子 = "データ取得失敗"。
」 実行。
// 無いお菓子を画面に表示する
文字数 = 無いお菓子 ! 長さ?。
文字のサイズ = 30。
x座標 = 文字のサイズ / 2 * 文字数 * (-1)。
y座標 = 文字のサイズ / 2。
ラベル1 = ラベル ! 作る (文字のサイズ) 文字サイズ。
ラベル1 ! (x座標) (y座標) 位置 (無いお菓子) 書く。
実行方法
インストール版ドリトルを以下のサイトからダウンロードしてください。
https://dolittle.eplang.jp/download
パソコンのOSがWindowsなら「Windows用」をクリックするとダウンロードがはじまります。
ダウンロードしたら解凍してください。
解凍したら dolittle.bat をダブルクリックするとドリトルが起動します。
プログラムを貼り付けて「実行!」をクリックするとこの世にまだ無いお菓子が表示されます。
「データ取得開始」が表示されたままの場合
たまに実行してもデータ取得でフリーズすることがあります。
その場合はドリトルの「中断」をクリックしてから再度「実行!」をクリックしてください。
データ取得開始の状態を放置しておくと使用メモリが増え続けます。
ドリトル自体を再起動すると増えた使用メモリが元に戻ります。
「データ取得失敗」と表示される場合
このプログラムではインターネット経由でデータを取得するためにWebAPIというものを使っています。
データ取得失敗が表示される場合の調査については同じようにWebAPIを使用している次の記事の「緯度、経度、乗組員数が表示されない場合」を参照してください。
発想がコンピューターにかなわない時代なんて来るのですかね。
今の内にたくさん発想を楽しんでおきましょう。
このプログラムではコンビニお菓子の最新情報「お菓子の虜」で提供されているWebAPIで既存のお菓子の商品名を取得して使用しています。
お菓子の虜
https://sysbird.jp/toriko/
お菓子の虜のWebAPI
https://sysbird.jp/toriko/webapi/
この記事が気に入ったらサポートをしてみませんか?