安野光雅しりとりファンのブログ

絵本「しりとり」について書いてます

安野光雅しりとりファンのブログ6

はじめてこの絵本で遊んだ日から気になっていたこと。

「何周すると、全ての単語をコンプリートできるのか ?」

これを解くためのプログラムどうやって作ろうかと考えていて、気付いてしまったことがあります。

全部の単語を通るには、なるべくゴールしないで、15ページまで来たら1ページに戻るようにする必要があります。なので、「15ページの各単語の最後の文字」と、「1ページの各単語の最初の文字」のつながりが重要です。

ブログの第4回でやったのと同じように、表にして見てみました。

単語 ページ 全出現回数 あがり出現回数
りんご2 15 32 0
だいがく 15 61 0
うみう 15 82 0
うめぼし 15 82 0
かものはし 15 125 0
みそさざい 15 158 0
なきむし 15 194 0
ももたろう 15 194 0
合計   928 0

 

このように、ゴールしないで最初のページに戻るパターン928通りの、最後の文字は、

「ご」「く」「う」「し」「い」の5つだけです。

そして1ページの各単語は

けんびきょう

くま

ごま

あさひ

さる

そば

しるこ

おに

かれーらいす

きびだんご

すもも

えんどうまめ

こあら

いわし

うし

せなか

の16個なので、このうち2周目に選ぶことができるのは、

「くま」「ごま」「しるこ」「いわし」「うし」

の5個だけなんですね!!!

それ以外の11個の単語は、スタート時に選ばない限り、二度と通ることはないわけです。。残念。。。

何周でも遊べるけど、コンプリートすることは、あり得ないんですね。勿論、「より多くの単語を集めることを目指して遊ぶ」ことはできるので、まだまだ研究の余地があります。

 

それにしても、ここまで気が付かなかったのは、全16ページ232個のイラストのボリュームのおかげかなと思います。終わる頃には最初の方のページに何の単語があったかなんて、覚えていられないんですよね。私が愚鈍なだけかもしれませんが。

どうやってこの絵本を構成していったのかが、とても気になります。安野さんのお話を聞くことは叶いませんから、福音館の担当の人に聞いてみたい位です。

安野光雅しりとりファンのブログ5

ちょっと筆休めに?ターミナルで遊べるゲームにしてみました。

キーボードから入力された単語が

1 空でないか

2 単語リストに載ってない単語でないか

3 (2ページ以降)しりとりになっているか

4 (15ページなら)ゴールできる単語か

の順にチェックしてそれぞれの処理をJudgementクラスで行います。

「じどうしゃ」の小さい「ゃ」を大きい「や」に直すため、ゃゅょ判定を入れてます。

(前回までは横着のため、最初から「じどうしや」としてリストに載せていました。)


    import java.io.*;

class Gamesiritori{
	public static void main(String[] args){
		try{
			BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
			Judgement judge=new Judgement();
			int t=0;
			int n=0;
			while(n<judge.word.length){
				judge.print1(n);
				judge.jud=0;
				String ans=in.readLine();
				int len=ans.length();
				if(len==0) judge.print4();//入力なしの場合
				else if(judge.search(n,ans)!=0){
					judge.print3();//リストにない単語の場合
				}
				else if(t==0){
					judge.print5();//最初のみ実行
					judge.putin(t,ans);
					n++;
					t++;
				}
				else if(judge.comp(ans)!=0){
					judge.print2();//次の単語とつながらない場合
				}
				else if(n==judge.word.length-2){//ゴールできるか判定
					judge.putin(t,ans);
					if(judge.goal()!=0){
						judge.print1(judge.word.length-1);
						judge.print6();//最初に戻る場合
						n=0;
						t++;
					}
					else{
						judge.print5();//ゴールにすすむ場合
						judge.putin(t,ans);
						n++;
						t++;
					}
				}
				else{
					judge.print5();//つぎにすすむ場合
					judge.putin(t,ans);
					n++;
					t++;
				}
			}
			System.out.println("ゴール!おめでとう");
			int i=0;
			while(judge.result[i]!=null){
				System.out.print(judge.result[i]+"→");
				i++;
			}
		}catch(Exception ie){
			System.out.println("エラーです");
		}
	}
}
class Judgement{
	String[][]word={
			{"さる","きびだんご","くま","しるこ","こあら","すもも","そば","ごま","せなか","あさひ","うし","えんどうまめ","いわし","おに","けんびきょう","かれーらいす"},
			{"かじか","るーれっと","ばすけっと","すし","にんにく","めがね","ものほしざお","ごぼう","ます","らむね","しか","ひしもち","うみがめ","こなや"},
			{"すもう","かけす","やじろべえ","くつ","おかめ","とうがらし","かめ","ねじりあめ","ちからこぶ","とけい","からす","ねずみ","うめ","しじみ","めぐすり"},
			{"しんでれら","いぬ","うきわ","りんごのき","めんたいこ","めがね","つるはし","ぶるどっぐ","めかくし","すずめ","みつば","えんま","するめ","めざし","みそ"},
			{"ばす","そば","ぐらんぷり","しらうお","まらかす","らっぱ","こだいこ","ねこ","しまうま","めだか","きうい","しらさぎ","わまわし","ぬすびとはぎ"},
			{"しろ","こめ","いなほ","こま","ぎょうじ","すもう","ばんぺい","かっぱ","りんご","おっとせい","かいこ","まき","すいか","ぎんぱい","ぱんけーき"},
			{"じんちょうげ","いど","ほね","いか","めざし","きもの","ぱんだ","ごりら","ろうそく","いも","かずのこ","きのこ","うぐいす","まさかり","こたつ","かっぱのこ"},
			{"くびわ","すべりだい","つき","だんご","こんぶ","もも","のこぎり","げた","りす","かぶと","らっきょう","ねぎ","こうもりがさ","しま","どうだんつつじ"},
			{"わかめ","たいこ","さい","じしゃく","ぶーつ","とかげ","ぎんか","きのこ","うま","すずめ","まんねんひつ","もみじ","りんどう","ごま","いしがき"},
			{"かに","じどうしゃ","めいろ","こがたな","つくえ","つきみそう","こすもす","げた","まんとひひ","めじろ","きじ","くつ","まんと","いけ","うずら"}, 
			{"ひこうき","らっぱ","にじ","じんべい","えもんかけ","すのこ","けむし","ろば","うき","とき","たいこ","やし","ろうそく","つきみ","なす"},
			{"いす","す","こぶ","しない","くつべら","こもり","ばけつ","きんこ","きつつき","けいと","じしゃく","みつばち","ぱーま","きつね","しらぎく"},
			{"くものす","こおろぎ","きんのしゃちほこ","りす","ちえのわ","すべりひゆ","ぶらんこ","ねこ","とうもろこし","いんき","つぼ","らくご","まつ","すいか","くじら"},
			{"ゆうれい","すみ","わさび","すいか","ぼんぼり","かたばみ","こいし","こども","らくだ","ぎんこう","ごみばこ","つきみそう","こまつな","しい","きんもくせい"},
			{"しめなわ","かものはし","うみう","みそさざい","うめぼし","だいがく","いのこづち","うずら","こおり","ももたろう","なきむし","みちしるべ","びわ","いわ","りんご","いも"},
			{"りぼん","らん","ちょうちん","もん","べーこん","わん"}
	};
	void print1(int a){
		for(int i=0;i<word[a].length;i++) System.out.print(word[a][i]+"/");
		System.out.println();
	}
	void print2(){
		System.out.println("▲しりとりになってないよ");
	}
	void print3(){
		System.out.println("▲のってないことばだよ");
	}
	void print4(){
		System.out.println("▲にゅうりょくしてね");
	}
	void print5(){
		System.out.println("つぎにすすむよ");
	}
	void print6(){
		System.out.println("▲ゴールできないよ");
		System.out.println("さいしょから  "+bottom);
	}
	int search(int n,String st){
		int k=word[n].length;
		int flag=0;
		for(int i=0;i<k;i++){
			String word2=word[n][i];
			flag=word2.compareTo(st);
			if(flag==0) break;
		}
		return flag;
	}
	String bottom;
	String[]result=new String[100];
	void putin(int t,String st){
		int len=st.length();
		bottom=st.substring(len-1,len);
		result[t]=st;
		String ya="ゃ";
		String yu="ゅ";
		String yo="ょ";
		int small;
		small=bottom.compareTo(ya);
		if(small==0) bottom="や";
		small=bottom.compareTo(yu);
		if(small==0) bottom="ゆ";
		small=bottom.compareTo(yo);
		if(small==0) bottom="よ";
		System.out.println(bottom);
	}
	int jud;
	int comp(String st){
		jud=bottom.compareTo(st.substring(0,1));
		return jud;
	}
	int goal(){
		int g=0;
		for(int i=0;i<6;i++){
			String st=word[15][i];
			g=bottom.compareTo(st.substring(0,1));
			if(g==0) break;
		}
		return g;
	}	
}

 

