Hatena::ブログ(Diary)

日記

2005-08-16 (火)

CanCam2005年09月号の蛯原友里ちゃん

[][] CanCam 09 月号 エビちゃんベストセレクション 23 04:00

CanCam から,お気に入りの蛯原友里ちゃんを紹介しようというこのコーナー.

今日も LEVI'S とのタイアップ「Girls × Denim のスペシャルな関係♥」から P239 の友里ちゃん.

このタイアップでは数少ない甘めの笑顔.

ちょっとメークと表情がミスマッチな気がしないでもないですが,気にしない気にしない.

元のカットが小さくて画像がぼけて見えるけど,気にしない気にしない.

そんなわけで (どんなわけで?),やっぱり CanCam 買うしか!!

[][][] 出演予定 TV 番組 04:00

この近辺 (どこ?) で話題のモデルが出演するテレビ番組を分かるだけ掲載します.

新規分は赤字で (レギュラー除く).直近分は太字で.

蛯原友里
08/17 (水) 15:55〜17:25 NTV「クリック!」
08/20 (土) 11:40〜11:50 NTV 「THEチャンプ!」

08/21 (日) 22:00〜23:26 NTV 「Tokyo美人物語・本当のキレイを探す旅」
08/21 (日) 深夜 01:50〜02:50 TBS 「史上最大のファッションフェスタ!!東京ガールズコレクション」
山田優
08/17 (水) 21:00〜22:54 TBSビー・バップ・ハイスクール2」
08/18 (木) 深夜 02:17〜02:44 CX 「F1モデル
08/21 (日) 22:55〜00:40 CX 「F1世界選手権第14戦トルコグランプリ」

あら,「クリック!」も「THEチャンプ!」も日テレなんですね.

今まで日テレってあまり出演していない気のせいが.ってことはスローダンス効果ではなくてマキアージュ効果かな?

どんな理由であれ,いっぱい友里ちゃんをテレビで見ることができてうれしいよ!!

[][] エビちゃんのアイピ 03:30

日記が更新されてます.

ありがたいことに,今後出演予定のテレビ番組の紹介が!!

星海銀さんから紹介のあった明日の「クリック!」の他,土曜日の「ザ・チャンプ」など,見逃しやすそうな情報が掲載されています.

いやぁ,うれしいですねぇ.これで見逃して悔しい思いをしなくてすみますよ.

っていうか,今週はテレビ出演多いですね.スローダンス効果?

ともあれ (JW),ありがとう!! 友里ちゃん!!!!

[][] フィジカルを鍛える練習問題 03:00

問題:コンピュータ対戦3目並べを作れ。
条件:コンピュータが先行になったとき、コンピュータは負けてはいけない。
とか。

「きしだのはてな」−「フィジカルを鍛える練習問題」

むぎゅう...

そもそもこういうのは苦手な上に,対話形式にするにはどうしたらいいか分からない...

うーみゅ,write があるなら read があるのか? あるなぁ.

それを繰り返す... どうやって?

うーみゅ...


なんか,本質と違うところで悩みそうなので,問題を簡略化しちゃいましょう.

まずは盤面を

123
456
789

という番号で示すことにします.

そして自分と相手の手をリストとして受け取り,次の手を返す述語を考えます.

tick(List1, List2, X)

List1 は Prolog 君,List2 は対戦相手 (人間),X は Prolog 君の次の手の位置.

コンピュータが先手なら最初は

tick([], [], X).

で始まって,

tick([1, 3, 5], [4, 6, 8], X).

なんてなったら

X = 7

となって終了,みたいな.

これなら入出力に悩まされなくてすみます.

まぁ,入出力を扱えるようになるのは将来の課題ということで.


ともあれ (JW),自分や相手の手をリストとして持つことにしたわけですが,このリストは実質 Set (順序無し集合) として扱うのが都合がいいので,写経本から使えそうなものを先取りしてきます.

element(X, [X|_]).
element(X, [_|Set]) :-
    element(X, Set).

subset([], _).
subset([X|Sub], Set) :-
    element(X, Set),
    subset(Sub, Set).

