2014年3月5日水曜日

しおりにとけい

生存報告。

気づいたら1ヶ月以上あいた。このbloggerが実質閉鎖になる日も近いな!

で、最近、あんまり書きたいなって話題がないけど、ひとつだけ、外向きな話題があって。

最近、しおりに時計ついたものないかなって探した。

すると

  • mark-by-time ブックマークにキッチンタイマーをつけたようなもの
  • 定規に電卓機能がついたもの(たぶん時計もついてるだろ、、、)
  • 時計のスタンプ 手帳なんかにぺったんして針を書いて、、、。
  • 美人時計+栞san とはいえ投票は2011年
  • 手帳にはさめるほど薄い電卓(時計もたぶん、、、)
このあたりがそれっぽいかな、という感じ。

同じような疑問を持つ人はいる のだが、どうにも決定的な答えが見つからない。

たぶんほしいのは、
  • 本・手帳にはさんでも本・手帳が傷まない程度の厚み・平たさ
  • 文庫本~単行本にはさんでおかしな存在感がないこと
  • 機能は時計だけでよい
それに対してありうる回答は
  • 腕時計/ケータイ/スマホ/PCの時計/etc...使えよ
    • 本からあまり目を動かしたくないんです、、、(言い訳)
    • 腕時計は嫌いなんです、、、
    • 他はちょっと常備性に欠ける
  • 時計はさんだら?
    • 厚いんです、、、
  • 懐中時計の鎖を栞代わりにしたら?
    • 悪くないです、、、鎖のところを栞に置き換えませう
    • まあでもちょっと邪魔かも
  • 日時計
    • ぼくはいんどあは
で、一番楽しそうな答えは
  • とても薄い時計を準備する(ボタン電池程度なら許容範囲だろう)
    • ものがないことがわかった
      • => 作る?
で、で、100均の時計分解したんよ。そしたら
  • LCD自体はボタン電池より薄い
  • というかボタン電池が厚い
    • 厚みをあわせるか、厚くないものを使うか?
  • 一番の問題は接続で、LCDパネルと回路の接続が難しそう
    • どうやったらうまく接続できるか?
  • 時計機能だけとはいえ、ほとんどの時計が専用のチップをシリコン封入していた
    • 汎用マイコンを使う?封入してあるチップを使う?
  • 普通の基盤はそもそも結構厚みがある
    • ボタン電池以下だけど気になりそう
うーん、伝わらりそうにないけど!ま、そういうことを考えたのです。以上、生存報告でした。

2014年1月26日日曜日

第03期終了、そして統計情報

第03期終了。

気がつけば最後の投稿からすでに1ヶ月以上たっていた。あわてて区切りをつけていくことにする。
巷に良くあるブログ更新がとまる理由「仕事が忙しい」を本当にやることになるとは。

もはやLispの使い方も忘れつつあるし、ProjectEulerの問題もずいぶん時間をかけないといけなくなっているだろう。

ぷよぷよ!クエストアーケードという新しい遊びも出現したし、、、(そして自分の中では終わりつつあるし、、、)また一度区切ることにしようと思った。

しかし、投資のときに比べて投稿回数が減っているなあとも思う。ブログの意義と更新の面白さが薄れたんだなあって。まあ、そういうことだ。


第04期の開始は予定なし。ブログは1ヶ月ルールで続けるが、、、どうしようね。

第03期統計情報

第03期開始:2013/10/05
第03期終了:2014/01/26
期間長さ:113日

一番読まれた記事:
ぷよくえAC連鎖の攻撃力考察

1ヶ月ルールも守れないので、とりあえず続けてみる、とだけ。書く動機が薄れていきますねはい。実際思い出すと、誰も聞いていないようで聞いているような不思議な距離感のブログという場所に書き出すことでストレスのような何かを解消していた感はある。

現実がある程度あわただしく、それである程度充実を感じられるものになったら、面倒で充実感が相対的に薄い事柄が後回しにされるのは道理ではある。

2013年12月24日火曜日

ぷよぷよ!クエストアーケード 連鎖によるダメージ推定の検証方法に関するノート

どういう検証をしたかだけさらしてみる。

なんどか書いている「目に見える要素はない」というのは「0.5倍刻みで表面上出てこないからわからない」というニュアンス

