ねりあずぶろぐ

雑多です。

ポケ森から学ぶ経済学の初歩

今流行のスマホアプリ、「どうぶつの森 ポケットキャンプ」(略してポケ森)について書こうと思います。

ポケ森についてと言っても、ポケ森でこの動物が〜とかこんなレア魚釣ったぜ〜とかそういう話ではなく、今回はバザー機能にのみ注目しました。
個人的にバザーという機能はとても面白いなと感じています。
その理由はちょっとした経済の勉強になるからです。
僕が小学生の頃読んだ本で「レモンをお金に変える法(ルイズ・アームストロング著)」という本があります。
f:id:nerianighthawk:20171127200330j:plain:w200
この本はレモンからレモネードを作って売るというただそれだけの内容なのですが、どのように売れば儲けることができるのかという観点から経済学の初歩的考え方を一通り学べるようになっています。
今回のポケ森でもバザー機能で儲けるためにはどうすればいいか、一緒に考えてみましょう。

単価は?個数は?

最初にバザーに出店しようとして、まず悩むのはここでしょう。
もはやこれが決まれば今回の記事は終了なのですが、ここから考えないと話が進まないのでとりあえず考えて見ます。

まず、単価について考えてみましょう。
ポケ森では単価として設定できる上限額が決められています。
この額を今後「相場」と呼ぶことにしましょう。
相場はいまのところ3種類しかなく、100ベル、1000ベル、15000ベルの3つです(他にあればリサーチ不足です、ごめんなさい)。
そして、ポケ森ではこの相場の10分の1の価格でいつでも売却することができます。これより安い価格で売る意味はありません。
また、相場通りに売っても相場は設定できる価格の上限なので、相場より安い価格で売ってる人がいれば当然安い方を買うでしょう。
つまり、設定すべき単価をX、相場をSとして


{ \displaystyle
\frac{1}{10}S < X < S
}

という不等式が成り立ちます。
しかし、この間のどのくらいの価格に設定すれば買ってくれるのかはよくわかりません。
これは他のさまざまな情報を考慮しないと決まらないので後回しにしましょう。

次に個数についてです。
ポケ森ではまとめ売りができるようになっており、このまとめ売りの個数も重要なファクターとなっています。
個数も単価同様に最大値が決まっており、10個が最大となっています。
一つ例を挙げて考えて見ましょう。
相場1000ベルのものを半額の単価500ベルで10個まとめ売りをしたとします。
買う側は5000ベル払って10個買うわけですが、相場1000ベルのものというのは2日1回どうぶつ達から要求されるかどうかというものになっています。
つまり、いくら単価が安くても一気に10個もいらないわけです(ポケ森には持ち物の上限もあるので、邪魔になりかねません)。
もちろん買う側は1個ずつをたくさん売ってくれる方がありがたいですが、売る側はバザーに出品できる上限があるのでできる限りまとめて売りたいでしょう。
この問題を解決するためには、買う側がまとめて欲しい最小単位を知ることが出来れば良さそうです。
バザーで売買される品は基本的にどうぶつ達が要求している品です。
つまりどうぶつ達の需要がそのまま買い手の需要に繋がります。
相場毎に考えると、相場100ベルは一度に1~3個要求され、頻度も高いです。
相場1000ベルは時々1匹単位で要求されることがあります。
相場15000ベルは僕は今まで要求されたことがありません。今の所どうぶつ友好度20で要求されるという情報がありますが、真偽はわかりかねます。
以上のことを踏まえると

  • 相場100ベル→3匹セット
  • 相場1000ベル→1~3匹セット
  • 相場15000ベル→1匹単品売り

ぐらいが良さそうです。
個数については結論が出ました。

結局単価は?