実行結果です。

ひらがなしか受け付けないので入力が少し面倒です。

でも作ったものが動くと嬉しいですね!!

さる/きびだんご/くま/しるこ/こあら/すもも/そば/ごま/せなか/あさひ/うし/えんどうまめ/いわし/おに/けんびきょう/かれーらいす/

▲にゅうりょくしてね
さる/きびだんご/くま/しるこ/こあら/すもも/そば/ごま/せなか/あさひ/うし/えんどうまめ/いわし/おに/けんびきょう/かれーらいす/
かわうそ
▲のってないことばだよ
さる/きびだんご/くま/しるこ/こあら/すもも/そば/ごま/せなか/あさひ/うし/えんどうまめ/いわし/おに/けんびきょう/かれーらいす/
さる
つぎにすすむよ
る
かじか/るーれっと/ばすけっと/すし/にんにく/めがね/ものほしざお/ごぼう/ます/らむね/しか/ひしもち/うみがめ/こなや/
るーれっと
つぎにすすむよ
と
すもう/かけす/やじろべえ/くつ/おかめ/とうがらし/かめ/ねじりあめ/ちからこぶ/とけい/からす/ねずみ/うめ/しじみ/めぐすり/
とうがらし
つぎにすすむよ
し
しんでれら/いぬ/うきわ/りんごのき/めんたいこ/めがね/つるはし/ぶるどっぐ/めかくし/すずめ/みつば/えんま/するめ/めざし/みそ/
しんでれら
つぎにすすむよ
ら
ばす/そば/ぐらんぷり/しらうお/まらかす/らっぱ/こだいこ/ねこ/しまうま/めだか/きうい/しらさぎ/わまわし/ぬすびとはぎ/
らっぱ
つぎにすすむよ
ぱ
しろ/こめ/いなほ/こま/ぎょうじ/すもう/ばんぺい/かっぱ/りんご/おっとせい/かいこ/まき/すいか/ぎんぱい/ぱんけーき/
ぱんけーき
つぎにすすむよ
き
じんちょうげ/いど/ほね/いか/めざし/きもの/ぱんだ/ごりら/ろうそく/いも/かずのこ/きのこ/うぐいす/まさかり/こたつ/かっぱのこ/
きもの
つぎにすすむよ
の
くびわ/すべりだい/つき/だんご/こんぶ/もも/のこぎり/げた/りす/かぶと/らっきょう/ねぎ/こうもりがさ/しま/どうだんつつじ/
のこぎり
つぎにすすむよ
り
わかめ/たいこ/さい/じしゃく/ぶーつ/とかげ/ぎんか/きのこ/うま/すずめ/まんねんひつ/もみじ/りんどう/ごま/いしがき/
りんどう
つぎにすすむよ
う
かに/じどうしゃ/めいろ/こがたな/つくえ/つきみそう/こすもす/げた/まんとひひ/めじろ/きじ/くつ/まんと/いけ/うずら/
うずら
つぎにすすむよ
ら
ひこうき/らっぱ/にじ/じんべい/えもんかけ/すのこ/けむし/ろば/うき/とき/たいこ/やし/ろうそく/つきみ/なす/
らっぱ
つぎにすすむよ
ぱ
いす/す/こぶ/しない/くつべら/こもり/ばけつ/きんこ/きつつき/けいと/じしゃく/みつばち/ぱーま/きつね/しらぎく/
ぱーま
つぎにすすむよ
ま
くものす/こおろぎ/きんのしゃちほこ/りす/ちえのわ/すべりひゆ/ぶらんこ/ねこ/とうもろこし/いんき/つぼ/らくご/まつ/すいか/くじら/
まつ
つぎにすすむよ
つ
ゆうれい/すみ/わさび/すいか/ぼんぼり/かたばみ/こいし/こども/らくだ/ぎんこう/ごみばこ/つきみそう/こまつな/しい/きんもくせい/
つきみそう
つぎにすすむよ
う
しめなわ/かものはし/うみう/みそさざい/うめぼし/だいがく/いのこづち/うずら/こおり/ももたろう/なきむし/みちしるべ/びわ/いわ/りんご/いも/
うめぼし
し
りぼん/らん/ちょうちん/もん/べーこん/わん/
▲ゴールできないよ
さいしょから  し
さる/きびだんご/くま/しるこ/こあら/すもも/そば/ごま/せなか/あさひ/うし/えんどうまめ/いわし/おに/けんびきょう/かれーらいす/
しるこ
つぎにすすむよ
こ
かじか/るーれっと/ばすけっと/すし/にんにく/めがね/ものほしざお/ごぼう/ます/らむね/しか/ひしもち/うみがめ/こなや/
こなや
つぎにすすむよ
や
すもう/かけす/やじろべえ/くつ/おかめ/とうがらし/かめ/ねじりあめ/ちからこぶ/とけい/からす/ねずみ/うめ/しじみ/めぐすり/
やじろべえ
つぎにすすむよ
え
しんでれら/いぬ/うきわ/りんごのき/めんたいこ/めがね/つるはし/ぶるどっぐ/めかくし/すずめ/みつば/えんま/するめ/めざし/みそ/
えんま
つぎにすすむよ
ま
ばす/そば/ぐらんぷり/しらうお/まらかす/らっぱ/こだいこ/ねこ/しまうま/めだか/きうい/しらさぎ/わまわし/ぬすびとはぎ/
まらかす
つぎにすすむよ
す
しろ/こめ/いなほ/こま/ぎょうじ/すもう/ばんぺい/かっぱ/りんご/おっとせい/かいこ/まき/すいか/ぎんぱい/ぱんけーき/
すいか
つぎにすすむよ
か
じんちょうげ/いど/ほね/いか/めざし/きもの/ぱんだ/ごりら/ろうそく/いも/かずのこ/きのこ/うぐいす/まさかり/こたつ/かっぱのこ/
かずのこ
つぎにすすむよ
こ
くびわ/すべりだい/つき/だんご/こんぶ/もも/のこぎり/げた/りす/かぶと/らっきょう/ねぎ/こうもりがさ/しま/どうだんつつじ/
こんぶ
つぎにすすむよ
ぶ
わかめ/たいこ/さい/じしゃく/ぶーつ/とかげ/ぎんか/きのこ/うま/すずめ/まんねんひつ/もみじ/りんどう/ごま/いしがき/
ぶーつ
つぎにすすむよ
つ
かに/じどうしゃ/めいろ/こがたな/つくえ/つきみそう/こすもす/げた/まんとひひ/めじろ/きじ/くつ/まんと/いけ/うずら/
つくえ
つぎにすすむよ
え
ひこうき/らっぱ/にじ/じんべい/えもんかけ/すのこ/けむし/ろば/うき/とき/たいこ/やし/ろうそく/つきみ/なす/
えもんかけ
つぎにすすむよ
け
いす/す/こぶ/しない/くつべら/こもり/ばけつ/きんこ/きつつき/けいと/じしゃく/みつばち/ぱーま/きつね/しらぎく/
けいと
つぎにすすむよ
と
くものす/こおろぎ/きんのしゃちほこ/りす/ちえのわ/すべりひゆ/ぶらんこ/ねこ/とうもろこし/いんき/つぼ/らくご/まつ/すいか/くじら/
とうもろこし
つぎにすすむよ
し
ゆうれい/すみ/わさび/すいか/ぼんぼり/かたばみ/こいし/こども/らくだ/ぎんこう/ごみばこ/つきみそう/こまつな/しい/きんもくせい/
しい
つぎにすすむよ
い
しめなわ/かものはし/うみう/みそさざい/うめぼし/だいがく/いのこづち/うずら/こおり/ももたろう/なきむし/みちしるべ/びわ/いわ/りんご/いも/
いのこづち
ち
つぎにすすむよ
ち
りぼん/らん/ちょうちん/もん/べーこん/わん/
ちょうちん
つぎにすすむよ
ん
ゴール!おめでとう
さる→るーれっと→とうがらし→しんでれら→らっぱ→ぱんけーき→きもの→のこぎり→りんどう→うずら→らっぱ→ぱーま→まつ→つきみそう→うめぼし→しるこ→こなや→やじろべえ→えんま→まらかす→すいか→かずのこ→こんぶ→ぶーつ→つくえ→えもんかけ→けいと→とうもろこし→しい→いのこづち→ちょうちん→%            

