ひまつぶしについて考えてたら、プログラミング素人がなぜかVBAを書いていた【3000文字チャレンジ】

こんにちは、霧島もとみです。

この記事は3000文字チャレンジ参加記事です。

今回のお題である「ひまつぶし」は、正直なところ困りました。

なぜなら私には潰すだけの「ひま」がそもそも無いからです。

仕事で忙しく飛び回ってるから暇がないんです!という訳ではなくて、ただ単に、日々の生活に追われていて時間がないよ~というだけではあるんですけれど。

そう。共働き&3人の子供(小学生×2と保育園児)という家族構成では、「あ~~~~~暇だな~~。なんか暇を潰せるものないかな~~~~」なんて悩むような時間はありません。

どんな風に日々を過ごしているのか?とういと、例えばこんな感じです。

 

【朝】
起きる→子供を起こす(なかなか起きない!)→朝食→間に合うように学校へ行かせる→保育園へ連れていく→出勤する

【昼】
仕事!!

【夕方~夜】
帰宅→保育園へ迎えに行く→夕食→子供と勉強→翌日の準備させる→洗い物→子供を風呂に入れる→子供を寝させる

 

どうでしょうか。忙しそうな感じ……伝わると嬉しいです。

純粋に、物理的に、暇な時間が少ないです。読もうと思っていた本も溜まっていく一方ですし、楽しみにしていたドラマや好きなお笑い番組も全然見れていません。

そんな私が何を「ひまつぶし」について書くのか。

あえて書くなら、ちょっとした待ち時間…例えば病院や銀行などで待っている時間をどう潰すかという事くらいですが、鞄に本を忍ばせるか、スマホをちょちょっといじっていればあっという間に過ぎてしまうため、特に書くことがありません。

そもそも隙間時間を有効活用しようって話ですから、「ひまつぶし」では無いですね。

やはり書くことが無い!

困りました。

 

そんなわけで、無理矢理話題を変えてみます。

 

「ひつまぶし」というものをご存じでしょうか?

名古屋名物として有名な鰻料理、櫃まぶしのことです。

あ、別に料理の紹介をするつもりはありません。

10年くらい前でしょうか。旅行で初めて名古屋に行ったときに「地元グルメの”ひつまぶし”を食べに行こう!」と友人に誘われました。

言われるままに食べにいきました。しかし、この「ひつまぶし」という言葉を脳が理解できなかったのか、僕にはずっと「ひまつぶし」「ひまつぶし」と聞こえていました。

だから「名古屋の人は暇つぶしに鰻を食べるのかあ、凄いなあ」と頓珍漢な感心をしていましたし、

もちろん注文する時も、

「”ひまつぶし”をお願いします」

と言って平然としていました。

後で気付き、顔が真っ赤になるほど恥ずかしい思いをしましたけど…。

そう。

「ひつまぶし」という言葉を、脳が勝手にアナグラム変換して既知の言葉である「ひまつぶし」として理解していたんです。

ふとそんな事を思い出しました。

 

そうだ。

アナグラムだ。

どうせ書くことがないのなら、「ひまつぶし」という言葉をアナグラム変換して何か面白い言葉が作れないかを調べたらどうか?

そんなことを僕はここで思い付いてしまったのです。

 

さて、「ひまつぶし」は5文字で構成されている単語です。

アナグラムで作成できる5文字のパターンは、

5! = 5×4×3×2×1 = 120通り。そこそこ多いです。

120通りの言葉の組み合わせを作るのはなかなか骨が折れる作業ですよね。

順番を機械的に入れ替えて言葉を作っていくだけの、単調で手間だけがかかる作業。

ちょっと考えただけで面倒くさいことが分かります。

「やっぱりやめようかなあ…」

早々に諦めかけました。でも少し考えたところで、

「そうだ!プログラムでアナグラムを作ればいいんじゃないか?」

と思い付いてしまったんです。

 

あれ?

「ひまつぶし」について3000文字チャレンジを書こうとしていたのに、気が付けば「5文字のアナグラム全通りを表示するプログラムを作る」ということになってしまいました。

何か方向性を間違ってない?

でもいいや。なんか面白そうだし。

ということでそのまま進めることにしました。

 

ちなみに私はプログラマーではありません。

たまたま仕事でVBA(Visual Basic for Applications)を少しだけ齧ったことがある、という程度のレベルです。ど素人もいいところです。

しかしながら、VBAの片鱗は掴んだ気がしていました。その経験から「アナグラムを作るプログラムがVBAで作れるんじゃないか?」と直感し、自分を信じて作ってみよう!と考えてしまったんですね。

こうなるとブログのことなんてそっちのけ。

僕は完全にプログラム作成に没頭していました。

 