それから,盤上で打てる位置を表す述語と 3 つ点が並んだことを示す述語を定義.

pos(X) :-
    element(X, [1, 2, 3, 4, 5, 6, 7, 8, 9]).

line([1, 2, 3]).
line([4, 5, 6]).
line([7, 8, 9]).
line([1, 4, 7]).
line([2, 5, 8]).
line([3, 6, 9]).
line([1, 5, 9]).
line([3, 5, 7]).

次はどうしたものか?

とりあえず,自分なり相手なりの手が揃ったことを判断する述語を考えますか.

これまでに打った手のリスト中に 3 並びが含まれていればいいわけなので,subset/2 を使って

win(List) :-
    line(Sub),
    subset(Sub, List).

でいいかなぁ.


それから,次に打つことのできる位置を求める述語を考えます.

next(List1, List2, X) :-
    pos(X),
    not(element(X, List1)),
    not(element(X, List2)).

自分 (List1) も相手 (List2) も置いてない位置を X として返します.バックトラックで次に打てる位置を全部試せるのが Prolog 流.


ここからが本題.

まずはゴールから考えるのがお約束なので,次の一手で勝ち!! ってのを定義します.

tick(List1, List2, X) :-
    next(List1, List2, X),
    win([X|List1]).

既に勝負が付いている場合のガードが入っていませんが... 心より恥じる.


あと一手で勝負が付かない場合はどうするか? うーみゅ...

自分 (Prolog 君) が一手打った後,相手が勝つことができなければいいわけですよね.

勝つことができないってことは... どういうことだ?

全ての手について相手の勝ちがないってことだよね.全ての... 全称記号?

困りましたね,ここまで Prolog してきたのって,全称 (∀) じゃなくて存在 (∃) のような気のせいが.

うーみゅ...

全称を存在で表すには... 「全て〜である」を「〜がある」にするんだから「〜じゃないがある」(日本語ヘンなのは気にしない) の否定にすればいいのか?


そんなわけで (どんなわけで?),全ての手について相手が勝てないことを示すにはまず相手が勝つというかこっちが負けることを示してそれを否定すればいいことになるわけなので,って何を書いてるか分かってますか? 分かってませんかそうですか.

ともあれ (JW),負けることを示す述語.例によって次の一手で相手が勝つことを示せばいいので

lose(List1, List2) :-
    next(List1, List2, X),
    win([X|List2]),
    !.

最後のカットは効率のため.相手が勝つかどうかだけ分かれば後はどうでもいいから.

それから相手が一手打ってからこっち (Prolog 君) が打って相手が勝つ場合は... こっちが負けるってことだからさっきの tick/3 を使う... 使っていいのか? いいや,使おう.

lose(List1, List2) :-
    next(List1, List2, X),
    not(tick(List1, [X|List2], _)),
    !.

うーん,だんだん自分が何をやってるか怪しくなってきた (苦笑).


ともあれ (JW),これで元に戻って自分の次の一手を決めることができるような気のせいが.

自分が打った後に相手が勝てる手があったらダメなんだから,

tick(List1, List2, X) :-
    next(List1, List2, X),
    not(lose([X|List1], List2)).

本当か? 本当に分かってるのか?>おいら

かなり怪しいけどなんかいいような気もする.

っていうか,メチャクチャ手続き的に考えているのはいかがなものか?

まぁいいや.動けばいいんだよ.とりあえず.


そんなわけで (どんなわけで?),試してみますか.

まずは Prolog 君先手で.

2 ?- tick([], [], X).

X = 1 

むむぅ? いきなり 1 からとは... ちゃんと考えてますか?

っていうか,最初は中央を取れとか教えてないおいらがダメですかそうですか.

しょうがない,それなら中央を頂きましょう.

  
 × 
   

で,Prolog 君の次の手は?

3 ?- tick([1], [5], X).

X = 2 

ふーん.工夫がない気もするけど,リーチをかけられたのでこっちは 3 を取るしかありませんね.

×
 × 
   

さて,逆王手ですが... Prolog 君の次の手は? ドキドキ!!

4 ?- tick([1, 2], [3, 5], X).

X = 7 