安野光雅しりとりファンのブログ4

4回目になりました。「ようこそブログ」に掲載された時間帯に見てくれた方がいるようです。 ありがとうございます。それ以外は自分しか見ていないブログです。いつもありがとうございます。

 

さて、前回のプログラムで、 「安野光雅しりとりをゴールできるパターンは、897通りある」 との説が濃厚になりました。

今回はこの結果が正しいものと仮定して、単語の出現率などを見ながらランキングしていこうと思います。

もしまだこの絵本で遊んだことがない方は、この先を読まない方がいいかもしれません。

注意:絵本はゴールできなくても最初のページに戻れるようになっていますが、ここでは2周目以降にゴールするパターンは考慮してません。 あくまで1周目でゴールできるパターンについて書いていきます。

 

まずはゴールできるパターンと、できないパターンの対比です。

全1825パターン中、

ゴールできるものが897

できないものが928

です。 ざっくり半々ぐらいなので2回に1回はゴールできるんですね。

 

次に、1ページ目の各単語のゴール確率です。スタート時にどれを選べば一番ゴールしやすいのか、気になった人も多いと思います。 全1825パターンに、各単語が何回出現するかを算出したのが以下の表です。

単語 ページ 全出現回数 あがり出現回数 あがり確率
けんびきょう 1 4 1 0.250
あさひ 1 18 6 0.333
いわし 1 270 126 0.466
うし 1 270 126 0.466
せなか 1 270 126 0.466
くま 1 4 2 0.500
ご1ま 1 4 2 0.500
きびだんご 1 154 78 0.506
すもも 1 154 78 0.506
おに 1 61 31 0.508
さる 1 47 24 0.510
そ1ば 1 47 24 0.510
えんどうまめ 1 211 109 0.516
こあら 1 211 109 0.516
かれーらいす 1 57 31 0.543
しるこ 1 43 24 0.558

(あがりパターンの出現回数)÷(全パターンの出現回数)=ゴールできる確率 としています。

 

最もゴールできる確率が高かったのは

 

1位しるこ 55.8%

2位かれーらいす 54.3%

 