正直なところ周りとの価格競争次第なのですが、相場の半額以下は割に合わない気がします。
僕は最初9割で売っていたのですが相場100ベルはぼちぼち買ってくれる人がいるという感じだったので、そこまで格安にしなくても買ってくれる人は買ってくれます。
しかし、相場1000ベルは売れ残ったので900ベルではなかなか出してもらえないみたいです。
それを考慮すると6~8割程度が妥当でしょうか。
僕は相場100ベルと1000ベルを3匹ずつまとめ売りすることで、3の倍数にして単価を相場の3分の2の値段で売るというのを実践中です。
2匹買えば1匹タダって感じでわかりやすいですし。

その他小技

売るという観点で見て、実は単価や個数より重要なものがあります。
それは宣伝です。
でもポケ森で宣伝ってどうやればいいの?って感じですよね。
実際に宣伝そのものはTwitterSNSで行うしかありません。
しかし、ただ「今自分のバザーでこんな感じで売ってます!」って常に発信することは困難です。
そこで、宣伝しやすい売り方を考えることが重要になってきます。

宣伝しやすい売り方とは?
要するに買い手にとってのわかりやすさです。
先ほどの単価の部分で説明した価格設定を全て相場の3分の2に統一するというのも一つのテクニックです。
ということで僕は川魚を相場の3分の2の価格で売ってます!!!
川魚を買うならぜひ「ねりあのバザー」で!!!
f:id:nerianighthawk:20171127213716j:plain:w200
フレコ:5975 4903 806
フレンド登録も受付中!!!
という感じで露骨に宣伝するといいと思います。

もう一つ小技としては僕は途中で気づいて実践し始めたんですが、10,20ベルぐらい下の価格設定にすることですね。
人には10000ベルと9980ベルで20ベルしか変わらなくても9980ベルの方がかなり安く見えるという錯覚があります。
ぜひ実践してみるといいと思います。

まとめ

こんな風に、ポケ森のバザーは経済が学べる面白い要素だと思います。
ぜひ一度考察してみてはどうでしょうか。
そして、冒頭で紹介したレモンをお金にかえる法ではこれ以上にもっと原価やレモンの賞味期限等多くの経済学的要素を含み話が展開していきます。
興味を持った方はぜひ一読してみてはいかがでしょう。
それでは今回はこれで!

どう頑張っても自分のデッキに勝てません

僕は2つデッキを持っています。
1つは昨日の大会で見事優勝したグソクゾロアです。
こっちは大会で使うデッキとして用意しています。
f:id:nerianighthawk:20171029193508j:plain:w100f:id:nerianighthawk:20171029193502j:plain:w100
そしてもう一つがアローラキュウコンデッキです。
f:id:nerianighthawk:20171030231627j:plain:w100
暇な時はよく1人で回したり、知人に手伝ってもらって自分のデッキ同士で対戦させたりしているのですが、今の所アローラキュウコンの全勝です。
じゃあアローラキュウコンの方が強いのでは?ってなるんですが、そういうわけでもないんですよねぇ…

アローラキュウコンGXというカードは本当にダメージレースでは強いカードだと思います。
なので、グソクムシャや今流行りのルガルガンにはなかなか負けないと思います。
しかし、一撃で高火力を出すサーナイトデッキや鋼タイプを主軸としたデッキにはまず勝てません。
そしてスピード感はないので、速攻性の高いマッシブーンにも勝てるか怪しいと考えています。

というわけで11月26日のチャンピオンズリーグにどっちで出ようかとても悩んでいます。
グソクゾロア→戦えるデッキの幅が広いが、常に安定して勝てるとは言えない
アローラキュウコンGX→ダメージレースでは安定して勝てるが、高火力デッキに苦戦を強いられる可能性と事故率はこっちの方が高い

うーん、ちょっとまとめてみた感じだと、アローラキュウコンGXの事故率を減らして環境の様子を見ながら調整した方がいいかもしれないですね。
次のジムバトルではアローラキュウコンで出ようかなぁ

ポケモンカードジムバトルに参加してきました。

今日はポケモンカードジムバトルに参加してきました。
場所は池袋のホビーステーション。
あいにくの大雨で「これは参加者少ないかもなぁ…」と思いながら、知人のしーさんと一緒に参加。