おぉ!! なんか分かってるじゃん!!

いやその,分かってないのはおいらですけど何か?

そうですか,じゃあおいらは 4 へ入るしかないわけですが.

×
×× 
  

どうする?

5 ?- tick([1, 2, 7], [3, 4, 5], X).

X = 6 

ふむ.これでもうどちらにも勝機はなくなったわけですが,そういえば引き分けのことを忘れていたなぁ.心より恥じる.

しょうがないので続けてみますか.とりあえず 8.

×
××
× 

どうよ?

6 ?- tick([1, 2, 6, 7], [3, 4, 5, 8], X).

X = 9 

ということで Prolog 君は負けることなくゲーム終了.

そういえば,ゲーム終了の判定もないような気のせいが.心より恥じる.


っていうか,Prolog 君,ちゃんと勝てるのか?

最初にリーチかけられたところでわざと墓穴を掘ってみるテスト.

×
 × 
 ×

7 ?- tick([1, 2, 7], [3, 5, 9], X).

X = 4 

おぉ,ちゃんと4を取りましたね.

でもでも,一番小さい数を選んだだけかもしれないから,ちょっと回転して

× ×
× 
 

8 ?- tick([4, 7, 9], [1, 3, 5], X).

X = 8 

大丈夫みたいです♪


じゃあ,人間先手でやってみましょう.当然中央から攻めるよ.

9 ?- tick([], [5], X).

No

ぐはぁっ.(;_;)

うーみゅ,人間先行だとどうやっても答を出してくれない...

考え方が間違っているのか引き分けに持ち込むルールを仕込んでいないことが原因なのか...

ともあれ (JW),きしださんのお題には人間が先手の場合の条件は入ってないからこれでいいや.

...