しるこ、あんまり初手で選びませんね(私は)。 でもこういう意外な単語のチョイスがこの絵本のいいところだと思います。 子供に身近な、キャッチーな単語だけじゃなくて、知らない単語、大人でも「なにそれ」と思うような単語も載っています。 特に草花の名前ですかね。すべりひゆ、ぬすびとはぎ、とか知りませんでした。

 

安野さんの別の絵本で「ABCの本」というのも好きなんですが、これはA〜Zのアルファベットのページに、そのイニシャルが付くもののイラストが載っている、言ってみればよくあるタイプの絵本です。

しかし安野さんのは描き込みがすごいので見るたびに新しい発見があります。

各ページのふちどり(というかもはや額縁)は植物になっていて、Cならクローバー、Iならアイビーとか、見てわかるものもありますが、結構わからないんです。最後のページに

A guide to some of the things to be found in the pages of Mr Anno's Alphabet.

(この本にでてくるものの てびき)

としてまとめて載せてくれていますが、英語名なので調べないとピンとこないのもあります。

エンタメ飽和時代の昨今、見るべきものが沢山あり過ぎて、野山の草花をじっと観察する機会が少ない私です。そんな私にも興味を持つきっかけをくれる(しかも押し付けがましくない。あくまでこちらの知的好奇心に任せてくれる!some ofのsomeのところにアンダーラインがある!)貴重な作家さんだなあと思います。

 

脱線しましたが、しるこが1位なのは特に理由はわかりません。

3位〜14位も、51.6%〜46.6%と大差はなく、だいたい50%程度の確率で、各単語、満遍なくゴールできる、とも言えます。

ただ、残りふたつだけが目立って低いです。

 

15位あさひ 33.3%

16位けんびきょう 25.0%

 

けんびきょう、あんまり初手で選びませんね(私は)。 改めて絵本を見ると分かりますが、けんびきょうでスタートした場合、その後ずっと分岐がなくて、13ページまで来て初めて「くじら」「くものす」の2択になります。そしてこの2つのうちのどちらかは、ゴールできないのが確定しています。結構厳しいですね。

15位のあさひもスタートからずっと分岐がないまま、10ページの「まんと」「まんとひひ」で初めて2択になります。ところが11ページは「とき」「ひこうき」の2択でどちらも「き」で終わるので、先程の分岐があまり重要でなかったことがわかります。14ページまで進んでもまだゴール確率33.3%の「ぎんこう」が残っているので、終盤に大きく動くスリリングな手と言えます。

 

次に、最後のページの各単語の出現回数です。どの単語であがることが多いのか見てみます。

 

1位わん361

2位べーこん158

3位ちょうちん132

(同点)もん132

5位らん82

6位りぼん32

 

1位に比べると、6位のりぼんであがるパターンは随分少ないです。 りぼんでゴールするパターンを抽出してスタートの単語を見てみると、9種類ありました。 逆に言うと、この9種以外でスタートすると、りぼんではゴールできないということですね。 ついでに、わんでゴールするパターンの方も見てみると、13種類ありました。 気になって全部調べたのでこれも表にします。

単語 りぼん わん べーこん ちょうちん もん らん
けんびきょう     1      
あさひ   4       2
いわし 4 54 22 16 16 14
うし 4 54 22 16 16 14
せなか 4 54 22 16 16 14
くま 2          
ごま 2          
きびだんご 4 30 14 12 12 6
すもも 4 30 14 12 12 6
おに   12 7 5 5 2
さる   9 5 4 4 2
そば   9 5 4 4 2
えんどうまめ 4 42 19 18 18 8
こあら 4 42 19 18 18 8
かれーらいす   12 5 6 6 2
しるこ   9 3 5 5 2

 

どの単語であがるために、どの単語でスタートすべきかが一目瞭然です。 けんびきょう、くま、ごま、あさひが曲者です。

 

次は出現回数の少ない単語を見ていきます。

あがり出現回数が0のもの、つまりその単語を選んだらもうゴールできないことが確定するものは、17個あります。

中でも最短でドボンが確定する単語は

 

「ろば」11ページ

 

です。こうやって見ると、ろばのイラストも、うつむき加減で物悲しく見えてきます。

逆に、選んだ時点でゴールできることが確定する単語も見てみます。

あがり確率が100%の単語は37個ですが、そのうち最短であがりが確定するのは、

 

「いど」7ページ

 

です。早いですね。 いも、いか、いどの3択ですから、まず子供はいどを選ばないでしょう。こんなところに勝ち筋があったんですね。 安野光雅しりとり早抜け選手権があったら、みなさん「いど」を目指して頑張ってほしいと思います。

 

と、ここまで見てきましたが、実はもっとドラマチックな展開を期待してました。

どれからスタートしても、どうしてもこの単語選びがち!とか

この単語激レア!とかを発見できるかなーと思ったのですが、そんなことはなかったです。 ただ色んな人にやってもらってデータを集めて、どの道を通ったか、傾向を分析したら面白そうです。 あとは、2周目以降も繰り返しできるようなプログラムに変えて、何周で全部の単語を制覇できるかも、調べたいと思います。

安野光雅しりとりファンのブログ3

前回のプログラムでそれっぽい結果が出たのを励みに、今度は別の方法で書きました。前回と同じ結果が出たら、確信を強固なものにできるからです。
一番最初にやろうとしてエラーで出来なかった方法でもう一度やってみました。
試行錯誤の末うまくいったのですが、やっぱりエラーで動かなかったものも残しておけばよかったな…と少し後悔しています。何が間違っていたか、今となっては分からなくなってしまったのです。エラーメッセージにheapとかmemoryとかあったので、自分のpcのメモリの限界なのかなと勝手に思ってましたが、ちょっと書き方を見直せば解決できた気もします。
前回との大きな違いは2つです。

★しりとりの答えを1単語1要素として、2次元配列に格納する
★同じ単語が違うページにある場合、番号を振って区別する(すいか、すいか2、すいか3と表記)

2次元配列に入れておけば、ページごとに抽出したり、特定の単語の出現率を調べたりが簡単にできます。
その際に、例えば6ページ、13ページ、14ページと3回出てくる「すいか」を全部同じ単語にカウントしては困るので、複数出てくるものは区別することにしました。

できたのがこれです。