始まってみると参加者は10人でした。
皆さん大雨の中よく来るよなぁって人のこと言えませんがw
僕はゾロアークGX&グソクムシャGXのデッキでの参加です。
f:id:nerianighthawk:20171029193502j:plain:w150f:id:nerianighthawk:20171029193508j:plain:w150

1試合目

ということで1試合目スタートです。
相手は小学生になるかならないかぐらいの男の子、どうやら父親と揃っての参加のようです。
だいたい親子で参加しているパターンは英才教育を受けているので、全く油断できません。

じゃんけんで勝ち、先行を取り最初のポケモンをめくると、自分はコソクムシ、対して相手はウソッキー
うーん、ウソッキーだけじゃまだ何のデッキかわからない上にこっちは展開しづらくなってしまいました。

ひとまず手札にあったあずさを使い、ゾロアコソクムシ、カプ・コケコの3体で埋めてしまいました。
ウソッキーを倒さない限りもうこれ以上出せません。

次の相手のターン。
なんやかんやして手札から出てきたのはイワンコ
これ今超絶流行ってるルガルガンデッキってやつやん…w
f:id:nerianighthawk:20171029195001j:plain:w150f:id:nerianighthawk:20171029195005j:plain:w150

本当に子供だからと言って油断できませんが、あいにくこっちはグソクムシャ、相性が悪いかなぁ…
というわけで大人げなく勝ってしまいました。

相手のデッキ、ルガルガン以外はレジロックEXやストロングエネルギー等火力アップ系ギミックが多く、スピード促進系カードが少なかったので、そこはまだ子供らしいというかなんと言うか。
とりあえずゾロアークGXと組んでるみたいな英才教育を受けてなくてよかったw

2試合目

相手はラランテスGXデッキ。
f:id:nerianighthawk:20171029200931p:plain:w150

僕のデッキも含め、こう言った1進化ポケモンでスピードとほどほどの火力と耐久のバランスを兼ね備えたデッキ構築はカードゲーム業界で所謂ビートダウンに当たるんですが、ポケモンカードではビートダウンって言葉はあまり使いません。
なぜならビートダウンって技名を持ったポケモンがいるから。
〇〇ビートダウンって言うとなんか〇〇とビートダウンって技を持ったポケモンを組み合わせたデッキみたいに見えてしまう。
しかもそのビートダウンって技を持ったポケモンがややこしいことに古いゾロアークで、今流行ってるゾロアークGXとごっちゃになりやすいんだよなぁ。

閑話休題

相手はラランテスGXを主軸としてゾロアークGXでスピード促進していくデッキ。
ラランテスGX自体はとてもバランスの取れているカードなんですが、グソクムシャGXと戦うにはちょっとスピードが足りなさそう。
危なげなく勝つことができました。

3試合目

基本的に勝ち点の高いもの同士が当たるので、相手もすでに2勝してます。
相手のデッキはゾロアークドータクンデッキ。
そうきたかって感じですね。
f:id:nerianighthawk:20171029202823j:plain:w150f:id:nerianighthawk:20171029202749j:plain:w200
特殊エネルギーに頼らず鋼エネルギーを回していくスタンス。
速さも火力も申し分ないのでなかなか強敵。

グソクムシャGX VS ゾロアークGX
僕「じゃあ、であいがしらゾロアークに120ダメージです。」
相手「アセロラで回収、後ろのゾロア進化させてライオットビートでグソクムシャに120です。」
僕「アセロラで…後ろのグソクムシャであいがしら。」
相手「バトルサーチャーからのアセロラ、ライオットビート。」
僕「バトルサーチャーでアセロラであいがしらで…」

とても不毛。
そのあととても接戦をした後、勝利することができました!

終結

ということで全3戦で結果発表!
もちろん3戦全勝したので優勝です!
やったー!

考察

