コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2014年5月1日 >>> 2014年4月18日
link もっと後

2014年5月1日

イテレータ

Javaを始めたときにコケたので思い出深いのですが、C++ とJavaってイテレータの概念が全然違いますね。

C++ のイテレータはコレクションの要素そのものを指しています。N個要素を持つ配列aのイテレータitであれば、a.begin() はa[0] を指し、itはa[0] からa[N - 1] の間まで有効な要素を指し続けます。a.end() は存在しないa[N] を指します。

C++ のイテレータ

begin()                                        end()
|                                              |
a[0]   a[1]   a[2]   ... a[N - 2]   a[N - 1]   a[N]
|      コレクションの有効範囲       |

C++ 方式の利点は、イテレータが何を指すのか直感的に理解しやすく、イテレータ経由での要素の書き換えや削除のイメージが沸きやすいことです。

欠点はbegin() は参照して良いのに、end() は参照してはいけない、という非対称な仕様になってしまうことです。例えば、逆転イテレータ(reverse_iterator)を実装するとbegin() をend(), ++ を -- として扱うだけでは作れずに、悲しい思いをします。

Javaのイテレータは要素と要素の「間」を指しています。Javaにbegin(), end() はありませんが、対比のため無理やり書くと下記のようなイメージです。

Javaのイテレータ

 begin() = iterator()                           end() = hasNext() がfalse
 |                                              |
   a[0]   a[1]   a[2]   ... a[N - 2]   a[N - 1]
   |      コレクションの有効範囲       |

Java方式の利点はbeginとendが対称的になることです。もうbeginとendで悲しい思いをすることはありません。

欠点は書き換えや削除の対象がわかりづらいことです。特に双方向イテレータ(ListIterator)が顕著なので、もう少し詳しくご紹介しましょうか。

Javaコレクションの仕様ではイテレータが「最後に返した要素」が書き換え(set)や削除(remove)の対象、となります。ListIteratorは進む/戻るのどちらもできますから、イテレータの現在位置の「直前」あるいは「直後」どちらかの要素が対象となります。下記に図示します。

JavaのListIteratorのset()/remove() の対象

最後の操作がnext() だった場合
------------------------------
       set()/remove() の対象
       |    現在位置
       |    |
a[0]   a[1]   a[2]   ...


最後の操作がprevious() だった場合
----------------------------------
            現在位置
            | set()/remove() の対象
            | |
a[0]   a[1]   a[2]   ...

現在位置が全く同じでもset()/remove() の対象が変わる、この動きは正直ややこしいです。

利点の両立は難しいでしょうから、あとは皆さんの好みでしょうか。私は対称性を取ってJava方式に一票かなあ…。

編集者:すずき(2014/05/01 12:03)

コメント一覧

  • IKeJIさん(2014/05/02 13:04)
    常に内部イテレータを使うべき(極論)
  • すずきさん(2014/05/06 00:51)
    >IKeJIさん
    内部イテレータって foreach ですか?
    コレクションの要素が多すぎて単純な全列挙→フィルタで処理できないときや、イテレータを飛ばしたり戻したりするのが難しそうです。
  • IKeJIさん(2014/05/11 04:11)
    foreachに限らず、eachとかmapとかfoldとかそういうのも含めて考えてました。

    > コレクションの要素が多すぎて単純な全列挙→フィルタで処理できないときや、イテレータを飛ばしたり戻したりするのが難しそうです。

    どういう処理でしょう?何か例がありますか?

    俺みたいな低能力プログラマには外部イテレータは難しすぎる気がします。
    もし、for文を書かないといけない時は、椅子に座りなおして、コーラを取ってきてから、気合を入れてかきます。
  • すずきさん(2014/05/11 17:53)
    >IKeJI さん

    >どういう処理でしょう?何か例がありますか?

    特殊すぎる処理で申し訳ないですが、現に困ってるのは、
    「最初の 4バイトがタイプで、最初の 4バイトがサイズ、そのあとサイズ分だけのデータが続く」
    というバイナリを見るとき、もし A, B, C と並んでいれば頭から順に解析できますが、A, C, B と並んでいる場合は頭から順に解析することができない、という構造です。

    さらに C は数 GB あったりして、とにかく全部メモリに置くという作戦もとれません。

    今は外部イテレータにして、わからない部分は飛ばして、位置だけ「仮 C」として覚えておき、後で読む、としていますが、それを foreach や map や fold でどうやって書くのか思いつきませんでした。

    特に Scala の場合、map や fold を List に対してぶちかますと、List の全要素に対して述語の評価を行うので、List の要素が数 GB 以上になると map や fold が現実的な時間で帰ってきません。


    >俺みたいな低能力プログラマには外部イテレータは難しすぎる気がします。
    >もし、for文を書かないといけない時は、椅子に座りなおして、コーラを取ってきてから、気合を入れてかきます。

    たしかに for + 外部イテレータは面倒くさいです。
    外部イテレータ以外の方法があれば使ってみたいんですけど…。
