はぎあの裏のラクガキ

自身の制作物に関することや、自分の考えなどを置いておきます

Pokemon Smile ポケモンゲットのコツ

歯磨きを楽しくするという子供向けアプリ『Pokemon Smile』において、ポケモン捕獲率を上げる歯の磨き方についてまとめました。自分でやってみた所感であって、 きちんとした検証は行っていません のでご了承ください。

結論

奥歯を磨くような動き(実際に磨く必要はない)がポイント高い。逆に前歯を磨く動きはポイント低い。

捕獲効率の良い動きの詳細

結論にも書いた通り、奥歯を磨く動きが効率いいです。しかし、100秒程度ずっと奥歯だけを磨くとむしろ歯に悪そうです。
実は、歯を実際に磨かなくても問題ありません。歯ブラシを頬にこすりつけるような感じに手を動かすと、奥歯を磨いた時と同程度に(ゲーム上での歯の)汚れが取れます。奥歯の表側を上下にブラッシングする動きでも同様の効果があるので、前後に手を動かすのに疲れた場合はそのようにするといいでしょう。
恐らく手の動きが判定されているので、歯ブラシを持たなくても、手をそれっぽく動かせばポケモンを捕獲できます。

最後に

初見プレイでポッポを捕まえられなかったのが悔しくてこの記事を書きました。この記事が、ポケモンを捕まえられない人の助けとなれば幸いです。

ブログ名変えました

以前は「はぎあのプログラミング譚」という名前でしたが、プログラミング以外のことも書きたくなってきた(というか最近プログラミング全然やってない)のでプログラミングに縛られない名前に変えました。チラシの裏の落書きという表現を意識していますが、私の裏側をみたいならTwitterを見るのがいいと思います。

これからは更新頻度を増やしていきたいです。私は飽き性なので多分続きませんが。

JOI2020 1次予選(1回目) A - 3つの整数(Three Integers) Brainfuck解答

はじめに

この記事では、JOI2020 1次予選(1回目)A問題のBrainfuck解答の解説をします。普通の解説が必要な方は他の記事を見たほうが有益かと思います。

問題概要

整数 A, B, Cが与えられる。この3つの整数はいずれも1か2である。1と2のうち多い方の数を求めよ。

解説

解答コードはページの一番下に載せてあります。

配列

解答において、brainfuckの配列には以下のように変数を当てています。

index 0 1 2 3 4 5 6 7 8 9 10 11 12
A (空白) B (空白) C A2 A3 B2 B3 C2 C3 F1 F2
  • A2, A3: Aのコピー(B, Cについても同様)
  • F1, F2: 分岐処理に使うフラグ(後述)

Brainfuckの基本テクニック

本コードの解説の前に、解答で使うテクニックをいくつか紹介します。以下、brainfuckの配列のn番目の値をv[n]と表します。

値のコピー

brainfuckでは値を破壊することが多くあるため、値のコピーが必要になります。
下記のコードはv[0]の値をv[1]とv[2]にコピーするコードです。

[>+>+<<-]
値の比較

下記のコードはv[0]とv[1]を比較します。v[0]=v[1]のとき、v[1]=0、そうでない時v[1]≠0となります。(v[0]の値はいかなる場合も0です。)

[->-<]
条件分岐

[]を使用することで、ポインタの指す場所の値が0でないかどうかで条件分岐ができます。他言語でいうelse句は、else句を実行するかを記録するフラグを用意し、then句の中でelse句を実行しないようにします。
下記のコードは、v[0]≠0のとき処理1を、そうでない時処理2を実行するコードです。else句実行フラグはv[1]とします。

[[-]>[-]<(処理1)]>[[-](処理2)]

以上のテクニック()を使うことで、この問題は比較的簡単に解くことができます。

解答コード(Brainfuck)

わかりやすさのためにコメントやインデントを入れています。

,>,>,>,>,<<<<[>>>>>+>+<<<<<<-]>>[>>>>>+>+<<<<<<-]>>[>>>>>+>+<<<<<<-]>>>>>>>+>+<<<<<<< 変数の初期化(詳細は解説の配列の項を参照のこと)
[->>-<<]>> もしA2≠B2ならば
    [<[->>>-<<<]>>> もしA3≠C2ならば
        [<.>>>[-]>[-]<<<[-]] B3を表示し、以下のコードを実行しないようにする(C2, F1, F2を0にする)
    >>>[<<.>[-]>[-]]<<<<<[-]] A3=C2ならば、C3を表示し、以下のコードを実行しないようにする(B2, F1, F2を0にする)