import java.util.regex.*;
class Xysiritori{
	public static void main(String args[]){
		String[]def1={"さる","きびだんご","くま","しるこ","こあら","すもも","そば","ごま","せなか","あさひ","うし","えんどうまめ","いわし","おに","けんびきょう","かれーらいす"};
		String[]def2={"かじか","るーれっと","ばすけっと","すし","にんにく","めがね","ものほしざお","ごぼう","ます","らむね","しか","ひしもち","うみがめ","こなや"};
		String[]def3={"すもう","かけす","やじろべえ","くつ","おかめ","とうがらし","かめ","ねじりあめ","ちからこぶ","とけい","からす","ねずみ","うめ","しじみ","めぐすり"};
		String[]def4={"しんでれら","いぬ","うきわ","りんごのき","めんたいこ","めがね2","つるはし","ぶるどっぐ","めかくし","すずめ","みつば","えんま","するめ","めざし","みそ"};
		String[]def5={"ばす","そば2","ぐらんぷり","しらうお","まらかす","らっぱ","こだいこ","ねこ","しまうま","めだか","きうい","しらさぎ","わまわし","ぬすびとはぎ"};
		String[]def6={"しろ","こめ","いなほ","こま","ぎょうじ","すもう2","ばんぺい","かっぱ","りんご","おっとせい","かいこ","まき","すいか","ぎんぱい","ぱんけーき"};
		String[]def7={"じんちょうげ","いど","ほね","いか","めざし2","きもの","ぱんだ","ごりら","ろうそく","いも","かずのこ","きのこ","うぐいす","まさかり","こたつ","かっぱのこ"};
		String[]def8={"くびわ","すべりだい","つき","だんご","こんぶ","もも","のこぎり","げた","りす","かぶと","らっきょう","ねぎ","こうもりがさ","しま","どうだんつつじ"};
		String[]def9={"わかめ","たいこ","さい","じしゃく","ぶーつ","とかげ","ぎんか","きのこ2","うま","すずめ2","まんねんひつ","もみじ","りんどう","ごま2","いしがき"};
		String[]def10={"かに","じどうしや","めいろ","こがたな","つくえ","つきみそう","こすもす","げた2","まんとひひ","めじろ","きじ","くつ2","まんと","いけ","うずら"};
		String[]def11={"ひこうき","らっぱ2","にじ","じんべい","えもんかけ","すのこ","けむし","ろば","うき","とき","たいこ2","やし","ろうそく2","つきみ","なす"};
		String[]def12={"いす","す","こぶ","しない","くつべら","こもり","ばけつ","きんこ","きつつき","けいと","じしゃく2","みつばち","ぱーま","きつね","しらぎく"};
		String[]def13={"くものす","こおろぎ","きんのしゃちほこ","りす2","ちえのわ","すべりひゆ","ぶらんこ","ねこ2","とうもろこし","いんき","つぼ","らくご","まつ","すいか2","くじら"};
		String[]def14={"ゆうれい","すみ","わさび","すいか3","ぼんぼり","かたばみ","こいし","こども","らくだ","ぎんこう","ごみばこ","つきみそう2","こまつな","しい","きんもくせい"};
		String[]def15={"しめなわ","かものはし","うみう","みそさざい","うめぼし","だいがく","いのこづち","うずら2","こおり","ももたろう","なきむし","みちしるべ","びわ","いわ","りんご2","いも2"};
		String[]def16={"りぼん","らん","ちょうちん","もん","べーこん","わん"};
		xycomp xycomp=new xycomp();
		xycomp.comp(def1);
		int yy=xycomp.comp(def2,15,0);
		yy=xycomp.comp(def3,yy,1);
		yy=xycomp.comp(def4,yy,2);
		yy=xycomp.comp(def5,yy,3);
		yy=xycomp.comp(def6,yy,4);
		yy=xycomp.comp(def7,yy,5);
		yy=xycomp.comp(def8,yy,6);
		yy=xycomp.comp(def9,yy,7);
		yy=xycomp.comp(def10,yy,8);
		yy=xycomp.comp(def11,yy,9);
		yy=xycomp.comp(def12,yy,10);
		yy=xycomp.comp(def13,yy,11);
		yy=xycomp.comp(def14,yy,12);
		yy=xycomp.comp(def15,yy,13);
		yy=xycomp.comp(def16,yy,14);
		xycomp.print();
		xycomp.print2();
		xycomp.total(def1);
		xycomp.total(def2);
		xycomp.total(def3);
		xycomp.total(def4);
		xycomp.total(def5);
		xycomp.total(def6);
		xycomp.total(def7);
		xycomp.total(def8);
		xycomp.total(def9);
		xycomp.total(def10);
		xycomp.total(def11);
		xycomp.total(def12);
		xycomp.total(def13);
		xycomp.total(def14);
		xycomp.total(def15);
		xycomp.total(def16);
	}
}
class xycomp{
	String[][]answer=new String[1830][16];
	void comp(String[]a){
		int y=0;
		for(String s:a){
			answer[y][0]=s;
			y++;
		}
	}
	int comp(String[]b,int yy,int xx){
		int count=0;
		int s=yy;
		for(int i=0;i<=s;i++){
			String current=answer[i][xx];
			String bottom;
			int len=current.length();
			String tail=current.substring(len-1,len);
			if(hiragana(tail)==true){
				bottom=current.substring(len-1,len);
			}
			else{
				bottom=current.substring(len-2,len-1);
			}
			for(String next:b){
				String top=next.substring(0,1);
				int jud=bottom.compareTo(top);
				if((jud==0) && (count==0)){
					answer[i][xx+1]=next;
					count++;
				}
				else if((jud==0) && (count!=0)){
					for(int t=0;t<=xx;t++){
						answer[yy+1][t]=answer[i][t];
					}
					answer[yy+1][xx+1]=next;
					count++;
					yy++;
				}
				else continue;
			}
			count=0;
		}
	return yy;	
	}
	void print(){/*answerをすべて表示*/
		for(int y=0;y<1830;y++){
			if(answer[y][0]!=null){
				System.out.println();
				System.out.print(1+y);
			}
			for(int x=0;x<16;x++){
				if(answer[y][x]==null) break;
				else System.out.print(answer[y][x]+" ");
			}
		}
		System.out.println();
	}
	void print2(){/*ゴールできるパターンをすべて表示*/
		int number=0;
		for(int y=0;y<1830;y++){
			if(answer[y][15]==null) continue;
			else{
				System.out.print(1+number);
				number++;
			}
			for(int x=0;x<=15;x++) System.out.print(answer[y][x]+" ");
			System.out.println();
		}
	}
	void total(String[]def){/*def[]の単語がansに何個出現するかカウントして表示*/
		int[]total=new int[16];
		int n=0;
		for(String s:def){
			int c=0;
			for(int y=0;y<1830;y++){
				for(int x=0;x<16;x++){
					if(answer[y][15]==null) continue;
					int j=answer[y][x].compareTo(s);
					if(j==0) c++;
				}
			}
			total[n]=c;
			System.out.println(s+" "+total[n]);
			c=0;
			n++;
		}
	}
	boolean hiragana(String value){/*最後の文字がひらがなかチェック*/
		boolean result=false;
		if(value!=null){
			Pattern pattern=Pattern.compile("^[\u3040-\u309F]+$");
			result=pattern.matcher(value).matches();
		}
		return result;
	}

ちょっと長いですね。たった今気が付きましたが、def1からdef16も2次元配列にしてしまえばもっと短く書けそうです。それはまた今度やるとして…
各メソッドの役割を、実際のanswer配列の変化を見ながら説明します。

【void compメソッド】
受け取った単語リストをanswerの配列に格納します。
xycomp.comp(def1);
これが実行されるとanswerの中身はこうなります。

 