PT色問わず(出来るだけ4色) おともなし 1~8連鎖 パズル終了までの連鎖はできるだけ1回

  • ランダム要素があるかどうかの確認
    • 連鎖数が少ない(1~5の場合)目に見える要素はないと判明
  • 連鎖数、連鎖時の色、個数でパターンを確認
    • 当初は「連鎖数によるPT全体倍率」と「色ごと底上げ倍率」があると想定して実施
    • 結果「色ごとに分けて考えてよさそう」という結論
  • 後にフィーバー時に1回だけ連鎖ということも実施
    • フィーバー補正はなさそう
  • その他
    • ダメが攻撃力 * 0.5倍刻みという既出情報の裏づけ確認
    • 2回以上連鎖してしまったデータはしばらく置いておく

単色PT おともは:なし、他はすべてPT以外色 1~8連鎖 パズル終了まではの連鎖はできるだけ1回

  • おとも効果の検証
    • 色ごとに分けてよさそうなので「おともなし」のキャラはその色共通の倍率になるはず
  • 連鎖数と消した色との関係でおとも攻撃力がどうなるかを確認
    • おとも色、おとも攻撃力によらず、PTキャラ攻撃力の倍率にボーナスが乗っていた
    • 倍率に0,0.5,1.0倍のボーナスが乗っていることがほとんどだった
    • 色は「消しているかいないか」ぐらい
  • PT色が消えていなくてもおとも色が消えていれば救済される現象を確認
  • 後に、PT色を赤赤青青、おともを無青赤無のようにして相互の色確認もしてみた
    • アップルパイナ大活躍

パズル終了までに1回~3回連鎖 フィーバーも PTは問わず

  • 2回以上連鎖した場合のデータを解析
    • 連鎖数 & 消えた個数での倍率テーブルがほぼ正しいと想定する
    • 多くのデータがテーブルに「近い」が「外れている」のでこの検証の限界を痛感
  • 倍率の足し算になっているというおおまかな傾向はつかめた

内部計算式の想像

  • 色ごとに集計、倍率で計算して最後に攻撃力に掛け合わせてダメ値を決定
    • 内部で計算した倍率計算結果を0.5倍刻みに「切り上げ」ている
    • 1.0倍以下の場合は1倍へ切り上げ
  • 連鎖数と色ごとの「何個消したか」でPT色倍率内部値が決定
    • あるいは、何連鎖目に何個、何色消したかがかかわっているかも?
  • 複数回消した場合は単純に足し算
  • おとも色の影響は不鮮明だが、、、
    • PT色よりおとも色のほうが有利な場合、倍率差し替えをしている?
      • ああ、検証要素発見、しないぞ!俺はしない!
    • おとも色を消していたらたんに1.0倍ボーナス?
  • 内部式の推測
    • 丸め前倍率=PT色倍率(連鎖数&該当色ぷよ消した数)+おともボーナス
    • パズル全体の丸め前倍率=Σ(n回目の連鎖の丸め前倍率)
    • 最終攻撃倍率=0.5倍刻みの丸め適用(パズル全体の丸め前倍率)
うーん、思うに「丸める前の倍率」が内部にあるんじゃないかなということがいいたかった、他は正直「こういう考え方もある」程度でしかない。LOOKUPテーブルかもしれないし、実は連鎖ごとに足し算しているのかもしれない。色ごとに別々だと思っているのは思い込みで実は全体で計算をしているかもしれない。

まあ、そこまで細かい計算式はわからなくても問題ないだろうし。ないよね?

2013年12月23日月曜日

ぷよぷよ!クエストアーケード 連鎖によるダメージ計算の推定

ダメージの決定方式についていろいろと調べてみた。ただ、式の確定までにはいたらなかった。決定的と思える答えは出なかった。

とはいえ、大体の傾向はつかめたし、実用的にはもう十分だろうというところまでやったので、ここでひとまずおしまい。どう検証してどういう結論になったかだけちょっと晒しておく。

余談。ここに書いた内容は自分で確認・検証したものではあるが、そもそも自分が最初に気づいたものではないということだけ書いておく。この検証内容の責任は取るが、大体みんな気づいていた内容でもある。Wikiや匿名掲示板の情報が一次情報ということがほとんどである。

内部HACKしようという勇気の持ち主や、同じくゲームで得られる情報だけで解析しようという猛者がいたらぜひがんばってほしい。そのときは情報提供しますゆえ。