いいのか? (^^;

まぁ,マジメにやるなら深さ優先だか幅優先だか MiniMax だかって難しいことを駆使しないといけない気がするわけで,おいらのレベルじゃ小手先ではムリポ

っていうか,そういうのを鍛えるのがフィジカルトレーニング? なんだろうな,やっぱり.

いいのだ.おいらは Prolog のトレーニングがしたかっただけなのだ.

・・・

言い訳です,はい.心より恥じる.

[][] Prolog 写経記 その 8 delete_n/3 02:30

今日は delete_n/3写経します.

解説

delete_n(N, List1, List2)List1 から N 番目の要素を削除した新しいリストを List2 として返す.

まぁ普通.Java でいうと List#remove(int) みたいな.


モード

delete_n(?, ?, ?)

これは全ての引数を入力・出力の両方で使えるようです.


定義

では,こいつの定義を写経しませう.

delete_n(N, List1, List2) :-
    conc(L1, [_|L2], List1),
    length(L1, M),
    N is M + 1,
    conc(L1, L2, List2),
    !.

未知の述語,length/2 が使われています.

こいつを事前に写経しなきゃいけないと思ったのですが,おいらが使っている SWI-Prolog という処理系では length/2 は組み込み述語として用意されていて,写経するまでもなく使えちゃいました.

念のため length/2 の解説を写経しておくと,

length(List, L) はリスト List の長さを返す.すなわちLを List の要素の数に具体化する.

まぁ普通.Java でいうと List#size() みたいな.


ともあれ (JW),delete_n/3 に戻ります.

こいつの定義は久しぶりに節が一つだけ,再帰も無しということで,結構簡単な感じ.

し・か・も

発想自体も以前写経した delete/3 とそっくりで, List1N 番目の要素とその左右の要素からなるリストの3つに分割します.

  • N 番目の要素より左の要素からなるリスト (L1).
  • N 番目の要素 (無名の項).
  • N 番目の要素より右の要素からなるリスト (L2).

そして

  • L1,無名の項,L2 を連結したものが List1 である.
  • L1, L2 を連結したものが List2 である.

ということになります.

この二つを表しているのが節の本体に出てくる conc/3 ですが,その間にある

    length(L1, M),
    N is M + 1,

  • N 番目の要素より左の要素からなるリスト (L1).

を表しています.

L1 の長さは M で,M1 加えたものが N ということです.ちょっと回りくどい感じがしますね.

たぶん,

    M is N -1,
    length(L1, M),

でも同じような気がして,手続き的な頭にはこっちの方が自然な感じ.宣言的に考えた場合に本質的な違いってあるのかなぁ?

ともあれ (JW),同じ動きになるかあとで確認.


最後にカットが付いているのですが,この意味がよく分かりません.ゴールに達したあとのバックトラックを禁止しているわけですが,この述語の場合 length/2 があるので別の解が得られることはないような気のせいが.

単に無駄な推論をさせないためのカットかなぁ?

ともあれ (JW),これも削除して同じ動きになるかあとで確認.


注記

あまり写経する必要なさげなんですが,昨日したので今日からは写経します.

List1List2 がすでに具体化されている場合,delete_nList1 から N 番目の要素が削除されたかどうかを調べる.

ね? 大したことないでしょ?


では使用例を写経しませう.

2 ?- delete_n(3, [mike, john, ann, steve], L).

L = [mike, john, steve] ;

No
3 ?- delete_n(Which, [peter, tom, mary], [tom, mary]).

Which = 1 ;

No
4 ?- delete_n(Which, [peter, tom, mary], [mary, tom]).

No

まぁ,普通.


そんなわけで (どんなわけで?),実験開始.

まずは述語の定義を

delete_n(N, List1, List2) :-
    conc(L1, [_|L2], List1),
    M is N - 1,
    length(L1, M),
    conc(L1, L2, List2),
    !.

に変更してお試し.

6 ?- delete_n(3, [mike, john, ann, steve], L).

L = [mike, john, steve] ;

No

ふむ.うまく動いてますね.

続けてお試し.

7 ?- delete_n(Which, [peter, tom, mary], [tom, mary]).
ERROR: Arguments are not sufficiently instantiated
^  Exception: (8) _L152 is _G491-1 ? abort
% Execution Aborted

ぐはぁっ...

えっと,何が起きたかというと... そうか,そういうことか.

例の最初のように

delete_n(3, [mike, john, ann, steve], L).

と第 1 引数に具体的な値を渡した場合は N が具体化されているので

    M is N - 1,

を計算することができますが,2 番目の例のように

delete_n(Which, [peter, tom, mary], [tom, mary]).

と第 1 引数に具体的な値を渡さなかった場合は N が具体化されていないので

    M is N - 1,

を計算することができないと,そういうわけですか.うーみゅ...

どの引数が具体化されているか (いないか),ちゃんと考えないといけないという事ですね.

っていうか,引数が入力になったり出力になったり自由自在っていうのも考えるのが難しそうな気がする今日この頃です.

っていうか,わざわざ注記に書いてあったとです...

それなのに,「大したことない」とか書いてしまったとです...

k(1) です...

k(1) です...


ともあれ (JW),気を取り直して次行きますよ!! 次,次!! (久々エビちゃん風)

そんなわけで (どんなわけで?),カットを外してみます.

delete_n(N, List1, List2) :-
    conc(L1, [_|L2], List1),
    length(L1, M),
    N is M + 1,
    conc(L1, L2, List2).

そして例をお試し.

11 ?- delete_n(3, [mike, john, ann, steve], L).

L = [mike, john, steve] ;

No
12 ?- delete_n(Which, [peter, tom, mary], [tom, mary]).

Which = 1 ;

No
13 ?- delete_n(Which, [peter, tom, mary], [mary, tom]).

No

ふむ.こちらはうまくいったっぽい.

なので,おそらくこのカットは効率のために付いているだけではないかと.第2引数で与えるリストがとても長い場合などに差が出てくるのかも.


ともあれ (JW),ここ数日順調に Prolog を分かりつつあったような気がしていたのですが,まだまだ未熟だということを痛感しました.心より恥じる.

[] モデくる 02:00

iMAGE COLECTION のサイトもいつの間にか変わってますね.

http://www.st-image.com/content/Default.aspx


注目は「モデくる」.

なんでも,「モデルをくるくる回転させて秋のモテ服コーディネートを今すぐチェック」ということで,なんと徳澤直子ちゃん&臼田あさ美ちゃんをくるくる!!

これはすごいっすよ.超楽しいです♪

コーディネートに興味のない野郎どもだって,直ちん&あさ美ちゃんを顔アップにしてくるくる!!

っていうか,モデルの後ろ姿をじっくり眺める機会ってあまり無いのでこれはかなり貴重かも...

いずれは友里ちゃんもお願いします!!!!

[][][] iMAGE COLLECTION Vol.46 01:45

お馴染みの通販雑誌です.コンビニで見かけて買ってきました.

しかし...

蛯原友里ちゃんの掲載ページ数は驚きの少なさ.買う必要なかったかも〜.

念入りにチェックしたわけじゃないけど,P45〜49 と P109〜116 だけじゃないか?

どのカットも笑顔全開ではなく,特に P45〜49 はカッコいい系な雰囲気.

ともあれ (JW),友里ちゃん目当てとしてはちょっと残念でした.


代わりに (?),徳澤直子ちゃんが大活躍!!

表紙から始まってどこを開いても直ちんみたいな.CanCam よりすごいかも!? (^^;

でもでも,表紙を最初見た時にメーク濃いめの渡香奈ちゃんかと思ったのは内緒だ.


ともあれ (JW),iMAGE COLLECTION,表紙の開き方が変わったような.

今までは左開きだったはずなのに (たぶん),今号は右開き.CanCam なんかと同じになりました.

みんな右開きだと雑誌を積んだ時に崩れやすくなるから左開きはありがたかったんですけどねぇ.

[][] めざましテレビ 01:30

今日の早耳ムスメは木下ココちゃん,お題は「売り切れ必至!! 秋の新作コスメ」.

おやぁ,ココちゃんいつの間に小麦色に...

あんなに色白だったのに.夏休みで海にでも行ったのかな?


ともあれ (JW),ココちゃんの七変化がなかなか楽しい!!

RMK
華やかでいいかもぉ〜.
stilla
あまりギャルっぽくない自然な感じがイイ!!
shu uemura
フェザーのつけまつげが妖しい...
ANNA SUI
スゴイというかなんというか...

個人的にはどれだろう? ちょっと子供っぽいけど stilla かキラキラな RMK か?

うーみゅ,後でもう一回チェックしよう♪


01:45 追記

見直した結果 stilla に決定.

別に子供っぽくはなくてキュート!!

makotanmakotan 2005/08/17 07:15 あさ美ちゃんの食レポなんだけど、数が少なかった気が・・・
それより歌スタの鼻歌のコーナーがあさ美ちゃんになってるのがものすご〜く気になった(笑)
あさ美ちゃんを(^_^)( ^_)( ^)( )(^ )(_^ )(^_^)クルクルー

abcbsnbcabcbsnbc 2005/08/17 21:00 >表紙を最初見た時にメーク濃いめの渡香奈ちゃんかと思ったのは内緒だ
えーーーありえない

tketke 2005/08/17 22:20 木下ココは、早耳の中で一番微妙な存在だ…

koichikkoichik 2005/08/18 02:19 まこたん:そのくるくる AA,X がたくさんに見える...
abcbsnbc さん:ありえないよね... 心より恥じる.
tke さん:一番微妙? ですか? 自分的にはそんなに好きでも嫌いでもなかったけどちょっと好きな方になりつつある今日この頃です.

tntn 2011/02/01 14:28 > うーみゅ,人間先行だとどうやっても答を出してくれない...

Prolog君が後攻の場合、たとえば、

tick([1,6,7],[3,4,5,9],X).

を質問した場合、相手の次の一手が最後の一手なので、
Prolog君がその次を指すことが出来ず

lose(List1, List2) :-
next(List1, List2, X),
not(tick(List1, [X|List2], _)),
!.

は、負けるわけでもないのに真となります。

lose は、tick を、tick は lose を
という再帰呼び出しがありますので、結局、最初の
tick([], [5], X). でも手が指せなくなります。

そこで試しに

tick(List1, List2, -1):-
length(List1, N),
length(List2, M),
plus(N, M, 9).

を付け足したところ、tick([], [5], X). で X = 1 を答えてきました。