google apps script で解く、数学パズル
TRANSCRIPT
@nekonenene
自己紹介
ハトネコエ
着メロ作成に興味を持ち MIDI に触
れはじめ、音楽制作をするようになる。
最近ではプログラミングに時間を忘れ
るくらい熱中してしまい、家の初音ミク
さんに歌わせてあげられず、頭を下げ
る日々。
技術 Blog : http://nekonenene.hatenablog.com
言い訳
風邪ひいてました
先週土曜日:
「LT会?
よくわかんないけどおもしろそう!」
日曜日:
風邪をひき始める
そして今:
神「今回の失敗をもとに、
次回の発表を頑張るんだ……」と試練を与えてくださったのだと思います
Google Apps Script is なに?
ざっくり言うと……
Google が提供する
Google Drive 内のデータや
Google カレンダー、
G-Mail のデータを使った
マクロが作れちゃうサービス
基本は JavaScript
こんな使い方ができる!
組み合わせで使い方は無限大!
参加者が諸情報を入力する
Google フォーム
+
その情報が管理された
Googleスプレッドシート
+
指定時刻にスクリプトを発火する機能
⇓イベント前日に、
参加者のメールアドレスへ
一斉にリマインドメールを送信
もっと知りたい方は……
https://developers.google.com/apps-script/reference
公式のリファレンスがとて
も丁寧に網羅的に説明
してくれています
では、実際にご覧ください(未完成)
発表ではここで、今回作成したプログラムの実行をお見せしました。以下の URL に、誰でも編集可能な複製のファイルを置きましたので、メニューの「★」から実行させたり、「ツール>スクリプトエディタ…」で中身をご覧ください。(力技で書いた保守性の悪い部分があるのでお恥ずかしい……きれいに作るなら、一度配列に全結果を入れてから、表に setValues するのがいいです)https://docs.google.com/spreadsheets/d/1uKhr5pI16leIp_JKlx9OO0JFnznDQUeimQ0SQzijJDo/edit?usp=sharing
解くために何をしているか
ペイントロジックの極意
基礎:
1. マスは、塗れるか塗れないかわか
らない初期状態のマスから始ま
り、色を置ける塗りつぶしマス、も
しくは確実に置けないマスのいず
れかに遷移
2. 書かれている数字の数だけ連続
したマスを塗れたとき、条件を満
たしたと言える
3. 条件を満たした塗りつぶしマスの
両端には、塗りつぶしマスを置け
ない
Step 1 : 左右から見た重複
ある数を除いて、ハシに寄せてギリギリのところで塗り
つぶしマスを置いたとき、それを除いたマス数の2分の1よりその数が大きな場合は、その大きい分だけ、
中心を境に塗れる
1 5 □□□□□□□□ ⇒ 1 5 ■×□□□□□□ ⇒ 1 5 ■×□□□□□□ ⇒ 1 5 ■×□■■■■□
Step 2 :ハシっこから見た延長
ハシにある塗られたマスをハシから数えたとき、ハシ
の問題数字より小さいなら、その少ないぶんだけ、ハ
シとは逆の方向に塗りつぶしマスを増やせる
5 □□■□□□□□ ⇒ 5 □□■■■□□□
Step 3 : 条件を満たした左右は置けないマス
連続した塗りつぶしマスが数字の条件を満たしてい
るのが間違いないとき(←これをどう示すか)、その両
端は置けないマスとなる
5 □■■■■■□□ ⇒ 5 ×■■■■■×□
Step 4 : 置ける幅が狭いなら置けないマス
ハシにある置けないマスに挟まれたマスの連続数
が、ハシの数字より小さい場合は、そのマスは全て置
けないマスとなる
5 □□□□×□□ ⇒ 5 ×××××□□
Step 5 : 未実装の課題1 - 置けないマスの推定
ある条件で絶対置けないマスというのが存在する3 □□□□×□□■■■■
例えば上のような状態になっているとき、バツの右側
には絶対置けないので、3 □■■□×□□■■■■
というふうに塗れる。
Step 6 : 未実装の課題2 - 条件達成マスの推定
例えば 1 1 3 □□□■□□□□……
となっていれば、すでに塗られている1マスは
「1 1 3」の、どちらかの1と推定できるので1 1 3 □□×■×□□□……
とバツを付けられる
便利なショートカット
スクリプトエディタには載っていない
便利ショートカット
WindowsCtrl + R : 実行(Run)Ctrl + D : 一行削除
MacCommand + R : 実行
Ctrl + K なども機能する
イケていないところ
Google Apps Script のスクリプトエディタは、
ぶっちゃけかなり使いづらい
・実行時間がいちいち長い
・gsファイルを分けると見づらい
分けないとブラウザが落ちる
・クラス化させるとコード補完が働かな
い
・正常終了したときしかコンソールログ
が見られない
・無限ループが発生するなどで動作が
終わらないとき、うまく強制終了させら
れない
どこがいい?
Google Apps Scriptの
使いドコロ
(熊谷さん、いつもお世話になっております……!)
主催の佐野さん(@taketo1024)からも、「使う意義を感じなかったんだけ
ど(笑)」とツッコミをいただきました。
Google Apps Script が向いてること、不向きなこと
使い慣れてくる言語にはついつい辛辣になってしまいますが、
もちろん Google Apps Script(以降 GAS と記述します)だから
出来ること、というのは存在します。
GAS の向き不向きについて、いくつかお話いたします。
あ、関係ないですが、欠点を話の最後に言うか利点を最後に言うかで、
受ける印象は影響されるという研究結果がありますので、
人や子供を叱るときは、「でも、○○してくれたのは良かったよ」と締めくくるようにすると
行動することに対するモチベーションを下げにくくて良い結果を生みます。
複雑なロジックを組むには適さない
ペイントロジックを解くなど、数百行になるプログラムを書くのには不適です。
いつもの感覚でクラスを作ると、コードのメソッド補完が効かなくなって
GAS 用のメソッドを手打ちする事態になるのでやめましょう。
物智さんすごく博識でおもしろかったです。
学生料金で 24900 円もする Mathematica を買って
独自のコードを覚えるコストは厳しいですが、
Mathematica のようなものを Python ベースで書ける
Sage は、わりとおもしろいんじゃないかなって思います。
Python 学ばなきゃ…!
http://sakito.jp/python/sagemath.html
大量のデータを処理するには向かない
社で、「1000人の顧客データが2つのシートに分かれてしまっているから、ハッシュキー
を基に連結してほしい」と頼まれたのですが、
もともとGASの実行時間が遅いうえに、コンソールログが正常終了後まで見られない仕様
上、デバッグに1回3~4分毎回かかるとなって、つらさしかなかったです。
おおむね5分以上の処理時間になると、タイムオーバーでエラーになり、エラー終了なの
でコンソールログも出なくて泣けてきます。
CSV出力させて jQuery で処理させるとかのがよっぽど現実的だと思います。
jQuery 学ばなきゃ……!
非技術者を助ける機能を作りやすい
今回のプログラム中の、「ユーザーの指定した幅を持つペイントロジックのテンプレートを
作る」くらいでしたら、そこまでコードは複雑化しませんし、
そのまま印刷してもらえれば、パズル同好会などで使える機会があるでしょう。
(その部分だけを Gist に上げてみました:
https://gist.github.com/nekonenene/ce56940278ef4de55e0b )
他の例ですと、
最近は社内データを Google Docs を使って管理している会社も多いですから
そこに上がってくる大量のデータをもとに計算をする経理さんの負担を、
スプレッドシートに GAS で機能追加し半自動化することで、恒久的に減らすことが可能
になります。
まつけんさんは
私の発表後、
このように書かれていました。
Excel で VBA を使うには、
Visual Basic ベースですので
最近のエンジニアにはやや敷居が
高いです。
その点、JavaScript で書け
る GAS は使い勝手が良く、また、
作った関数を再利用する機会が望
めるのもいいですね。
表を作るプログラムとしては手軽
表データを読み込み処理し、表データとして出力する一連の流れを一からプログラミング
するのはどうしても手間がかかります。
CSV ファイルを扱うことで出来る部分は多いですが、「表のここに色を付けてここに線を
引いて見やすく」などと考えていくと、大変です。
その点、最初から表を扱うことを想定された GAS なら、より手早く書くことができます。
また、実際に使うかたがプログラムの制作者でない場合、表データをダウンロードしロー
カルでプログラムを実行させる流れよりは、スプレッドシートのメニューをポンポンと押すほ
うが、わかりやすく速く済ませられます。
作ったスクリプトを公開できる
汎用的に使えるスクリプトを作ったとき、それをスプレッドシートの「アドオン」として、世界
中に公開することが可能です。
あまり「アドオン」の認知度が高くなく、公開の場が盛り上がっていないのが残念ですが、
もしかするとあなたのスクリプトは、世界中の人を幸せにするかもしれません。
言語の使用は適材適所
やはり道具をいかに使うかが大事
「これ GAS でやったらすぐ作れるので
は?」
「あれとあれを組み合わせて GAS で作ったらおもしろそう!」
と思った時に使うのがベストですね。
基本は JavaScript なので、2時間も
しないでおおむね扱えるようになります。
学習コストは低いですよ!
簡単で、リファレンスも親切ですので、結
果のすぐ出る軽いコードで遊び始めると、
長く楽しめると思います。
~まとめ~
Google Apps Script の世界へ飛び込もう!
入口はこちら ⇒ https://developers.google.com/apps-script/