mizdra's blog

ぽよぐらみんぐ

反動ダメージについて

事の発端

噂の 自販機乱数の人の記事 を読んでいて、すてみタックルの反動ダメージが第六世代では「与ダメx0.33 (四捨五入)」であるのに対し、第五世代以前では「与ダメx(0x548/0x1000) (四捨五入)」と、不自然な計算式であることに疑問を感じていた。

blastoise-x.hatenablog.com

当記事の中で、第五世代以前の計算式はincorrectと述べられているように本人もあまり正確に調査していなかったようなので、自分で調べてみることにした。

調査内容

与えたダメージの1/3が自分に反動ダメージとして帰ってくると言われているすてみタックル等の技の反動ダメージの正確な計算式を調べる。

検証に使用した技

検証した世代

  • 第三世代
  • 第四世代
  • 第五世代*1
  • 第六世代*2

第一世代・第二世代は需要がなさそうということから、また調査環境が整ってないということから調べなかった。きっとやる気に満ち溢れた人が代わりに調査してくれるでしょう!!

調査結果

結論を先に書くと以下のような計算式になった。

{ \displaystyle
damage := 与えたダメージ
}
{ \displaystyle
recoil     := 反動ダメージ
}
{ \displaystyle
round     := 四捨五入関数
}
{ \displaystyle
floor     := 切り捨て関数
}

第五世代以降

{ \displaystyle
recoil = round(damage \times (33 \div 100))
}

第四世代以前

{ \displaystyle
recoil = floor(damage \times (1 \div 3))
}

例外(第三世代~第六世代共通)

反動ダメージは1より小さくならない。(最低1は反動ダメージを受ける)

詳細

1/3反動ダメージの算出方法については諸説あるが、ここでは代表的な

  • {damage \times (0\rm{x}548 \div 0\rm{x}1000)}
  •  {damage \times (1 \div 3)}
  •  {damage \times (33 \div 100)}
  •  {damage \times (333 \div 1000)}

の4つについて調べた。

第五世代以降

  • {damage = 23, recoil = 8} のとき
{\times (0\rm{x}548 \div 0\rm{x}1000)}  {\times (1 \div 3)}  {\times (33 \div 100)}  {\times (333 \div 1000)}
raw 7.591796875 7.66666666666667 7.59 7.659
四捨五入 8 8 8 8
五捨六入 7 8 7 8
切り捨て 7 7 7 7
切り上げ 8 8 8 8


- {damage = 53, recoil = 17} のとき

{\times (0\rm{x}548 \div 0\rm{x}1000)}  {\times (1 \div 3)}  {\times (33 \div 100)}  {\times (333 \div 1000)}
raw 17.494140625 17.6666666666667 17.49 17.649
四捨五入 17 18 17 18
五捨六入 17 18 17 18
切り捨て 17 17 17 17
切り上げ 18 18 18 18


- {damage = 153, recoil = 50} のとき

{\times (0\rm{x}548 \div 0\rm{x}1000)}  {\times (1 \div 3)}  {\times (33 \div 100)}  {\times (333 \div 1000)}
raw 50.501953125 51 50.49 50.949
四捨五入 51 51 50 51
五捨六入 50 51 50 51
切り捨て 50 51 50 50
切り上げ 51 51 51 51


{recoil = round(damage \times (33 \div 100))} のみ一致。

第四世代以前

  • {damage = 20, recoil = 6} のとき
{\times (0\rm{x}548 \div 0\rm{x}1000)}  {\times (1 \div 3)}  {\times (33 \div 100)}  {\times (333 \div 1000)}
raw 6.6015625 6.66666666666667 6.6 6.66
四捨五入 7 7 7 7
五捨六入 7 7 7 7
切り捨て 6 6 6 6
切り上げ 7 7 7 7


- {damage = 24, recoil = 8} のとき

{\times (0\rm{x}548 \div 0\rm{x}1000)}  {\times (1 \div 3)}  {\times (33 \div 100)}  {\times (333 \div 1000)}
raw 7.921875 8 7.92 7.992
四捨五入 8 8 8 8
五捨六入 8 8 8 8
切り捨て 7 8 7 7
切り上げ 8 8 8 8


{recoil = floor(damage \times (1 \div 3))} のみ一致。