環境的にはゾロアークGXを使ったダメージレースを持ちかけるデッキが多いイメージです。
メインに添えるポケモンはスピードと火力にバランスが取れている1進化GXポケモンを採用するのが主流ですね。
もっとも流行っているルガルガンゾロアークに対して弱点を取れるというのが強みです。
そこに弱点を取れるグソクムシャは現環境に刺さっていると言ってもいいと思います。
また、今回ピン刺しで採用したカミツルギGXですが、やはり環境的に特殊エネルギーに頼ったデッキが多く(人のこと言えない)とても有効なカードだったと思います。
f:id:nerianighthawk:20171025182726j:plain:w150

また、その他デッキの種類としてはダメージレースでスピード特化のマッシブーンGX、高火力一撃ダウンを狙うサーナイトソルガレオラフレシアダストダスのロック、ジュナイパー等のダメージギミック系が挙げられますが、環境的に何よりもスピードが求められている気がするので、高火力系とロック系は相当速いまたは遅延能力が高くないと難しいと感じました。

f:id:nerianighthawk:20171029234337j:plain
デッキ調整する僕としーさん

AIの勉強会に参加した話、本当のタイトルは最後の1文に

どうも、最近あんまり余裕がないねりあです。

「余裕がない」というのも、仕事をしているとどうしても時間的余裕はなくなってしまうんですよね。
時間的余裕がなくなると精神的余裕も無くなりがちで、視野が狭くなったり、物事を楽しめなくなってしまったりするんですが、こういうのは良くないですよね。

ところで今日は機械学習の勉強会に参加してきました。
機械学習の勉強会と言っても、数学メインで機械学習に関係のある話をしようというもので、これなら参加しやすいかなと思って参加した感じです。
そもそもAIには興味があるものの体系的なものを何も知らなかったので、そういうのも少し知れて良かったですし、何より議論みたいなことが出来て楽しかったです。
機械学習の勉強のモチベも格段に上がりました。

人生可能な限り楽しいことをやるっていうのが僕のモットーですし、時間的余裕がないときこそ精神的余裕をもって、急がば回れの精神でやっていきたいなと思うので、今からスプラトゥーンをやります。
以上、スプラトゥーンを一緒にやってくれるフレンドを募集する話でした。

コータス先生の動的計画法講座 part1

ナップサック問題

ナップサック問題とは、それぞれ価値と重さが与えられた荷物と最大容量(入る最大の重さ)の決まったナップサックがあり、そのナップサックにどの荷物を入れれば価値を最大にできるかという問題(正確な問題文は「ナップサック問題」でググろう)。
今回はナップサック問題を数学的に考えてみます。次回はもう少しプログラミング的内容で書きます。

f:id:nerianighthawk:20170705205354p:plain(クチートちゃん)「コータス先生、こんにちは!今日は動的計画法について学びました!」

f:id:nerianighthawk:20170705210126p:plain(コータス先生)「こんにちは、クチートくん。それで、動的計画法についてはわかったのかい?」

f:id:nerianighthawk:20170705205354p:plain「はい、ナップサック問題をやったんですが、漸化式が{{\rm dp}(i, j) = {\rm max}({\rm dp}(i-1, j), {\rm dp}(i-1, j-w(i))+ v(i))}で与えられることがわかりました!」

f:id:nerianighthawk:20170705210126p:plain「ほう、わかったというのはちゃんと導くことができたということかな?」

f:id:nerianighthawk:20170705205354p:plain「うっ…そう言われると…」

f:id:nerianighthawk:20170705210126p:plain「ほら、いつも何か新しい式を学んだときはしっかりと導き出せるようにしとけって言ってるだろう?」

f:id:nerianighthawk:20170705205354p:plain「そうですね、これじゃただの暗記問題ですもんね。」

f:id:nerianighthawk:20170705210126p:plain「それじゃあナップサック問題について考えてみようか。まずはmax関数を定義しよう。」