前提の確認

  • 1パズルとは:ぷよを動かせるようになってから終了で動かせなくなるまで
  • キャラごとダメ値とは:1パズル終了時に各キャラクタに表示される数字
    • 属性補正、大打撃補正は攻撃時に確定値が出る
    • ひっさつ技による補正はダメ値が修正される
    • おとも効果による補正はダメ値が出た時点で反映済み

まずわかったこと、すでに知られていたこと

  • ダメ値は、キャラの攻撃力 * 0.5 倍刻みの倍率、となる
    • 1.0倍が最低、以降1.5, 2.0, 2.5,,,数値の上限はなさげ
  • おとも効果による補正は、ダメ値が出た時点で反映済み
    • (例)攻撃力100のキャラに「こうげき+3」のおともをつけたときは
      ダメ値は103、154、206、、、となる
  • ひっさつ技効果によるダメ値補正は攻撃する直前のダメ値に足し算されているので無視
  • 属性による補正、大打撃の補正は攻撃時に実施される
    • ところで、この補正がキャラごとなのかPT全体なのかは確かめておりません

調査によってだいたい正しいとわかったこと

まず連鎖開始~終了までの計算に関して
  • 攻撃のための倍率は「色ごと」に計算されている
  • 何連鎖目に何色を消したかは「おそらく関係ない」
    • 何番目に何色を消すか、何個消すか意識する必要はない
    • とにかく連鎖数を伸ばすことを優先すべき
  • 4個消しで連鎖を最後まで続けた場合(落ちコン継続含む)
    各キャラクタのダメ値で最低保障される「基本倍率」が存在する
  • ただし、連鎖終了まで1度もキャラ色を消していない場合「救済倍率」が適用される
    • 1~3連鎖=救済なし、4連鎖以上=x1.0倍
    • なお、おともありだと結果が変わる(後述)
  • 連鎖が終わるまでに「各色のぷよを消した合計数」で、基本倍率にボーナスが乗る
  • フィーバーだからといって特別なボーナスはない
つぎに、パズル開始~終了までに複数回連鎖をした場合
  • パズル終了までに何回も消していたときは、消したぶんだけ倍率が加算される
    • ただ、3連鎖以下だと2回、3回と消していても2倍、3倍ではなく1倍、1.5倍
      程度で終わることが多くて意味がなさそう
    • 5連鎖以上だとのったのが実感できる
  • フィーバーだと特に実感できる、5連鎖だと普通2倍、6連鎖だと3倍
    5連鎖・5連鎖・6連鎖のフィーバーを終わらせると、8倍以上でる
最後に、おともの効果に関して
  • おともの攻撃力は関係ない、おとも数も関係ない
  • おともをつけていると、おとも数によらず0倍~2倍程度のボーナス倍率が乗る
    • ただしおともに対応する色が消せた場合に限る
  • おともをつれているとキャラ色をまったく消せていなくても
    おとも色を消せていた場合、基本倍率分が救済される
    • 両方消せていない場合は救済倍率適用(3連鎖以下だと0倍)だと思われる(未確認)

倍率表

基本倍率
連鎖数 1 2 3 4 5 6 7 8 9 10 11 12
基本倍率 1.0 1.0 1.0 2.0 2.0 3.0 4.5 5.5 6.5 8.0 10.0 ?(12.0ぐらい?)


連鎖完了までに消した個数による倍率変化(判明している分だけ)
連鎖数 1 2 3 4 5 6 7 8 9~(未調査) 補足
0個 0 0 0 1 1 1 1 1 (特定色が消えなかった場合の救済)
4個 1 1 1 2 2 3 4.5 5.5 6.5~ 基本倍率
5個 1 1.5 2 2.5 3.5 5
6個 2 2.5 3.5
7個 2 2.5 3.5
8個 2.5 3 4 5.5 6.5
9個 3 3 4 6
10個 3.5 4.5
11個 6 7
12個 4.5 5.5 6.5
13個
14個 5 6 7.5
15個 5.5 6.5
16個
17個
18個 8.5

この表は、実際のデータと照らし合わせると大体正しいものの一部にばらつきがあって不確定。ここに書いてあるデータは、比較的整合性が取れる部分だけを採用している、、、そもそも「連鎖終わりまでに消した個数で倍率が決まる」という考え方が間違っているのかも?