例外(第三世代~第六世代共通)

  • {damage = 1, recoil = 1} のとき
{\times (0\rm{x}548 \div 0\rm{x}1000)}  {\times (1 \div 3)}  {\times (33 \div 100)}  {\times (333 \div 1000)}
raw 0.330078125 0.333333333333333 0.33 0.333
四捨五入 0 0 0 0
五捨六入 0 0 0 0
切り捨て 0 0 0 0
切り上げ 1 1 1 1


どの世代の計算式にも一致しなかった。

調査データ

調査に使ったデータを公開しておく。
調査結果が正しいかどうか確かめたい時にどうぞ。

参考

*1:第五世代は自販機乱数の人によって既に調査済であったが確認の意味も含めて再調査した

*2:調査済だが第五世代と同じ理由で再調査

ポケモンを一行で表現する構文「PokeSugar」を作った

趣味プロジェクトでポケモンを一行で表現する構文が必要になったので作った。
名前の由来はPokemonSyntactic sugarから。

更新履歴

v0.1.0

  • 構文をABNFで書いた。
  • オプション値で配列を使う際に各要素を区切る記号をスラッシュからパイプに変更した。

はじめに

GitHubで公開している仕様を読んで下さい。

github.com

構文を導入するメリット

様々な場所でポケモンに関する議論が展開されていく中で、ポケモン自体の表し方が多様化しており、場所によってポケモンの表現がまちまちになっている。PokeSugarではそれを定義化することで統一を図り、人や機械にとって扱いやすい「ポケモンを表現する構文」の提供を目指す。ポケモンを文字だけで表せるので、一行だけでリソースとしても利用出来る。

構文の例

ラティオス!臆病?浮遊@拘り眼鏡(流星群|サイコショック|波乗り|めざパ炎){C252|S252}[H31|A30|B31|C30|D31|S30]
ラティオス!臆病?浮遊@拘り眼鏡(流星群|サイコショック|波乗り|めざパ炎){C252S252}[3VacsU]
ラティオス!臆病@拘り眼鏡(流星群|サイコショック|波乗り|めざパ炎){CSぶっぱ}[めざパ炎理想]

ランドロス-霊獣 !意地っ張り ?威嚇 @スカーフ (地震|蜻蛉返り|はたき落とす|馬鹿力) {ASぶっぱ}
ヒードラン !冷静 @拘り眼鏡 (噴火|オバヒ|ラスターカノン|大地の力) {HCぶっぱ} <レベル:100|性別:♂>

何故この構文にしたのか

構文仕様についてはGitHubに載っているので、ここではこの仕様にした経緯について書く。

識別子による工夫

まずポケモンを表現する上で欠かせないのが種族, 性格, 特性, 持ち物, , 努力値, 個体値の7つの要素だろう。 これらの要素は!, ?などの記号と組み合わせることにより、機械が識別しやすいようにした。また、持ち物の識別子に@を利用して普段見慣れている構文に近づけたり、覚えやすいようにした。

括弧による工夫

, 努力値, 個体値は比較的文字数が多くなるので、括弧で括って可読性を高めた。
もし括弧で括らなかった場合、以下のように見辛くなる。

ラティオス!臆病?浮遊@拘り眼鏡$流星群|サイコショック|波乗り|めざパ炎#C252S252*3VacsU

オプションによる工夫

レベル性別など普段は使われない要素をオプションとして保持することで可読性を高めた。使わない要素に識別子を与えても利用者が覚える際に負担がかかるだけだ。

<レベル:100|性別:♂>
<リボン:'ゴージャスリボン|ロイヤルリボン|ゴージャスロイヤルリボン'|色:通常色>

自由度による工夫

人によってひらがな, カタカナ, 漢字, 英語, 略語など様々な文字で要素を記述するので、PokeSugarでもそれに対応した。

"対応した"というよりは寧ろ"決めていない"とするほうが正しい。仕様では要素に使用する文字に殆ど制約を設けていない。どの形式に対応するかは構文を利用するプログラムやソフトウェアが決める。これにより柔軟に情報を表現できる。

バンギラス
りゅうせいぐん
流星群
龍星群
竜星群
10万ボルト
十万ボルト
Aのすがた
\!のすがた
\?のすがた
CSぶっぱ
CSぶっぱ余りH
5VaU
3VacsU