>>>>[<<<<<.[-]] A2=B2ならばA3を表示する

Re: AtCoderで青になるまでにやったこと

f:id:hagyu_aya:20190804232904p:plain
レートの推移

はじめに

AtCoderで青色になった(2回目)はぎあ(AtCoder: hagyu_aya)です。タイトルにReとか付いてますが、驚くべきことに、Reのついてない記事を探そうとしてもありません(ないので)。1, 2回目に青になるまでを振り返っていきます。1回目に青になったのは2018年9月と相当昔(この記事を書いた約1年前)なので、結構記憶が怪しいですがご容赦ください。2019年5月以降の新ABCは少し勝手が違うので、これから青を目指す人が同様の方法で青になれるかは保証しかねますが、参考程度にはなるかと思います(これは嘘で、記事が雑すぎるのでガチ勢は他の記事を読んだほうが良さそうです。手元にへぇボタンを用意してご覧ください)。

一回目に青になるまでにやったこと

部室にあったチーター本を読んだり、蟻本を読んだり、AtCoder埋めやJOI埋めをやっていました。青になるまでに使ったアルゴリズムやデータ構造などをざっくりとリストアップします。

  • DFS, BFS
  • DP
  • 二分探索
  • Dijkstra
  • 座標圧縮
  • Union-Find木
  • nCr mod p(pは素数)の求め方

チーター本蟻本を読み進めながら知識をつけていきました。当時、セグメント木やネットワークフローなどもふわっと知っていましたが、コンテスト中に使ったことはありませんでした。覚えておいて損はないと思います。

AtCoder埋めは主に400から500点の問題をやっていたと思います(ここの記憶が曖昧です)。400や500は今も埋まっていません(は?)JOIは非公式難易度が5と6の問題をメインにやっていました。同じ問題が出たときにちゃんと解法が浮かぶ程度に定着させると良いです。似た問題が出たときに、「あ、ここ神権ゼミ*1でやったところだ!」と言えるようになると非常に良いです。

二回目に青になるまでにやったこと

  • お受験を言い訳に競プロをサボる
  • 水色に落ちる
  • ついでに東大落ちる
  • 冷やし続ける(一番ひどいときでレートが1412まで下がりました)
  • 調子を取り戻して爆上げを繰り返す

2019年の1月から受験勉強に専念するためにコンテストに出なくなりました、というのは嘘で、受験を言い訳にして競プロをサボりました。実際に2月26日からの1ヶ月はずーーーっとスプラトゥーンをやっていました。コンテストを3ヶ月もやらないと当然競プロ力は落ちます。

ただ、2019年の5月下旬(大学入学後2ヶ月弱が経ったとき)からの冷えが自分でも理解できなくて、自明貪欲が書けない、300点問題の制約を無限に誤読するなどのミスを連発し、緑パフォとか水色下位パフォとかを出しまくってました*2。レーティングの変化が-48、-25、-50というふうになり、競プロに対するモチベーションが-infになっていました。

f:id:hagyu_aya:20190805004652p:plain

競プロが嫌になって完全に戦意が喪失した図*3です(ツイート順は下から上)。この日らへんのツイートは私でもドン引きするくらいすごいことが書いてあるのでどうか調べないでください(フリじゃないです)。

しかし、こんな私も壺を買うことで、運気が回復し、コンテストでもいい感じのパフォーマンスが出るようになりました。

item.rakuten.co.jp

こんな壺が効くわけ無いと決めつけているあなた、ちょっとまってください。これ本当に効くんです。この壺を買った友人は家中の蛇口から石油が湧き出るようになり、大富豪になりました。

というのは冗談で、解決してくれたのは時の流れでした。6月の下旬ころには無事謎の呪いから解放されて、レート変化もモチベも正になりました。やったぜ。調子が悪いときは休むに限る。

冷やし続けたときのメンタルコントロール(できない)

知ってたらTwitterとかで教えてください。コンテスト終了30分前とかに、またレート下がるとか思いながら名状しがたい気持ちになり、手元のシャープペンシルで手首を引っ掻いたりしてました。

最後に

こんなクソ記事を読ませてしまい、大変申し訳ございませんでした。お詫びにレート1年分をプレゼントします。

次回予告