実用的な疑問に対する答え

  • Q:同時けしを狙うことに意味はある?
    • A:連鎖を伸ばすほうが良い結果になる(どうせ消したぷよ数はかわらない)
    • A:暴発して同時消しでとまっても、多少は救済されると考えるのがよい
  • Q:何回も連鎖するのと、連鎖を伸ばすのとどっちが有利?
    • A:伸ばすべき。少なくとも5連鎖ほしい。
    • A:そもそも3連鎖以下では何回消しても各色1倍。3回消して2~3倍。
    • A:4連鎖で2倍保障だし、同時消しが混じれば伸びる。
    • A:フィバ5・5・6と10連鎖がほぼ同じ、個数的にも時間的にも10連鎖のほうが簡単
  • Q:おともは連れて行くべき?
    • A:連れて行けるかぎり連れて行くべき。
    • A:できれば色はPT色とは別にすると、色事故リスクを減らせる

もうちょっと実用的な疑問に対する答え

  • Q:単色PTと複数色PTとどちらが有利?
    • A:選択の余地がないならトータル攻撃力優先で。複数色でいい。
    • A:単色。できるだけおともにPT色とは別色のおともをつれていこう。
      • 同色攻撃力UPのひっさつ技が多い、赤+100が赤+400に化ける
      • 特定色を多く消した場合のボーナスは、2連鎖伸びれば返せる
  • Q:ケーキPTと非ケーキGRPTでの有利不利は?
    • A:検証したことないんです、、、
    • A:推測だが、
       556->(2+2+3)=>x8 =>10連鎖ぐらい
       667->(3+3+4.5)=>x10.5=>11連鎖ぐらい
       779->(4.5+4.5+5.5)=>14.5=>わからないけど13連鎖ぐらい?
    • A:ケーキPTが現実的に有利だが、がんばれば連鎖数でカバー可能
  • Q:ケーキPTと非ケーキSRPTでの有利不利は?
    • A:育成終了済みと想定すると、攻撃力はケーキ117vsSR214
    • A:非ケーキSRPTが必要な倍率は
       556(x8.0)に対して 約4.4倍(7連鎖)
       667(x10.5)に対して 約5.8倍(8~9連鎖)
       779(x14.5)に対して 約8.0倍(10連鎖)
    • A:ケーキPTつよいなあ、、、

おわりに

検証してみてわかったのは、 連鎖を伸ばしてPTを強くすればいいという、わかりやすいゲームデザインになっているということ。 ケーキPT別格ということ。

検証する上で。0.5倍刻みになる点は、パターンの絞込みを容易にする一方で正確な内部仕様がわかりづらくなっている。こっそり内部パラメータが変わっていてもわからないだろうね。

(NOTE:このページの内容は無断で転載可)

2013年12月18日水曜日

ぷよぷよクエストあーけーど。

ぷよぷよクエストアーケードにはまってしまった。
LispとProjectEulerはお休みしています。

思ったよりもぷよぷよである。パズドラそっくりの移動で、でも連鎖システムがぷよぷよである。

録画してダメージ計算式を調査してみている。などと自己紹介してみる。思ったよりこの解析面白いです。

2013年11月24日日曜日

Lispにおける小数の精度に関して

Lispにおける小数の精度

ProjectEuler を回答中に、要求される小数の精度が12桁ある問題があって、、、具体的には問題267のことなのだが、LispCabinet の SBCL にて回答を入力、さて実行したら、桁数が足りない。どう見ても10桁ない。というわけで調べた。

数値としての表記は共通で
(仮数部)*10^(指数部) の値をあらわす
[+|-] 数字 小数点 数字 指数マーカ [+|-] 数字
仮数部 + 指数マーカ + 指数

Lispでの浮動小数型には4種類あるそうな。
  • short-float : 小精度 : 指数マーカ s, S 
  • single-float :単精度:指数マーカ f, F
  • double-float : 倍精度 : 指数マーカ d,D
  • long-float : 長精度 : 指数マーカ l,L
指定しない場合は:*read-default-float-format*シンボルに指定された型が選ばれる。また、指数マーカe,E もある。これもデフォルト型ということのようで。

REPL上の表記としては 1.3590813e9 のようになる。

実際の挙動に関して