種族ブロックは必ず先頭でなければならないが、他のブロックの順序に指定はない。仕様では可読性を重視してフォルム, 性格, 特性, 持ち物, , 努力値, 個体値, オプションの順で書いてある。また、種族ブロックを除いた他のブロックは省略可能なので以下のようにも書ける。

ラティオス!臆病?浮遊@拘り眼鏡(流星群|サイコショック|波乗り|めざパ炎){C252S252}[3VacsU]
ラティオス@拘り眼鏡?浮遊!臆病{C252S252}[3VacsU](流星群|サイコショック|波乗り|めざパ炎)
ラティオス[3VacsU]
ラティオス

種族ブロックを除く他のブロックの前であれば空白を挿入することが出来る。

ヒードラン !冷静 @拘り眼鏡 (噴火|オバヒ|ラスターカノン|大地の力) {HCぶっぱ} <レベル:100|性別:♂>

最後に

自分の趣味プロジェクトに使う構文ゆえに全く期待していないが、この構文が誰かの役に立つと嬉しい。
オプションは誰でも自由に拡張できるのでライセンスの下であれば、カスタマイズをするものアリだろう。

おわり。

2015年の振り返り

2015年の振り返りをする。本当は年が明ける前に投稿したかった

"今年"は2015年、"来年"は2016年のことを指す。

プログラミングを振り返る

  • 1月: メタ言語学習
  • 2~4月: JavaFXでツール製作
  • 5月: 非IDEエディタへの移行作業
  • 6~8月: Node.jsでフロントエンド開発
  • 9~11月: ES6学習
  • 12月: TypeScript学習

1月: メタ言語学習

Sass, Jade, TypeScriptなどのメタ言語について調べた。この学習では既存のWeb言語の問題点やそれを解決する手段、メタ言語を利用するメリットを知ることが出来た。調べたついでに記事も書いた。

http://qiita.com/mizdra/items/ae766eb9bc9e562344a6

2~4月: JavaFXでツール製作

HTML以外での初のGUIアプリ作成だった。 最初に僕がJavaFXを使おうと思ったのは、FXMLと組み合わせることでHTML感覚でGUIアプリを作ることが出来ると思ったから。実際にはJavaFXを触る上で、クラスとメソッドを使ってコンポーネント操作をする際に、今までとは異なる知識が要求された。その知識を身につけるまでにかなりの時間を掛けてしまった。約三ヶ月。長かった。

ちなみにこの時期からQiitaやITニュースで技術系の記事を平日は毎日読むようになった。

5月: 非IDEエディタへの移行作業

以前までは開発環境としてIDE(NetBeans)を利用していたのだが、以下の理由から軽量な開発エディタに乗り換えたいと思うようになった。

  • 重い(起動が遅い, メモリの大量消費)
  • 使わない機能が多すぎてIDEを十分に活用出来ていない
  • 高機能ゆえにメニューが複雑
  • IDEに依存したプロジェクトになってしまう(例: NetBeansプロジェクトはnbprojectフォルダに依存している)*1

取り敢えずIDEではないエディタで当時話題になっていたものを調べた所、Atom, Brackets, Sublime Textあたりが候補に挙がった。 最終的には全て実際に使ってみて、快適そうだったBarcketsに乗り換えた。(Atomは重すぎ, Sublimeは初期設定が面倒だった)

当時はよく考えていなかったが、Node.js開発をするにあたりCLIを積極的に使うので、CLIと連携しやすい非IDEエディタを選んだのは正解だったと思う。

6~8月: Node.jsでフロントエンド開発

一年前に軽く触ってから放置していたNode.js開発を再開した。ただし一年前とは違い、サーバーサイドではなくフロントエンドの開発にNode.jsを利用した。はじめにgulp, webpackなどのビルドツールについて調べ、それからbabelの開発環境を作った。この辺りの情報は日本語のものが少なく、またすぐに古くなってしまうため、積極的に公式ドキュメントから情報収集した。僕は英語が苦手だったので読むのに苦労した。英語もっと勉強しなければ。

9~11月: ES6学習

夏に作成したbabel開発環境を使ってES6の学習を進めた。特に大規模開発に利用されるES6 Modulesを中心に勉強した。ES6学習をする中で、テストを導入してみたり、npmモジュールを作って公開してみたりと色々なことをやった。自分の作ったツールが公開されるということは、誰かに利用される可能性があるということで、他人に見られても恥ずかしくないコードを書くように心掛けた。