open/close この記事にコメントする



2014年4月28日

神の一手

コンピュータ将棋の電王戦が非常に話題になっていました。盛り上がりについて行けていませんが、結果だけ聞くとプロと勝負できるまでになったとか、こりゃすごい。

チェッカーは神の一手(全手読み切った上での、最善の一手)がわかるそうですが、チェス、将棋、囲碁は探索範囲が広すぎるのでほぼ不可能でしょう…。神の一手は興味深いですが、わからないからと言ってコンピュータ将棋が弱くなるわけでもなく、今後、コンピュータ将棋はもっと盛り上がることでしょう。

将棋の探索範囲の広さは1局面にざっと80通り(※)指せて、終局まで110〜120手くらい指すので、探索空間は80^120程度です。10のべき乗がお好きなら、
10^x = 80^120の自然対数取って、
x * ln10 = 120 * ln80
x = 120 * ln80 / ln10 = 228.5
となって10の228乗くらい、と見積もれます。調べてみると一般的には10^220と言われているようです。ややズレたのは、なんでだろ…。

(※)歩が9枚(1通り * 9)飛(16通り)角(最も動けて16、動けなくて8なので、間を取って12通り)王(8通り)金(6通り * 2)銀(5通り * 2)桂(2通り * 2)香(最も動けて9、動けなくて0なので、間取って4.5通り * 2)として、1局面80通り、駒を取られても再び置けるため、指せる手の平均値はほぼ変わらない、とした。

囲碁はどうか?

コンピュータ囲碁はどうだろう?と調べてみると、2006年にモンテカルロ法(1手ずつデタラメに置いて、勝ちの確率が高い手を探す)を採用した強いソフトが出て、今やアマ有段者並の強さとのこと。こちらもすごいですね…。

モンテカルロ法はリバーシや囲碁などの性質を非常に上手く使っています。リバーシや囲碁は1手指せば1つ空きマスが減るため、メチャクチャに打っても必ず終局にたどり着ける、という性質があります。これを上手く利用して、メチャクチャに打った手の中で勝率が高い手はどれか?を探すそうです。

囲碁では有効なモンテカルロ法ですが、将棋への適応は難しいようです。なぜなら将棋はデタラメに指しても終局に近づかない(ループして盤面が戻ってしまう)ためです。

並べられることの多い、将棋と囲碁ですが、探索方法一つとっても違いがハッキリ出ていて面白いですなー。

編集者:すずき(2014/04/29 16:47)

コメント一覧

  • よしだあさん(2014/04/29 22:24)
    囲碁はモンテカルロ法なんて使ってるんやね。
    将棋にしても囲碁にしても、ぜんぜん分野違いの理論が取り入れられて強くなってるってのは、とてもおもしろいなー。
  • すずきさん(2014/05/01 07:13)
    >よしだあ さん
    専門外のことでも深く理解しておくと良いことありそうだね。
    ただ知っているだけじゃ応用効かないから、どれくらいやるべきかは難しそうだけど…。
open/close この記事にコメントする



2014年4月27日

何も解決しない結論

なぜなぜ分析は、危険だ - タイム・コンサルタントの日誌からを読んで。

会社のなぜなぜ分析も、この記事の「悪い方の例」とそっくりです。

大の大人が何時間も掛けて分析した結論が「以降、ミスしないように気をつけます」ですからね。

まさか小学生じゃあるまいし、そんなのありえないよ!って思うかも知れませんが、悲しいことに現実なんですわ…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 20:01)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年4月21日

好き嫌い?優劣?

プログラミング言語の優秀さと道具としての評価は別 - kなんとかの日記を読んで。

本文に異論は無いんですが、タイトルの「プログラミング言語の優秀さ」って何だろう?と思った。

言語屋さんから見て、明確に優劣が決まる基準があるのかなあ?変な言語に手を出す前に、その基準で見てみたい…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 20:07)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年4月19日

The Tower DSクラシック

久しぶりにThe Towerをやりたくなったのですが、PC版は動かせる環境がもうなくて(※)起動すらできなかったので、DSi WareのThe Tower DSクラシック(1000ポイント)を買いました。

(※)WinGというDirect Drawの前身に当たるグラフィクスライブラリが必要ですが、対応環境がWindows 3.1〜95(98も使えたっけ?)ときたもんだ。そんな環境もう持って無いんよ…。