「Re: Re: AtCoderで青になるまでにやったこと」というタイトルの記事を書きます。お楽しみに(は?

*1:変換ボタンを無限に押しても進研と出てこなかったので、仕方なく神権で代用。Linuxだから仕方なさそう

*2:令和初ABCでは黄パフォを出せる程度にまでなっていました(predictorで情報を得た)。unratedになったの今でも恨んでるからな

*3:某とはICPCのことです。

Twitter上で素数判定botを作ってみた

記事の概要

この記事では、作ったbotの機能と、botを作るために踏んだ手順をざっくりと紹介します。botを作る手順は自分向けの備忘録程度の雑さで書いてます(詳しく知りたい人は各自で調べてください)。

素数判定botについて

このbotは、リプライで送られてきた整数が素数かどうか判定し、結果を返信します。その他に、今日の日付に相当する整数(YYYYMMDD)が素数かどうかをツイートします。

動作環境

使用言語はPython 3.6.8です。サーバーはherokuのものを使用しています。

botを作るためにやったこと

1. Twitter Appの作成、各種キーの取得

botを作るためには、bot用のTwitter Appを制作する必要がありますTwitterの開発者向けサイトにアクセスしてぽちぽちするとできます。詳しくは「Twitter bot 自作」等で調べてください。

2. PythonTwitterを扱うための準備

PythonTwitterを扱うためのライブラリを手元の環境にインストールします。今回はTweepyというライブラリを使用します。コマンドライン

pip3 install tweepy

などと打つと手元の環境にTweepyがインストールされます。このbotでは、Tweepyの他にbottleAPSchedulerも使用するのでそれらもインストールします。

3. herokuの準備

今回はherokuというサービスを使用するので、herokuのアカウントを取得する必要があります。アカウントを作ったら、botを動かすための新しいアプリを作ります。やり方の詳細は割愛します。また、アプリのセッティングをするために必要なheroku CLIもインストールします。ここまでの作業が終わったら、コマンドライン

git clone (heroku Gitのurl)

と打ってレポジトリをクローンします。

4. 必要なファイル群の準備

以下のファイルを用意します。

  • runtime.txt
  • requirements.txt
  • Procfile
  • index.py
  • clock.py
  • tweet.py

runtime.txtで実際に動かすPythonのバージョンを指定します。以下のように入力します。

python-3.6.8

requirements.txtには、使用するライブラリの一覧を書きます。いちいち調べるのは面倒なので、コマンドラインに以下のように入力して作成します。

python3 freeze -l > requirements.txt

Procfileには実際に実行するコマンドを書きます。詳しい仕様についてはググってください。今回は以下のようにしました。

web: python index.py
clock: python clock.py

index.pyには、アクセスされた際に表示するダミーのページを表示するプログラムを書きます。clock.pyには定期的に実行するプログラムを書きます。tweet.pyには、実際にツイートするプログラムを書きます。これらのファイルはここ(GitHub)に上がっているので、詳しくはそちらを見てください。「これってどうやるの?」となったときは、Tweepyの公式ドキュメントでサーチをかけるとたいていやりたいことが出てきます。

5. サーバー上でプログラムを実行

1.で取得した各種キーは、サーバー上の環境変数として保存します。4つのキーについていちいち設定するのは面倒なので、.envなどと名付けたファイルにまとめて記述します。.envには以下のように入力します。

CONSUMER_KEY=(実際のconsumer key)
CONSUMER_SECRET=(実際のconsumer secret)
ACCESS_TOKEN=(実際のaccess token)
ACCESS_TOKEN_SECRET=(実際のaccess token secret)

.envが用意できたら、以下のように入力して環境変数を設定します。

heroku config:set (cat .env)

環境変数の設定が終わったら、プログラムをデプロイします。gitを用いてサーバーに上げることで、実際にサーバー上でプログラムを動かせます。以下のコマンドを1行ずつ入力してあげます。(※先程作成した.envがアップされないようにするため、.gitignoreに.envを書いてください。)

git add .
git commit -m "(ここにコミットのメッセージを入れる)"
git push

6. サーバーをアイドル状態にしないようにする

herokuの仕様上、一定期間サーバーにアクセスがないと、サーバーがアイドル状態になってしまい、botが作動しなくなってしまいます。ダミーのトップページに一定時間ごと(10分に1回とか)にアクセスすることで、アイドル状態になるのを防ぎます。Uptime Robotなどを使用することでこれを達成できます。詳細は(ry

bot制作の感想

(難易度はそこまで高くなかったとはいえ)作り上げたときの達成感はすごかったです。フォロワーの皆さんにbotで遊んでもらえたことが嬉しかったです。

今後の展望

herokuでは内部ファイルがたまに消えてしまうらしく、同じツイートにn回反応してしまうことがあるみたいなので、それをどうにかする手段を考えています。新機能の提案をしてもらえたら実装するかもです(Twitterで@hagyu_ayaにリプライしていただけると反応しやすいです)。

参考にしたサイト