{ \displaystyle
{\rm max}:\mathcal{P}_{\rm fin}(\mathbb{N})\to\mathbb{N}\\
{\rm max}(A) = a \ {\rm s.t.} \ \forall x \in A[a \geq x]
}

f:id:nerianighthawk:20170705205354p:plain「あの、何書いてあるのか全然わからないんですが。」

f:id:nerianighthawk:20170705210126p:plain「まあ、要するに有限な自然数の集合から最大のものを取って来るっていうだけだよ。」

f:id:nerianighthawk:20170705205354p:plain「はぁ…なるほど。」

f:id:nerianighthawk:20170705210126p:plain「そして、このmax関数を使ってナップサック問題の式をそのまま書くと以下のようになるよ。」

{ \displaystyle
f(N, W) = {\rm max}(\{v(1)x_{1} + \dots + v(N)x_{N}\ |\ w(1)x_{1} + \dots + w(N)x_{N} \leq W,\\
\hspace{100pt}x_{j}\in\{0,1\}\ (j=1,\dots ,N)\}
}

f:id:nerianighthawk:20170705205354p:plain「この式もわかんないです…」

f:id:nerianighthawk:20170705210126p:plain「この式はわかった方がいいね、ここから漸化式にもっていく必要があるからね。」

f:id:nerianighthawk:20170705205354p:plain「max関数はさっき定義した集合の最大値を見つける関数ですよね?中の集合は…v(1)からv(N)は価値で、それにxたちをかけて足してる?このxたちはなんですか?」

f:id:nerianighthawk:20170705210126p:plain「xは後ろの条件を見てもらえばわかると思うけど、{0, 1}の集合から取って来てるだろう?つまりオンオフを考えるためのものだよ。0なら入れない、1なら入れる。」

f:id:nerianighthawk:20170705205354p:plain「あ、なるほど、ナップサックに入れるかどうかを決めるためのものだったんですね。それなら後ろの重さについての条件も理解できます。」

f:id:nerianighthawk:20170705210126p:plain「よし、じゃあここから漸化式を作って行こうか。と言っても最適性の原理さえ知っていればそんなに難しくないんだけどね。」

f:id:nerianighthawk:20170705205354p:plain「最適性の原理?なんですかそれ?」

f:id:nerianighthawk:20170705210126p:plain「最適性の原理は『最適解の部分解は,元の問題の部分問題の最適解である』というものだよ。証明もできるけど、まあ常識的に考えても部分解が最適解じゃなかったら元の解も最適解じゃないよね。」

f:id:nerianighthawk:20170705205354p:plain「なるほど。これがどう使えるんでしょう?」

f:id:nerianighthawk:20170705210126p:plain「さっきの式に対して最適性の原理を考えると、任意のk≦Nとy≦Wに対してf(k,y)が部分問題の最適解になることがわかるよ。」

f:id:nerianighthawk:20170705205354p:plain「おお、なるほど!じゃああとはf(k-1,y)からf(k,y)を導けばいいので…{f(k,y) = f(k-1,y) + v(k)}でしょうか?」

f:id:nerianighthawk:20170705210126p:plain「おいおい、焦りすぎだよ。それじゃあいくらでも入れられるじゃないか。それにクチートくんが最初に言った公式とも合ってないよ。」

f:id:nerianighthawk:20170705205354p:plain「あ、そうですね。重さも考慮にいれなくちゃいけないし、常に価値が足されるわけではないですよね…。そのためのxですね。k番目のxが0のパターンはf(k-1,y)と変化がないのでそのまま、xが1のパターンは価値が足されるんですがそのために容量を確保しなくちゃいけないのでその分の重さw(k)を引けばいいんでf(k-1,y-w(k))+v(k)ですね!あとはどうやってxを決めるかですね…。」

f:id:nerianighthawk:20170705210126p:plain「それも今回話をしたよ。問題をよく考えて、今回やったことを思い出して見て。」

f:id:nerianighthawk:20170705205354p:plain「えっと、問題は最適解を見つけること。つまり価値をより大きくすること。ということはxが0か1かはそのときの価値が大きい方を取ればいいから…max関数です!」

f:id:nerianighthawk:20170705210126p:plain「それだ!じゃあ早速書いて見て!」

f:id:nerianighthawk:20170705205354p:plain「つまり漸化式は{f(k, y) = {\rm max}\{f(k-1, y),\ f(k-1, y-w(i))+ v(i)\}}ですね!」

f:id:nerianighthawk:20170705210126p:plain「そうだね、ちなみにk=1のときはyとw(1)の大きさを比べてyの方が小さければ0、大きければv(1)を入れてあげればいいよ。」

f:id:nerianighthawk:20170705205354p:plain「そうですね。漸化式なので初期値も用意しなくちゃですよね。」

f:id:nerianighthawk:20170705210126p:plain「これでクチートくんが最初に言っていた漸化式を求めることができたね。」

f:id:nerianighthawk:20170705205354p:plain「難しいですけど、面白いですね。最適性の原理は他にも応用が利きそうです。」

f:id:nerianighthawk:20170705210126p:plain「お、いい目をしているね。キーワードは動的計画法や多段階決定過程だから調べてみるといいよ。」

f:id:nerianighthawk:20170705205354p:plain「はい、精進します!」

f:id:nerianighthawk:20170705210126p:plain「それじゃあ今日はここまでにしようか。」

f:id:nerianighthawk:20170705205354p:plain「ありがとうございましたー!」


まとめ
ナップサック問題の漸化式は以下で与えられる。
{ \displaystyle
f(1,y) =
\begin{cases}
0&(y \lt w(1))&\\
v(1)&(w(1)\leq y)&
\end{cases}
\\
f(k, y) = {\rm max}\{f(k-1, y),\ f(k-1, y-w(i))+ v(i)\}\hspace{10pt}(2\leq k \leq N)
}

コータス先生の正規表現講座

とある日のクチートちゃんとコータス先生の会話

f:id:nerianighthawk:20170705205354p:plain(クチートちゃん)「コータス先生、こんにちは!」

f:id:nerianighthawk:20170705210126p:plain(コータス先生)「こんにちは、今日はどうしたんだい?」

f:id:nerianighthawk:20170705205354p:plain「はい、早速本題ですが正規表現ワイルドカードの違いがどうしてもわからなくて…。」

f:id:nerianighthawk:20170705210126p:plain「なるほど、たしかにごっちゃにしている人は多いねぇ…。ちなみにクチートくんの認識はどうなんだい?」

f:id:nerianighthawk:20170705205354p:plain「えっと、ワイルドカード正規表現も文字列の検索に使うものですよね?ワイルドカードの方が表現力が少ないなぁって感じる程度ですね。」

f:id:nerianighthawk:20170705210126p:plain「うん、まあ間違ってはないけど、その認識だと違いはわかりづらいかもなぁ。でも表現力っていうのは一つの違いだと思ってくれていいかな。文字列検索で使えるものというのも間違ってはいないから、文字列検索をする上での使用感の違いから入る方がいいかもね。」

f:id:nerianighthawk:20170705205354p:plain「でもひとくくりに正規表現と言っても実際はいくつも種類がありますよね?だったらワイルドカードも表現力の低い正規表現ってことになりませんか?」

f:id:nerianighthawk:20170705210126p:plain「あー、その認識はまずいね。なぜなら正規表現ワイルドカードでは文字列の検索の仕方が根本的に違うからね。」

f:id:nerianighthawk:20170705205354p:plain「説明をお願いします!」

f:id:nerianighthawk:20170705210126p:plain「そうだねぇ、例えば下の2つは同じように文字列検索をできるよね?」

ワイルドカード:あい*えお
正規表現   :あい.*えお

f:id:nerianighthawk:20170705205354p:plain「そうですね、どちらも"あい"の後に任意の文字が0文字以上続いて"えお"ってなっている文字列を検索します。」

f:id:nerianighthawk:20170705210126p:plain「そうだね、でもクチートくんの言った考え方はワイルドカード寄りの考え方なんだ。ワイルドカードでは、任意の文字を表す記号(だいたいは"*“と”?“)を扱って文字列検索を行うよ。」

f:id:nerianighthawk:20170705205354p:plain「え、じゃあ正規表現だとどういう考え方なんですか?」

f:id:nerianighthawk:20170705210126p:plain正規表現だと、『"あい"と"えお"の間に任意の文字が0文字以上続くような文字列の集合の中に存在する文字列を検索する』と考えるよ。」

f:id:nerianighthawk:20170705205354p:plain「そういえば、正規表現は文字列の集合を1つの文字列で表現したものだっていうのをどこかで読みましたね…。いまいちピンと来てないんですが、もう少し砕いた説明はありませんか?」

f:id:nerianighthawk:20170705210126p:plain「そうだね、いきなり文字列の集合だとか言われてもよくわかんないよね。じゃあまず簡単に0~9上での正規表現を考えてみようか。」

f:id:nerianighthawk:20170705205354p:plain「0~9上での正規表現???」

f:id:nerianighthawk:20170705210126p:plain「そう、文字としては{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}(以下この集合をNとおく)の10個の文字だけを使った正規表現だよ。」

f:id:nerianighthawk:20170705205354p:plain「なるほど、実用性は低そうですが、理解する上では重要なんでしょうね。」

f:id:nerianighthawk:20170705210126p:plain「デデン!それでは問題です!」

f:id:nerianighthawk:20170705205354p:plain(突然なんか始まった…)

f:id:nerianighthawk:20170705210126p:plain正規表現は文字列の集合です。では、N上の正規表現"..“はどんな集合でしょう?」

f:id:nerianighthawk:20170705205354p:plain「えっと、".“が任意の1文字を表す正規表現で今は0~9の文字しか使えないから…。答えは{00, 01, 02, …, 99}です!」

f:id:nerianighthawk:20170705210126p:plain「正解!正解したあなたにはどくけしをプレゼント!」

f:id:nerianighthawk:20170705205354p:plain(私、毒無効なんだけどなぁ…)

f:id:nerianighthawk:20170705210126p:plain「第2問!N上の正規表現で"0*“はどんな集合でしょう?」

f:id:nerianighthawk:20170705205354p:plain「2問目あるんですか!えっと、"*“は直前の文字が0文字以上続くの意味なので、答えは{0, 00, 000, 0000, …, 00000, …}ってあれ?無限集合になってしまいました…。」

f:id:nerianighthawk:20170705210126p:plain「残念、不正解!でも無限集合になってしまったからではないよ、むしろ無限集合になることは構わないよ。ちなみに正解は{, 0, 00, 000, 0000, …, 00000, …}。空の文字を忘れているよ。」

f:id:nerianighthawk:20170705205354p:plain「あ、そうか。0文字以上だから空の文字を含めなくちゃいけないんですね!」

f:id:nerianighthawk:20170705210126p:plain「どうだろう?少しは正規表現をわかってもらえたかな?」

f:id:nerianighthawk:20170705205354p:plain「そうですね、今になって考えるとワイルドカード正規表現って全然違うものなんだなと感じます。」

f:id:nerianighthawk:20170705210126p:plain「それはよかった。厳密に定義しようとするともう少し数学に詳しくないといけないから、その話はまた今度だね。」

f:id:nerianighthawk:20170705205354p:plain「はーい!今日はありがとうございました!」

まとめ

ワイルドカード:任意の文字を表す記号を使う。語源はトランプのワイルドカード(どんなカードにでもなれるカード)から来ているので、同じようなものだと考えて良い。 正規表現:文字列の集合を一つの文字列で表現する表現方法。何かしらの文字の集合が用意されており、その上に定義される。文字列検索の際はその集合の元として存在するかどうかで検索する。