   [0]
[0]さる 
[1]きびだんご 
[2]くま 
[3]しるこ 
[4]こあら 
[5]すもも 
[6]そば 
[7]ごま 
[8]せなか 
[9]あさひ 
[10]うし 
[11]えんどうまめ 
[12]いわし 
[13]おに 
[14]けんびきょう 
[15]かれーらいす

【int compメソッド】
「answerのx軸の最後尾要素の最後の文字(bottom)」と「次に入り得るdefの先頭の文字(top)」を比較して、しりとりになっていればdef(next)をanswerのx軸最後尾に追加します。
int yy=xycomp.comp(def2,15,0);
3つの引数はそれぞれ、
(これから比較するdef、現在のy軸の最後尾の要素番号[15]、現在のx軸の最後尾の要素番号[0])です。
yyには実行後のy軸の最後尾の要素番号が戻ってきます。

これが実行されると、
さる と かじか
さる と るーれっと
さる と ばすけっと
の順に比較していき、配列の中身はこうなります。

 

   [0]		[1]
[0]さる		るーれっと 
[1]きびだんご	ごぼう 
[2]くま		ます 
[3]しるこ	こなや 
[4]こあら	らむね 
[5]すもも	ものほしざお 
[6]そば		ばすけっと 
[7]ごま		ます 
[8]せなか	かじか 
[9]あさひ	ひしもち 
[10]うし		しか 
[11]えんどうまめ	めがね 
[12]いわし	しか 
[13]おに		にんにく 
[14]けんびきょう	うみがめ 
[15]かれーらいす	すし

ここからが苦労した部分です。次のdef3には、

「と」ではじまる単語が2つ

「か」ではじまる単語が3つ

「ね」ではじまる単語が2つ

あるので、このページ以降はdefをx軸最後尾に追加するだけでは収まりません。

新しく分岐したものを、そこまでの過程も含めてy軸の最後尾に

[16][0]、[16][1]、[16][2]と追加していく必要があります。

yy=xycomp.comp(def3,yy,1);

これが実行されると配列の中身はこうなります。

  [0]		[1]		[2]
[0]さる		るーれっと	とうがらし 
[1]きびだんご	ごぼう		うめ 
[2]くま		ます		すもう 
[3]しるこ	こなや		やじろべえ 
[4]こあら	らむね		ねじりあめ 
[5]すもも	ものほしざお	おかめ 
[6]そば		ばすけっと	とうがらし 
[7]ごま		ます		すもう 
[8]せなか	かじか		かけす 
[9]あさひ	ひしもち		ちからこぶ 
[10]うし		しか		かけす 
[11]えんどうまめ	めがね		ねじりあめ 
[12]いわし	しか		かけす 
[13]おに		にんにく		くつ 
[14]けんびきょう	うみがめ		めぐすり 
[15]かれーらいす	すし		しじみ 
[16]さる		るーれっと	とけい 
[17]こあら	らむね		ねずみ 
[18]そば		ばすけっと	とけい 
[19]せなか	かじか		かめ 
[20]せなか	かじか		からす 
[21]うし		しか		かめ 
[22]うし		しか		からす 
[23]えんどうまめ	めがね		ねずみ 
[24]いわし	しか		かめ 
[25]いわし	しか		からす

[16]〜[25]が分岐で増えた分ですね。
どこが苦労したかというと、yyの使い方です。いわば現在地を表すyyを、比較する際のfor文の中と、配列に追加する際の要素位置の指定の両方に使ってしまっていたのです。for(int i=0;i<=yy;i++)のように書いていたのですね。ところが要素位置のyyは実行中にどんどん増えますから、for文から抜けられなくなっていたんですね。
これを解決したのがint compの
int count=0;
int s=yy; です。
countは、現在の単語(current)につながる単語が次のdef(next)にあった場合、それがdefの中で何個目なのかをカウントしています。
例えば
[8][1]かじか につながる単語「かけす」が見つかると、このとき(count==0)なので、「かけす」は[8][2]に格納します。
どこかに格納するとcount++して1になります。(count!=0)になるので、これ以降の「かめ」「からす」はy軸方向に新しく増やすことになります。
[19]せなか    かじか        かめ 
[20]せなか    かじか        からす 
の列を見るとここに入ったのが分かりますね。

また、yyをそのまま使わずsにコピーして、
 for文の中ではs
 要素位置の指定にはyy
と使い分けることにしました。これでfor文を抜けられます。
今思うと簡単なことなのですが、なかなか出来ませんでした。変数を増やすほど、抽象的になって自分で読んでても分からなくなってくるんですよね。

こんな感じでdef16まで続けると、ゴールです。
1ページから16ページまで順番に結果が出るので、前回のプログラムよりも実際のしりとりの手順に近いです。

その他のメソッド4つです。
【printメソッド】
answerを表示します。要素がある限り全部表示しますので、15ページでしりとりが終わってしまった場合も含めて表示します。
【print2メソッド】
answerの中でも16ページに要素があるもの、つまりゴールできたパターンだけを表示します。
【totalメソッド】
answerに各ページの単語が何個出現するかカウントします。
【hiraganaメソッド】
すいか3やめがね2など、ひらがな以外のものを含んでいたらfalseを返します。
このひらがなチェックの部分は
https://medium-company.com/javaで数値チェックを実装する方法/
を参考にしました。分かりやすくて、大変ありがたいです。

print2メソッドで、ゴールできたパターンだけを表示すると、897通りの結果が出ました。
897!!!
前回と一緒の数字なんです。うれしい。やってよかった。

長くなってしまったのでここまでにします。
次回はこの結果をもとに、どの単語が一番ゴールしやすいのかなどを分析しようと思います。

 

安野光雅しりとりファンのブログ2

しりとりのパターンをプログラミングで調べる、と言ったものの、むか〜しむかしに学校でC++を少し齧った程度で、もう何年もコードなど書いていないのです。

初歩から勉強し直すことだし、いい機会なので、まだ触ったことのない言語でやってみることにしました。javaです。本屋さんの理工書の棚にあるjavaの本の中で一番優しそうな顔をしている「javaの絵本」というのを買ってきました。これを選んだのは大正解でした。図が多いし平易な言葉で書いてくれているので、ページがサクサク進んで、「学習が捗っている実感」があるのです。

他の本とは厚みや文字の量が全然違うので、初心者向けのかなりざっくりとした内容なのだろうな…と若干気にはなりますが、ひとまずはこの1冊を理解しよう、と決めて進めていきました。C++と共通点が多いことがわかり、懐かしい気持ちでサンプルプログラムを書いたり、エラーを直したりするうちに半分くらい終わり、ここらへんでもうしりとり書けそうだな、と思ったので、学習と並行して書き始めました。

完成したのがこれです。