The Towerを一言で言うとビルのシミュレーションで、特にビル内での人の移動(=エレベータ&エスカレータ&階段)に特化したシミュレーションです。

基本的なThe Towerの進め方は下記の通りです。要はテナントを作って、テナントの評価を良い状態に保ち、テナントからお金を得て、さらにビルをデカくすることが目的です。

  • ビルを維持、拡張するにはお金が必要
  • お金はビル内のテナントからもらえる
  • テナントには客が必要
  • 客は移動手段、エレベータとかがあれば勝手に来る
  • 客は最初は少ないが、評価が良ければ客は自然に増える
  • 客が増えればテナントから収益が出る、逆に客が少ないと損失が出る

肝心のテナントの評価はどう決まるかというと「移動手段の快適さ」でほぼ決まります。

ビルに来る客はエレベータで乗る時に待たされたり、階段を何階も登り降りさせられる、とイライラします。このイライラ度合いが大きい=ビル内のテナントの評価が下がる、という仕組みになっています。

すなわち、大量に作ったテナントにやってくる、超大量の客をいかに待たせずにスムーズに移動させるか?がこのゲームのほぼ全て、と言っても過言ではないはずです。

とだけ書くと、いかにも簡単そうに見えますが…、

  • 移動手段をケチるとキャパオーバーして評価が落ちて赤字
  • 場当たり的な対応を続けると収益<維持費になって評価は良いのに赤字

以上のようなハマりどころも多く、腹立つところも多いですが、バッチリ決まったときの爽快感は中々のものです。

有名どころのシムシリーズ(特にSimCity 4ラッシュアワー)も交通手段が多彩になって、移動のシミュレーションがかなり重視されてきていますから、世界中どこでも人の流れってゲームになる、面白いと感じられているんでしょうね。

クリアした感想

クラシックと付くだけあって、ゲーム内容はPC版ほぼそのままです。懐かしい&面白いです。シナリオが1面しかない、ビルが小規模、辺りの制限は、所詮1000円分ってことなのかな。

不満があるとすると、早送りでも時間の経過が遅いことです。特に40階建てを超えた辺りから遅くてイライラします。DSiの処理能力上、仕方ないのかもしれませんけど…。

操作性は悪くないです。画面デザインはDSiのゲームっぽくないですが、悪くはないです。PCから移植しました!って雰囲気が漂います。

編集者:すずき(2014/04/21 01:54)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2014年5月1日 >>> 2014年4月18日
link もっと後

管理用メニュー

link 記事を新規作成

<2014>
<<<05>>>
----123
45678910
11121314151617
18192021222324
25262728293031

最近のコメント20件

  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」
  • link 14年6月13日
    2048playerさん (09/26 01:00)
    「今のところ最も簡略化した式です。\n--...」
  • link 14年6月13日
    2048playerさん (09/16 01:00)
    「返信ありがとうございます。\nコメントが...」
  • link 14年6月13日
    すずきさん (09/12 21:19)
    「コメントありがとうございます。同じ結果に...」
  • link 14年6月13日
    2048playerさん (09/08 17:30)
    「私も2048の最高スコアを求めたのですが...」
  • link 14年6月13日
    2048さん (09/08 17:16)
    「私も2048の最高スコアを求めたのですが...」
  • link 14年6月13日
    2048playerさん (09/08 16:10)
    「私も2048の最高スコアを求めたのですが...」
  • link 02年8月4日
    lxbfYeaaさん (07/12 10:11)
    「555」
  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」
  • link 24年5月17日
    hdkさん (05/19 07:45)
    「なるほど、そういうことなんですね。Exc...」
  • link 24年5月17日
    すずきさん (05/19 03:41)
    「Standardだと下記の設定になってい...」
  • link 24年5月17日
    hdkさん (05/18 22:16)
    「ドメインを変えたせいで別サイト扱いになっ...」

最近の記事3件

  • link 24年10月31日
    すずき (11/04 15:17)
    「[DENSOの最終勤務日] 最終勤務日でした、入門カードや会社のPCを返却してきました。在籍期間はNSITEXE(品川のオフィ...」
  • link 22年7月8日
    すずき (11/02 20:34)
    「[マンガ紹介 - まとめリンク] 目次: マンガ紹介一覧が欲しくなったので作りました。5作品乙女ゲームの破滅フラグしかない悪役...」
  • link 24年10月30日
    すずき (11/02 20:33)
    「[マンガ紹介] 目次: マンガ紹介お気に入りのマンガ紹介シリーズ。最近完結した短めの作品を紹介します。マイナススキル持ち四人が...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 11/04 15:17