1.まずは課題の構造を整理する。
→5文字の配置を表す数列を作り、それを「11111から55555までの全通りの組み合わせのうち各数字の重複がないもの」を作ればいいんじゃないか?

2.構造をプログラムでどう表現するかを考える。
→繰り返し作業の「for ~ next」か「do ~ loop」を使えばできるんじゃないか?

3.プログラムを出来るだけ短く、美しく、応用できるように作れないか考える。
→考えたけど無理。5文字アナグラムに限定して、とにかく処理できるものを作ることに決める。

4.プログラムを書く!そして実行!
→書けた!実行した!何も表示されなかった!

5.デバックモードで検証して修正
→原因を見つけて修正。実行…も正しく動かず。さらに検証したところ、繰り返し条件に誤りがあり、アナグラム文字が一切出力されないまま終わっていたことが分かる。修正。

6.再度検証&修正
→プログラムが実行!しかし、「ひまつぶし」が120個表示されるという実行結果に。再びデバックモードで検証したところ、変数の記載ミスが分かり修正。

7.再度検証&修正
→120個のアナグラムが無事に表示!!やったあ!!

こうして僕は、VBAを使い、「ひまつぶし」という言葉のアナグラム全120パターンを出力することに成功したのです。

嬉しかったですね。

解くべき課題の構造を整理し、
プログラムでそれを表現して、
トライ&エラーを繰り返していき、
最終的に狙い通りの結果を得る!

ほんの小さなプログラムでしたが、普段の生活では感じたことのないような快感と達成感を感じました。

これ、クセになるかも…。

画面に表示された120個のアナグラムを眺めながら、にやついた表情のまま、僕はしばらく余韻に浸っていました。

 

あ、そうそう。

アナグラムを出力した結果、何かいい言葉が見つかったかというと……

特に意味のある言葉は見つかりませんでした

強いて言えば「支部待つ日」くらい。ちょっと無理やりすぎますね。

ということで、「ひまつぶし」と「ひつまぶし」だけが、この5文字から作られる言葉として意味を持つものだという事が確認できたんですが……。

 

あっ!!

 

ここで僕はあることに気が付きました。

 

この「ひまつぶし」のアナグラムをプログラミングしようという行為

 

この意味のない行為こそが……、

 

「ひまつぶし」そのものでした。

 

ということで無理矢理ながらオチも付いたので、3000文字「ひまつぶし」を終えさせていただきます。

あと、何の意味もありませんが、この記事のために僕が作ったVBAを以下に貼っておきます。

【ど素人の自作VBA】

Sub ひまつぶしアナグラム()
‘5文字のアナグラムマクロ

n = Len(Range(“a1”))

‘5文字以外ならマクロ終了

If n <> 5 Then End

‘アナグラムはここから

Dim 配置() As Integer
Dim 文字() As String
Dim アナグラム文字 As String

ReDim 配置(n – 1)
ReDim 文字(n – 1)

‘アナグラム配列に1文字ずつ代入する

Dim i As Integer
Dim j As Integer

For i = 0 To n – 1

文字(i) = Mid(Range(“a1”), i + 1, 1)
配置(i) = 1

Next i

‘jは処理の番号とセルの列番号でもある

j = 1

Do
‘1番目の要素に対しての繰り返し処理。

Do

‘2番目の要素に対しての繰り返し処理。

If 配置(1) <> 配置(0) Then

Do

‘3番目の要素に対しての繰り返し処理。

If 配置(2) <> 配置(0) And 配置(2) <> 配置(1) Then

Do

‘4番目の要素に対しての繰り返し処理。

If 配置(3) <> 配置(0) And 配置(3) <> 配置(1) And 配置(3) <> 配置(2) Then

Do

‘5番目の要素に対しての繰り返し処理。ここで出力する。

If 配置(4) <> 配置(0) And 配置(4) <> 配置(1) And 配置(4) <> 配置(2) And 配置(4) <> 配置(3) Then

アナグラム文字 = 文字(配置(0) – 1) & 文字(配置(1) – 1) & 文字(配置(2) – 1) & 文字(配置(3) – 1) & 文字(配置(4) – 1)

Range(“c1”).Offset(j – 1, 0) = j
Range(“c1”).Offset(j – 1, 1) = アナグラム文字

j = j + 1

End If

配置(4) = 配置(4) + 1

Loop Until 配置(4) = 6

配置(4) = 1

End If

配置(3) = 配置(3) + 1

Loop Until 配置(3) = 6

配置(3) = 1

End If

配置(2) = 配置(2) + 1

Loop Until 配置(2) = 6

配置(2) = 1

End If

配置(1) = 配置(1) + 1

Loop Until 配置(1) = 6

配置(1) = 1

配置(0) = 配置(0) + 1

Loop Until 配置(0) = 6

End Sub

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です