LispCabinet : SBCL における動作
  • s,f はe とみなされる様子
  • d,l はl とみなされる様子
  • 表示される仮数の桁数は、e => 7桁、d => 17桁
    • d のとき18桁の場合もあった
    • 結果の仮数値で後ろ(?)に0しか続かない場合、0省略される
      ※後ろとは:小数の位数が大きな側のことを言いたい
  • コード上の定数にd, l を指定した数はその後の計算も小数として扱われる
基本的に整数のみで割り算・掛け算していると自動的に有理数として扱われるのがLispシステムである。どこかに小数を割り込ませるとその後の計算がすべて小数となる

参考:

Wikipedia:浮動小数点数
数と算術演算(M. Hiroi's Home Page)
CommonLispのお勉強 (S_Nayakama 氏)

注意書き

※仕様は確認していません。
※SBCL (on LispCabinet) 以外の挙動についても確認していません。
※確認するほどの元気もやる気も責任感もないのです
※適当です

一言

整数の計算は基本的に無限桁数なのに比べると、小数側のサポートはIEEEの仕様を超えることはない様子というのが不思議といえば不思議。
と思っているだけで、実際扱う方法もあるんだろうなーなどと夢想したり。
そもそも目的である問題267はアプローチが正しくなかったようで正答が出ていないので精度は問題ではなくなってしまった。

2013年11月16日土曜日

mapcar と計算で突破する Project Euler

Lisp の勉強にと思ってはじめた ProjectEulerが面白すぎる

有名な「プログラミング問題サイト」は、多くがLispに対応していない。
  • ×:PKU Judge System -> C, C++, Java だっけ
  • ×:AOJ Judge System -> C, C++, Java,, だっけ???
  • ×:Top Coder -> Java, C++, C# は知っている
  • ○:shinichiro_h さんのゴルフ場 -> 言語のたまり場状態
  • ×:Code Golf 本家 -> たしかダメ, Perl, Python, Ruby だっけ?
有名、は有名だろう、考えてみたら自分があんまりサイトを知らないだけのような気がしてきたがまあいいや

ProjectEuler の特殊で面白い点は
  • 目的は「結果」であって「過程」は各回答者の自由
    • 公式にも「WEB探して答えを見つけちゃうこともあるだろうけど、
      でも、あなたはそれでいいの?」と書いてある。
      スタンスがわかる文書である。
  • 問題がよく作りこまれている
    • 主観ではあるが。
  • 回答は「答えの数字」であって「プログラム」でも「実行結果」でもない
  • 正答者のみが閲覧可能な回答スレッドでは、コードの公開がされているが
    簡単な問題でも思いもよらない方法があったり、もっときれいなコードにあったりと
    勉強になる
    • 答えだけならいくつかぐぐれば見つかることは確認済みだけれども。
一口に言って、プログラミング自体を勉強したいなら、圧倒的にTopCoderが選択肢ではある。本番環境だし、言語も今はやっているものだし。競争相手も多いし、問題も良く練られていると聞いているし、なにより「Challange」システムがコードの向上につながるだろうし。
けれど「解けるとわかっているものをあの手この手で解く行為」を楽しめるという点にはまった。自分にはわからないけど、確かに解ける方法がある、でもわからない!わくわく感がある。

問題はすべて英語なので、その点ハードルは高いかもしれないが、、、有志の日本語訳ページもあるので、どうしてもという場合はどうぞ。あと、エキサイト翻訳やGoogle翻訳でも多くの問題は大丈夫と思うぞ。一番問題なのは、翻訳ではなくて問題自体の難しさだし。

ああ、面白い。

最後に、雑感。
  • 多く使われている(使っていると主張されている)言語が統計で見られる
    • Mathematicaは知っていたが、PARI/GP , Sage, APL/J/K、、現代はすごいな!
    • Spread Sheet  vs Pencil/Peper :回答力では SpreadSheetが勝る様子
    • Lisp !!!
  • 今のところ「使った」アイデアは
    • バックトラック
    • どうしても解けなくて遺伝的アルゴリズム => でも解けない orz
  • 言語の導入にも面白そうだ
    • 簡単な問題であれば「答えさえわかればよい」ので。
      簡単な計算がプログラミングできますか?ということ。
      これがやってみると難しいものです。
    • ただし、多倍長整数への親和性はなるたけほしいかも。
      • その点Lispは「組み込みで対応」なのが壁の低さにつながった
      • C/C++だとライブラリないし自作必須だからなあ、、、。