   class Annosiritori{
	public static void main(String[] args){
		Word word=new Word();
		word.s=0;
		String[]def1={"さる","きびだんご","くま","しるこ","こあら","すもも","そば","ごま","せなか","あさひ","うし","えんどうまめ","いわし","おに","けんびきょう","かれーらいす"};
		String[]def2={"かじか","るーれっと","ばすけっと","すし","にんにく","めがね","ものほしざお","ごぼう","ます","らむね","しか","ひしもち","うみがめ","こなや"};
		String[]def3={"すもう","かけす","やじろべえ","くつ","おかめ","とうがらし","かめ","ねじりあめ","ちからこぶ","とけい","からす","ねずみ","うめ","しじみ","めぐすり"};
		String[]def4={"しんでれら","いぬ","うきわ","りんごのき","めんたいこ","めがね","つるはし","ぶるどっぐ","めかくし","すずめ","みつば","えんま","するめ","めざし","みそ"};
		String[]def5={"ばす","そば","ぐらんぷり","しらうお","まらかす","らっぱ","こだいこ","ねこ","しまうま","めだか","きうい","しらさぎ","わまわし","ぬすびとはぎ"};
		String[]def6={"しろ","こめ","いなほ","こま","ぎょうじ","すもう","ばんぺい","かっぱ","りんご","おっとせい","かいこ","まき","すいか","ぎんぱい","ぱんけーき"};
		String[]def7={"じんちょうげ","いど","ほね","いか","めざし","きもの","ぱんだ","ごりら","ろうそく","いも","かずのこ","きのこ","うぐいす","まさかり","こたつ","かっぱのこ"};
		String[]def8={"くびわ","すべりだい","つき","だんご","こんぶ","もも","のこぎり","げた","りす","かぶと","らっきょう","ねぎ","こうもりがさ","しま","どうだんつつじ"};
		String[]def9={"わかめ","たいこ","さい","じしゃく","ぶーつ","とかげ","ぎんか","きのこ","うま","すずめ","まんねんひつ","もみじ","りんどう","ごま","いしがき"};
		String[]def10={"かに","じどうしや","めいろ","こがたな","つくえ","つきみそう","こすもす","げた","まんとひひ","めじろ","きじ","くつ","まんと","いけ","うずら"};
		String[]def11={"ひこうき","らっぱ","にじ","じんべい","えもんかけ","すのこ","けむし","ろば","うき","とき","たいこ","やし","ろうそく","つきみ","なす"};
		String[]def12={"いす","す","こぶ","しない","くつべら","こもり","ばけつ","きんこ","きつつき","けいと","じしゃく","みつばち","ぱーま","きつね","しらぎく"};
		String[]def13={"くものす","こおろぎ","きんのしゃちほこ","りす","ちえのわ","すべりひゆ","ぶらんこ","ねこ","とうもろこし","いんき","つぼ","らくご","まつ","すいか","くじら"};
		String[]def14={"ゆうれい","すみ","わさび","すいか","ぼんぼり","かたばみ","こいし","こども","らくだ","ぎんこう","ごみばこ","つきみそう","こまつな","しい","きんもくせい"};
		String[]def15={"しめなわ","かものはし","うみう","みそさざい","うめぼし","だいがく","いのこづち","うずら","こおり","ももたろう","なきむし","みちしるべ","びわ","いわ","りんご","いも"};
		String[]def16={"りぼん","らん","ちょうちん","もん","べーこん","わん"};
		String[]bt1=word.comp(def1,def2);
		String[]bt2=word.comp(def3,def4);
		String[]bt3=word.comp(def5,def6);
		String[]bt4=word.comp(def7,def8);
		String[]bt5=word.comp(def9,def10);
		String[]bt6=word.comp(def11,def12);
		String[]bt7=word.comp(def13,def14);
		String[]bt8=word.comp(def15,def16);
		String[]ct1=word.comp(bt1,bt2);
		String[]ct2=word.comp(bt3,bt4);
		String[]ct3=word.comp(bt5,bt6);
		String[]ct4=word.comp(bt7,bt8);
		String[]dt1=word.comp(ct1,ct2);
		String[]dt2=word.comp(ct3,ct4);
		String[]ans=word.comp(dt1,dt2);
		int count=0;
		for(int i=0;i<ans.length;i++){
			if(ans[i]!=null) System.out.println(1+i+" "+ans[i]);
		}
	}
}
class Word{
	int s;
	String[]comp(String[]st, String[]st2){
		String[]bt=new String[1650];
		for(int y=0;y<(st2.length);y++){
			if(st2[y]==null) continue;
			for(int x=0;x<(st.length);x++){
				if(st[x]==null) break;
				int len=st[x].length();
				String bottom=st[x].substring(len-1,len);
				String top=st2[y].substring(0,1);
				int jud=bottom.compareTo(top);
				if(jud==0){
					bt[s]=st[x]+st2[y];
					s++;
				}
			}
		}
		s=0;
		return bt;
	}
} 

正直言ってめちゃくちゃ恥ずかしいのですが。

「基本が分かってないなー」

「普通そういう書き方しないんだよ」

「この部分効率悪くない?」

とか思われるんだろうなと。やっぱりこんなブログやめようかなと思うくらいなのですが。

でも学習過程を残すのは意味のあることと思うので、恥を忍んで、続けます。

最初、別の方法で書いたのですが、メモリが足りないのか、実行しても途中で止まってしまうので、メモリに優しそうな方法を考えました。

1ページ(def1)の単語と2ページ(def2)の単語をそれぞれひとつずつ抽出して比較し、しりとりになっていれば、そのふたつを繋げた文字列を新たに配列bt1に格納していくやり方です。

例えば

「さる」「かじか」→しりとりにならないので、次の単語に進む

「きびだんご」「かじか」→しりとりにならないので、次の単語に進む

「くま」「かじか」→しりとりにならな

(省略)

「せなか」「かじか」→しりとりになるので、「せなかかじか」を新たに作る

これを全ての組み合わせで行うと

1 せなかかじか

2 さるるーれっと

3 そばばすけっと

4 かれーらいすすし

5 おににんにく

6 えんどうまめめがね

7 すももものほしざお

8 きびだんごごぼう

9 くまます

10 ごまます

11 こあららむね

12 うししか

13 いわししか

14 あさひひしもち

15 けんびきょううみがめ

16 しるここなや

この16個の文字列が、配列bt1[0]〜bt1[15]に格納されます。

同じように3ページ目(def3)と4ページ目(def4)の単語も比較して、しりとりになっていれば繋げて、配列bt2に格納します。 さらに続けます。

def5とdef6を繋げたものをbt3

def7とdef8を繋げたものをbt4

(省略)

def15とdef16を繋げたものをbt8

これで最後のページまで来ました。

次は、さっきの工程で新しく出来た配列bt1からbt8までを比較していきます。

bt1とbt2を繋げたものをct1に格納します。ct1の中身はこうなります。

1 さるるーれっととうがらししんでれら

2 そばばすけっととうがらししんでれら

3 さるるーれっととけいいぬ

4 そばばすけっととけいいぬ

5 くまますすもううきわ

6 ごまますすもううきわ

7 けんびきょううみがめめぐすりりんごのき

8 すももものほしざおおかめめんたいこ

9 せなかかじかかめめんたいこ

10 うししかかめめんたいこ

11 いわししかかめめんたいこ

12 えんどうまめめがねねじりあめめんたいこ

13 こあららむねねじりあめめんたいこ

14 きびだんごごぼううめめんたいこ

15 すももものほしざおおかめめがね

16 せなかかじかかめめがね

17 うししかかめめがね

18 いわししかかめめがね

19 えんどうまめめがねねじりあめめがね

20 こあららむねねじりあめめがね

21 きびだんごごぼううめめがね

22 おににんにくくつつるはし

23 あさひひしもちちからこぶぶるどっぐ

24 すももものほしざおおかめめかくし

25 せなかかじかかめめかくし

26 うししかかめめかくし

27 いわししかかめめかくし

28 えんどうまめめがねねじりあめめかくし

29 こあららむねねじりあめめかくし

30 きびだんごごぼううめめかくし

31 せなかかじかかけすすずめ

32 うししかかけすすずめ

33 いわししかかけすすずめ

34 せなかかじかからすすずめ

35 うししかからすすずめ

36 いわししかからすすずめ

37 えんどうまめめがねねずみみつば

38 こあららむねねずみみつば

39 かれーらいすすししじみみつば

40 しるここなややじろべええんま

41 せなかかじかかけすするめ

42 うししかかけすするめ

43 いわししかかけすするめ

44 せなかかじかからすするめ

45 うししかからすするめ

46 いわししかからすするめ

47 すももものほしざおおかめめざし

48 せなかかじかかめめざし

49 うししかかめめざし

50 いわししかかめめざし

51 えんどうまめめがねねじりあめめざし

52 こあららむねねじりあめめざし

53 きびだんごごぼううめめざし

54 えんどうまめめがねねずみみそ

55 こあららむねねずみみそ

56 かれーらいすすししじみみそ

1ページから4ページまでのしりとりが全パターンありそうです。

この調子で続けて、最終的に1ページから16ページまでのしりとりが、配列ansに入ります。

ansの中身を全て載せると長いので、とりあえず数だけ書いておきます。

897です。 897通りのパターンで、ゴールできるようです。

合っているか分かりません。どうですかね?すごい凡ミスがあるかもしれません。だからこんなブログ書いてます。

ちなみにclass Wordの部分は最初は無くて、mainのほうだけで書いたのですが、それだとjavaを勉強している意味がないと思って、半ば無理やり分離しています。 クラスを効果的に使えるプログラムを書けるようになりたいな、と思います。

次回は検証のため、別のコードを載せてみます。

安野光雅しりとりファンのブログ1

安野光雅の「しりとり」という絵本を知ってますか?
最初のページから最後のページまで、しりとりになるように絵をひとつずつ選んでいく絵本です。

各ページに15〜16個の絵がのっていますが、最後のページは6個だけ。

この6個のうちのどれかにたどり着いて「ん」で終われるかどうか。

ゲーム性のある絵本です。

たどり着けなかった場合は最初のページに戻れるようになっています。

何度でも繰り返し遊べる、よくできた絵本です。

 

我が家でもよく子供と一緒に楽しんでいるのですが、毎回新しい道筋を通って、ゴールできたりできなかったりするので、一体正解は何パターンあるのだろうかと気になってきてしまいました。
検索しても答えは出てきません。
そこでプログラミングを使って調べてみました。
苦労の末、どうにか答えが出たのですが、これが合っているかどうか、確かめようがないのです。
もしもこのブログを読んでくれた人で、自分と同じように調べてみた人がいたら、ぜひ教えてほしいのです。

 

「しりとり」の絵本を知らないけどたまたまこれを読んでくれている奇特な人のために、少し説明します。
まず最初のページから好きな絵をひとつ選ぶのですが、「こあら」を選んでみます。
2ページ目の「ら」で始まるものを探すとひとつだけ「らむね」がありますので、これを選びます。
3ページ目は「ねじりあめ」「ねずみ」の二択なのでどちらか選びます。
4ページ目は「めんたいこ」「めがね」「めかくし」「めざし」の四択と「みつば」「みそ」の二択です。
つまり、「こあら」でスタートした場合

 

こあら らむね ねじりあめ めんたいこ
こあら らむね ねじりあめ めがね
こあら らむね ねじりあめ めかくし
こあら らむね ねじりあめ めざし
こあら らむね ねずみ みつば
こあら らむね ねずみ みそ

 

の6通りのパターンが、4ページ目までに出現することがわかります。
めかくし、めざしはどちらも「し」で終わるので、次のページで一緒になるのかと思いきや5ページ目には「し」のつくものが3つあったりします。
そんなかんじで分岐(と合流)を繰り返して、どんどん増えていきます。
遊ぶ度に毎回違う道筋になる理由がわかってもらえたでしょうか。

 

次回はコードを載せてみようと思います。