正直、この時点でオブジェクト指向プログラミングやソフトウェア設計について学んでおけば良かったと思う。来年はちゃんと勉強しよう。

12月: TypeScript学習

ここまでNode.js -> ES6と学習してきて、やっとTypeScriptの学習を始められた。本当はもっと早い段階でTypeScriptをやろうと思っていたのだが、CLIの操作に慣れていなかったので、先にES6学習をするという形を取った。(別にそのままTypeScriptやっても躓く要素なかったと思う)

この学習ではES6で書いたnpmモジュールをTypeScriptで書き換える作業をして、型付き言語に慣れることからはじめた。また、よりTypeScriptの機能を活かせるようにVSCodeにエディタを乗り換えて開発をした。下旬は年末で忙しかったため*2、あまり作業は出来なかった。残念。

以下は実際に作成したnpmモジュール。

GitHubを振り返る

f:id:mizdra:20160103192801p:plain

TypeScript学習を期に積極的にコミットするよう心掛けたが、全体的には殆どコミットしなかった。
開発欲はあるのに作りたいものが無い、という状態が半年くらい続いているので来年はそれを何とかしたい。

学業を振り返る

今年は大学入試を控えた受験生だった。夏休みまでは学校で勉強していたのだが、とある事情により*3、それ以降は自宅学習に切り替えた。今考えると家よりも学校のほうが勉強してたし、この選択は間違ってたと思う。今年一番後悔してる。

そんな後悔と受験への不安を抱えていたが、受かったらラッキーと思って出願した推薦入試に見事合格してしまった。
正直落ちたと思っていた。本当に良かった。

何はともあれ、自分の受験に関わった方々に感謝したい。
ありがとう先生。ありがとう家族。ありがとう大学。

今年読んだAdvent Calendar

興味をもった記事だけ読んだ。

全く読まなかったもの

一年を通して振り返る

記事とかドキュメントとか沢山読んだお陰で色々なことを学ぶことができた。また、受験を通して将来について考える時間を取れたのは非常に良かったと思う。今まで自分が何となく考えてた進路がより明確になったことで気分がスッキリした。

来年は引き続きjs、加えてGoやC++も勉強したい。入学予定の大学に詳しい人に話を聞いたところ、大学ではオブジェクト指向プログラミングやソフトウェア設計について殆どやらないそうなので、自分で勉強しようと思う。それと英語ちゃんとやろう。

おわり。

*1:単に自分のプロジェクト管理が下手なせいかもしれない。

*2:イカ楽しい。まだBの雑魚だけど。

*3:教室で騒いでる人たちがいて集中できなかった。辛い。

TypeScript学習のメモ

忘れないように学習用に使った記事を貼り付けておく。
Node.jsとかES6, ES7関連も一緒にまとめておいた。
完全に自分用。

TypeScript

公式サイト

ソース

仕様

wiki

チートシート

tsconfig.json

.d.ts

gulp

npmパッケージ

その他

VS Code *2

公式サイト

ソース

ドキュメント

Git *4

その他

Node.js

モジュール関連

パッケージとモジュールの違い

package.json

npmコマンド

その他

ES6, ES7

参考にしたリポジトリ *6

Advent Calendar 2015*7

*1:TypeScript 1.5.3が対象

*2:beta以前の記事も混ざってるので注意

*3:TypeScriptの参考プロダクトとして有用

*4:個人的に非常に使いやすい機能だった

*5:ES6仕様に基づいた解説書

*6:型定義の仕方, gulpの書き方, モジュールの書き方などを参考にした

*7:TypeScript全く関係ない記事もあるが一応貼っておいた

TypeScriptの環境構築

TypeScriptとは

簡単にいえば、現在使われているJavaScriptJavaScript次期仕様に含まれる最新の機能、そして型システムを加えたものがTypeScriptです。

www.buildinsider.net

この記事ではTypeScriptを実行する環境の作り方を紹介します。

nvmのインストール

TypeScriptのインストールにはNode.js環境が必須です。
Node.jsは今後様々な場面で使うので、バージョンマネージャーを入れてバージョンを管理しておきましょう。

補足: ここではWindows向けにnodist, Mac向けにnvmを紹介していますが、類似のバージョンマネージャーは他にも沢山あるので自分に合ったものがあればそちらを使いましょう。

