google apps script で解く、数学パズル

38
Google Apps Script で解く、数学パズル ハトネコエ ( @nekonenene ) 2015/11/21 『第5回 プログラマのための数学勉強会』 LT会資料

Upload: hatonekoe

Post on 13-Apr-2017

447 views

Category:

Technology


0 download

TRANSCRIPT

Google Apps Scriptで解く、数学パズル

ハトネコエ ( @nekonenene )2015/11/21 『第5回 プログラマのための数学勉強会』 LT会資料

@nekonenene

自己紹介

ハトネコエ

着メロ作成に興味を持ち MIDI に触

れはじめ、音楽制作をするようになる。

最近ではプログラミングに時間を忘れ

るくらい熱中してしまい、家の初音ミク

さんに歌わせてあげられず、頭を下げ

る日々。

技術 Blog : http://nekonenene.hatenablog.com

制作、間に合いませんでした!!

言い訳

風邪ひいてました

先週土曜日:

「LT会?

 よくわかんないけどおもしろそう!」

日曜日:

風邪をひき始める

そして今:

言い訳

風邪ひいてました

先週土曜日:

「LT会?

 よくわかんないけどおもしろそう!」

日曜日:

風邪をひき始める

そして今:

神「今回の失敗をもとに、

 次回の発表を頑張るんだ……」と試練を与えてくださったのだと思います

それはさておき……

Google Apps Script  とは?

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  使うのやめよう

と、書いてしまったらこんなツイートが・・・

しまった! 欠点を書きすぎた!

ここからはその疑問にお答えする、文章量多めの追加スライドです。

どこがいい?

Google Apps Scriptの

使いドコロ

(熊谷さん、いつもお世話になっております……!)

主催の佐野さん(@taketo1024)からも、「使う意義を感じなかったんだけ

ど(笑)」とツッコミをいただきました。

Google Apps Script が向いてること、不向きなこと

使い慣れてくる言語にはついつい辛辣になってしまいますが、

もちろん Google Apps Script(以降 GAS と記述します)だから

出来ること、というのは存在します。

GAS の向き不向きについて、いくつかお話いたします。

あ、関係ないですが、欠点を話の最後に言うか利点を最後に言うかで、

受ける印象は影響されるという研究結果がありますので、

人や子供を叱るときは、「でも、○○してくれたのは良かったよ」と締めくくるようにすると

行動することに対するモチベーションを下げにくくて良い結果を生みます。

Google Apps Script が向いていないこと

複雑なロジックを組むには適さない

ペイントロジックを解くなど、数百行になるプログラムを書くのには不適です。

いつもの感覚でクラスを作ると、コードのメソッド補完が効かなくなって

GAS 用のメソッドを手打ちする事態になるのでやめましょう。

物智さんすごく博識でおもしろかったです。

学生料金で 24900 円もする Mathematica を買って

独自のコードを覚えるコストは厳しいですが、

Mathematica のようなものを Python ベースで書ける

Sage は、わりとおもしろいんじゃないかなって思います。

Python 学ばなきゃ…!

http://sakito.jp/python/sagemath.html

大量のデータを処理するには向かない

社で、「1000人の顧客データが2つのシートに分かれてしまっているから、ハッシュキー

を基に連結してほしい」と頼まれたのですが、

もともとGASの実行時間が遅いうえに、コンソールログが正常終了後まで見られない仕様

上、デバッグに1回3~4分毎回かかるとなって、つらさしかなかったです。

おおむね5分以上の処理時間になると、タイムオーバーでエラーになり、エラー終了なの

でコンソールログも出なくて泣けてきます。

CSV出力させて jQuery で処理させるとかのがよっぽど現実的だと思います。

jQuery 学ばなきゃ……!

Google Apps Script のいいところ

非技術者を助ける機能を作りやすい

今回のプログラム中の、「ユーザーの指定した幅を持つペイントロジックのテンプレートを

作る」くらいでしたら、そこまでコードは複雑化しませんし、

そのまま印刷してもらえれば、パズル同好会などで使える機会があるでしょう。

(その部分だけを 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/