見出し画像

無いお菓子を発想するプログラム

画像1 1280 x 670

画像2 1280 x 670

024_007実行結果

この世にまだ無いお菓子をガンガン発想するプログラムです。

このプログラムは教育用プログラミング言語「ドリトル」で書きました。

// 無いお菓子を発想するプログラム

// プログラミング言語「ドリトル」

// 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/

この記事が気に入ったらサポートをしてみませんか?