Windowsでのインストール方法

Windowsのバージョンマネージャーにはnodistを使います。

nodistのインストールは以下のサイトを参考にやって下さい。

github.com

$ nodist 4.1.2    // Node.js v4.1.2をインストール
$ node -v         // v4.1.2

Macでのインストール方法

Macのバージョンマネージャーにはnvmを使います。

nvmのインストールは以下のサイトを参考にやって下さい。

qiita.com

$ nvm install 4.1.2        // Node.js v4.1.2をインストール
$ nvm use 4.1.2            // nodeコマンドでv4.1.2を使うように設定
$ nvm alias default 4.1.2  // ターミナル再起動時にも設定を維持
$ node -v                  // v4.1.2

typescriptのインストール

typescriptはnpm(JavaScriptのパッケージマネージャー)のリポジトリで公開されていますので、npmコマンドを使って導入します。

npmについては以下のサイトを参考に。

npmはNode.jsインストール時にデフォルトで入れられているのでそのままコマンドを叩くだけでOKです。

$ npm install -g typescript // TypeScriptをグローバルインストール
$ tsc -v                    // Version 1.0.3.0

これでtscコマンドが使えるようになりました。
お疲れ様でした。

はてなブログで記法を変更する

どうも、mizdraです。 今回ははてなブログの記事を書く時に使われる記法の設定方法を解説します。

はてなブログでは、記事の記法として、

の3つを選択することが出来ます。

見たままモードは直感的に書けるのですが、はてな記法モード・Markdownモードは複雑な文章を簡単に記述できるので、こちらのほうがお勧めです。
その中でも、今回は Markdownモード の設定をしてみようと思います。

Markdown記法に変更する

記法を変更するには、はてなブログのダッシュボードから操作をする必要があります。 設定方法

  1. [ダッシュボード]
  2. 右メニューの[設定]をクリック
  3. [基本設定]
  4. [編集モード]
  5. [Markdownモード]を選択
  6. ページ最下部の[変更する]をクリック

f:id:mizdra:20141122182821p:plain

これで変更完了ですが、注意して欲しいことがあります。
それは、この設定した記法が反映されるのは新しく記事を書いた時のみということです。
つまり、過去の記事の記法を変更するにはその記事を削除し、新しく作成した記事に同じ内容を移すといった作業が必要になります。
過去の記事を従来の記法で編集するのは構わないという方には関係のない話なので、スルーしていただいて結構です。

お疲れ様でした。

Firefoxでアドレスバーからの検索ツールをGoogleにする。

こんばんは、みずドラです。 今回はFirefoxのアドレスバーについて少し触れようと思います。 FFURLber.png ↑赤枠で囲った部分がFirefoxのアドレスバー Firefoxのアドレスバーの初期検索エンジンは「Yahoo!」です。 Googleを普段使う私にとっては、使いづらいです。 という訳で、FirefoxのアドレスバーでGoogleが使えるよう、設定してみましょう! 使用したFirefoxのバージョンは「20.0.1」です。 ・設定方法 1. アドレスバーに「about:config」を入力し、Enterキーを押す。 2. ページが開いたら、「細心の注意を払って使用する」ボタンをクリック。 3. 「検索(R)」の欄に、「browser.search.defaultenginename」と入力。 4. 検索結果をダブルクリックし、出てきた欄に「Google」と入力。(既に設定されている場合は飛ばす) 5. 「検索(R)」の欄に、「keyword.URL」と入力。 6. 検索結果をダブルクリックし、出てきた欄に「http://www.google.com/search?lr=&ie=UTF-8&oe=UTF-8&hl=ja&q=」と入力。 7. 念のため、Firefoxのタブを全て閉じ、Firefoxを再起動する。 8. アドレスバーに適当なワードを入力し、Google検索が出来たら終了。 Google Chromeを使っているせいか、Google検索が一番使いやすく感じます。 Google好きの人は是非、試してみては如何でしょうか? ・参考にさせて頂いたサイト Firefox デフォルトの検索エンジを変更するには | シュシュ (勝手ながらリンクを張らせて頂きます)

ポケットモンスター・ポケモン・Pokémon・は任天堂・クリーチャーズ・ゲームフリークの登録商標です.

当ブログは @mizdra 個人により運営されており, 株式会社ポケモン及びその関連会社とは一切関係ありません.