プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 このページをアンテナに追加 RSSフィード

 iTunes Music Store(Japan) なかのひと あわせて読みたいブログパーツ
|

0001 | 00 |
2004 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2008 | 01 | 02 | 03 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 |
2010 | 03 | 04 | 06 | 07 | 09 | 10 | 11 |
2011 | 01 | 02 | 10 |
2012 | 04 |
2013 | 01 | 05 | 06 | 07 | 08 | 10 |
2014 | 02 | 03 | 05 | 09 |
2015 | 04 |
2016 | 09 | 11 | 12 |
はてな一覧
アンテナに追加
私のアンテナ
私のダイアリー
私のアーカイブ
私のアイデア
私のブックマーク
私のグループ
私のキーワード
ニュース系、今まで続いているシリーズモノの読み物
dKingyo Utility Toolkit Projectのリリース情報
やっぱり暗号化は大人の味(笑)
プログラムのパッキング方法を調べよ
ココが厳しいよMinGW
ライブラリアン通信
ゲームプログラミングどうしよう
CRCについて
ビット演算練習
d金魚の今更Ajax
Windows Tips
VC6 Tips
Win32 WTL Tips
Ruby for C++ User
Ruby Tips
今日のRubyで嵌った事
正規表現PIECE
書きかけ
続く・・・

私のダイアリーの人気記事
新しくブックマークされた記事


あまり、役に立たなそうな個人的に調べた情報や妄想に耽った事、今 勉強している事ヒソヒソと公開していたりします。 | 登録してくれている方々 | d金魚にメール | 当サイトは640x480の画面解像度に対応しています。
日記へのリンク、アンリンクはフリーですが、selfタグのついている部分のコンテンツの引用はご遠慮願います。ご協力よろしくお願いします。


2007-04-01 ジャン拳 V.S. ジャジャン拳 番外編

[][][]囚人のジレンマゲームを企業戦略に応用する 囚人のジレンマゲームを企業戦略に応用する - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 を含むブックマーク 囚人のジレンマゲームを企業戦略に応用する - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 のブックマークコメント

元ネタエントリーコメント

http://satoshi.blogs.com/life/2007/03/post_19.html#comment-64830102

より引用

独断と偏見だけど、

マイクロソフト・・・相手があきらめるまでチョキを出し続ける。

アップル・・・ひたすら理想を追い求めてパーを出しつづける

Linux陣営・・・利益度外視でグーを出しつづける。

とあった。

非常に興味深い。


これら三つをプログラム化させて対戦させると・・・見てのとおり

賞金総額ランキング

Apple : 500000円

Microsoft : 200000円

LinuxGroup : 0円


最高獲得賞金ランキング

Apple : 500000円

Microsoft : 200000円

LinuxGroup : 0円


となり、将来が有望なのはAppleというのは自明なのだ!!!

即ち「ひたすら理想を追い求める」事の重要性を示唆している!!!


というのはもちろんネタである。

2007-03-31 ジャン拳 V.S. ジャジャン拳 PART.4

[][][]ビルゲイツ面接試験ジャンケン編 解説 をRuby化して対戦させてみました。 ビルゲイツの面接試験−ジャンケン編 解説 をRuby化して対戦させてみました。 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 を含むブックマーク ビルゲイツの面接試験−ジャンケン編 解説 をRuby化して対戦させてみました。 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 のブックマークコメント

Powered by dKingyo CSS | ゲーム理論 | ツクール | 統計学 | Rails | アルゴリズム | オープンソース


ビルゲイツ面接試験ジャンケン編 解説

http://satoshi.blogs.com/life/2007/03/post_19.html

が既にエントリーされていたのを知ったので

via http://d.hatena.ne.jp/ladybug/20070330*1


解説にて説明されていたルーチンを

http://d.hatena.ne.jp/studiokingyo/20070330

フレームワークを使い

Rubyで書いてみました。*2


よって、対戦させてみた結果・・・

強い!!!・・・です!!!


実行結果とソースコードを含むzipファイル

http://www.dkut.flnet.org/result.html#zyazyan

にアップしておきました。

Prisoners_Dilemmaアップした日付.zip からダウンロードできます。

使い方は

ruby zyazyan.rb

です。

アーカイブ内のフレームワークは昨日のエントリーに書いたフレームワークより新しいので

もし、フレームワークを使う場合はアーカイブ内のフレームワークをお使いください。


ちなみに、このルーチンより強いルーチンを開発中です。

[][]ジャン拳 V.S. ジャジャン拳 framework に致命的なバグ発見 ジャン拳 V.S. ジャジャン拳 framework に致命的なバグを発見 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 を含むブックマーク ジャン拳 V.S. ジャジャン拳 framework に致命的なバグを発見 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 のブックマークコメント

http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/studiokingyo/20070331%23p1

より

State#check(a,b)にて
a       b
パー  ==パー
パー  >チョキ
パー  >グー
チョキ<パー
チョキ==チョキ
チョキ<グー
グー  <パー
グー  >チョキ
グー  ==グー

といった力関係になってしまうバグ発見しました。

修正しましたので

http://www.dkut.flnet.org/result.html#zyazyan

アップいたします。

*1:「実際にコーディングをして競わせたいと思いませんか?」と言う所に共感しました。

*2:実は、ルーチンが上手くかけているかどうか自信が無い。

ladybugladybug 2007/03/31 21:20 春雷で身動きとれないうちに良い仕事をありがとうございます。

studiokingyostudiokingyo 2007/04/04 08:56 どういたしまして。このゲームの戦略生成の手助けになりましたら幸いです。

2007-03-30 ジャン拳 V.S. ジャジャン拳 PART.3

[][]Ruby Tips / ジャン拳 V.S. ジャジャン拳 framework version 2007.03.30 Ruby Tips / ジャン拳 V.S. ジャジャン拳 framework version 2007.03.30 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 を含むブックマーク Ruby Tips / ジャン拳 V.S. ジャジャン拳 framework version 2007.03.30 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 のブックマークコメント

Powered by dKingyo CSS | ゲーム理論 | ツクール | 統計学 | Rails

前回のframeworkをバージョンアップさせた。

http://d.hatena.ne.jp/studiokingyo/20070329


あえてもう一回言うが

ジャン拳の元ネタドラゴンボール

ジャジャン拳の元ネタHUNTER×HUNTER

である。


さて、このフレームワークで出来る事は

である。


このフレームワークで遊ぶに意外とはまる。

私が対戦生成やランキングを出力を実装してしてしまうくらい面白いのだ。

この不毛な楽しさがなんともたまらない。

とりあえず・・・ソースコード伏線を持たせつつも以下のとおり、掲載してみた。

ちなみにはてなソースコード記法だとバグルので拙作

ruby2html.rb (http://d.hatena.ne.jp/studiokingyo/20070327)

を使っている。

続きを読む

追記:2007年3月31日:致命的なバグがあったので以下のダウンロード先から最新版のアーカイブダウンロードしてください。

http://www.dkut.flnet.org/result.html#zyazyan

2007-03-29 ジャン拳 V.S. ジャジャン拳 PART.2

[][]Ruby Tips / Ruby囚人のジレンマゲーム作ってみた Ruby Tips / Rubyで囚人のジレンマ?ゲーム作ってみた - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 を含むブックマーク Ruby Tips / Rubyで囚人のジレンマ?ゲーム作ってみた - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 のブックマークコメント

Powered by dKingyo CSS | ゲーム理論 | ツクール | 統計学 | Rails

[wikipedia:囚人のジレンマ]理論はよく分からないけど、ある程度遊べるかもしれないフレームワークを作ってみた。

名付けてジャン拳 V.S. ジャジャン拳 framework !!!!!!!


ちなみに

ジャン拳の元ネタドラゴンボール

ジャジャン拳の元ネタHUNTER×HUNTER

だったりする。


閑話休題・・・


このフレームワークで出来る事は

  • 各手の勝ちの点数を決める事が出来る
  • 各手の負け、引き分けの点数も決める事が出来る
  • 今までのスコアや相手が出した手や勝ち負けなどの成績を思考ルーチン側が取得する事ができる*1
  • 最後にキメ台詞をはく事が出来きる!?

等など 魅力的!?な機能がたくさんあります。


で、私の環境でちょっと遊んでみた所・・・

ランダム出力は以外と弱かった・・・

そして、今のところ d金魚 01 ルーチンに敵なし!!! *2

続きを読む

最新版はhttp://www.dkut.flnet.org/result.html#zyazyanよりダウンロードできます。

#usr/local/bin/ruby
=begin
Copyright(C) 2007 d金魚

ジャン拳 V.S. ジャジャン拳 framework version 2007.03.29
囚人のジレンマプログラムで対戦させるフレームワーク...?
嗚呼!不毛だ!!!


自分のルーチンを組む場合はZyanやZyaZyanやDKingyo01参考にしてください。
とりあえず、ソースコードライセンスGPLでお願いします。
(NYSLにしたいところだけれども・・・)
できれば相手方のルーチンとDKingyo01を戦わせてみたいと思いますし、
DKingyo02も控えていますし・・・何かのネタになればなにより。
=end



WIN =0
LOSE=1
DRAW=2

PAPER = 0
SCISSORS = 1
STONE = 2

class Score
 # @param paper scissors stone スコアを入れる。
 def initialize(paper,scissors,stone)
  @score = [paper,scissors,stone]
 end
 attr_reader :score
end

class Record
 def initialize(win,draw,score_)
  @win_count = win
  @draw_count= draw
  @score     = score_
 end
 attr_reader :win_count, :draw_count, :score
 
end

#0:paper 1:scissors 2:stone
class State
 #a bの勝った数
 @awin_count = 0
 @bwin_count = 0
 #引き分けの数
 @draw_count = 0
 #a b のスコア
 @ascore = 0
 @bscore = 0
 #今のカウント
 @now_count
 
 # @param win_score_,lose_score_,draw_score_ スコアオブジェクトを入れる
 # @param count_ 試行回数を入れる
 # @param comflag コメントフラグ TRUEでコメント出力
 def initialize(win_score_,lose_score_,draw_score_,count_,comflag=false)
  @win_score  = win_score_
  @lose_score = lose_score_
  @draw_score = draw_score_
  @win_score_rank = [0,1,2]
  @lose_score_rank= [0,1,2]
  @draw_score_rank = [0,1,2]
  @count = count_
  @comment_flag = comflag
  score_calc(win_score.score,win_score_rank)
  score_calc(lose_score.score,lose_score_rank)
  score_calc(draw_score.score,draw_score_rank)
  print_score_rank
 end
 
 attr_reader :win_score, :lose_score, :draw_score, 
  :win_score_rank, :lose_score_rank, :draw_score_rank,
  :count, :now_count, 
  :awin_count, :bwin_count, :draw_count, :ascore, :bscore 

 def score_calc(score,score_rank)
  arr = score.clone
  arr.sort!{|a, b| -(a <=> b)}

  for i in 0..2 do #score rank sort
   for j in 0..2 do
    if score[j] == arr[i] then
     if 0<i && score[j] == arr[i-1] then # 同条件問題
      score_rank[i] = (2 == score_rank[i-1]) ? 0 : score_rank[i-1] + 1
     else
      score_rank[i] = j
      
     end
     
     break;
     
    end
   end
  end
  return arr
 end
 
 def action_name(v)
  case(v)
   when PAPER
    return "パー  "
   when SCISSORS
    return "チョキ"
   when STONE
    return "グー  "
   else
    return "必殺!グーチョキパー同時出し!"#知っている人いるかな?
  end
 end
 
 def print_score_rank
  puts "勝ち得点表\" # 最後に\を挿入しないとインタプリタバグ
  for i in 0..STONE do
   r = win_score_rank[i]
   print action_name(r)
   print " ",win_score.score[r],"\n"
  end

  puts "負け得点表\"
  for i in 0..STONE do
   r = lose_score_rank[i]
   print action_name(r)
   print " ",lose_score.score[r],"\n"
  end
  
  puts "あいこ得点表\"
  for i in 0..STONE do
   r = draw_score_rank[i]
   print action_name(r)
   print " ",draw_score.score[r],"\n"
  end
  print "\n"
 end
 
 def lose_point(action)
  return lose_score.score[action]
 end
 
 def win_point(action)
  return win_score.score[action]
 end
 
 def draw_point(action)
  return draw_score.score[action]
 end
 
 # -1:aの勝ち 0:あいこ 1:bの勝ち
 def check(a,b)
 #追記:2007年3月31日バグがあったので更新
   if a==b then
   return 0
  end
  case(a)
   when PAPER
    if SCISSORS==b then
     return 1
    end

   when SCISSORS
    if STONE==b then
     return 1
    end

   when STONE
    if PAPER==b then
     return 1
    end
    
   end
   return -1
=begin
バグの元
  if a==b then
   return 0
  end
  a = a==0 ? 3 : a
  b = b==0 ? 3 : b
  
  if a < b then
   return 1
  end
  return -1
=end
 end
 #ここの中をいじって途中でルールが変わるようにしても面白い
 def fight(a,b)
  @awin_count = 0
  @ascore = 0
  @bscore = 0
  @draw_count = 0
  @bwin_count = 0
  @now_count = 0
 
  for i in 0 .. count - 1 do
   arecord = Record.new(awin_count,draw_count,ascore)
   brecord = Record.new(bwin_count,draw_count,bscore)
  
   ar = a.calc(self,arecord,brecord)
   br = b.calc(self,brecord,arecord)
   
   re = check(ar,br)
   
   ares = DRAW
   bres = DRAW
   
   case(re)
    when -1
     ares = WIN
     bres = LOSE
     @awin_count = @awin_count + 1
     @ascore = @ascore + win_point(ar)
     @bscore = @bscore + lose_point(br)
    when 0
     ares = bres = DRAW
     @draw_count = @draw_count + 1
     @ascore = @ascore + draw_point(ar)
     @bscore = @bscore + draw_point(br)
    when 1
     ares = LOSE
     bres = WIN
     @bwin_count = @bwin_count + 1
     @ascore = @ascore + lose_point(ar)
     @bscore = @bscore + win_point(br)
     
   end
   
   a.result(ares,ar,br)
   b.result(bres,br,ar)
   
   @now_count = @now_count + 1
  end
  
  print a.name," 勝利数 : ",awin_count," 賞金総額 : ",ascore,"円\n"
  print b.name," 勝利数 : ",bwin_count," 賞金総額 : ",bscore,"円\n"
  print "あいこ : ",draw_count,"\n\n"
  
  if true==@comment_flag
   arecord = Record.new(awin_count,draw_count,ascore)
   brecord = Record.new(bwin_count,draw_count,bscore)
   
   print a.name,"のコメント\n"
   a.comment(self,arecord,brecord)
   print "\n"
   
   print b.name,"のコメント\n"
   b.comment(self,brecord,arecord)
   print "\n"
  end
 end


end


class Zyan
 def initialize
  @name = "悟空"
 end

 attr_reader :name
 
 def calc(state,your_record,enemy_record)
  res = state.now_count % 3
 
  return res
 end

 def result(res,your_action,enemy_action)
  
 end
 def comment(state,your_record,enemy_record)
  if your_record.score < enemy_record.score
   puts "オラ負けちまったぞ!"
  else
   puts "オラ勝っちまったぞ!"
  end
 end
end

class ZyaZyan
 def initialize
  @name = "ゴン"
 end
 attr_reader :name
 def calc(state,your_record,enemy_record)
  res = rand(3)
  return res
 end
 
 def result(res,your_action,enemy_action)
  
 end
 def comment(state,your,enemy)
  if your.score < enemy.score then
   #puts ゴンっぽいセリフを入れてくれ
  end
 end
end

class DKingyo01
 def initialize
  @name = "d金魚 01"
  @pattern = [0,1]
  @next_action = -1
  @ctr = 0
  @foul_ctr = 0
 end

 attr_reader :name
 
 def get_lose(score_rank)
  return score_rank[0] == 0 ? STONE : score_rank[0] - 1
 end
 # @state ステート Stateクラスが入る
 # @your_record Recordクラスが入る あなたの成績が参照できる
 # @enemy_action 敵の成績が... 上記同
 def calc(state,your_record,enemy_record)
  @pattern[0] = state.win_score_rank[0]
  @pattern[1] = get_lose(state.win_score_rank[0])
  
  if -1 != @next_action then
   return @next_action
  else
   @next_action = @pattern[0]
  end
  
  return @next_action
 end
 # @res 結果 WIN LOSE DRAWのどれか
 # @your_action あなたの手 PAPER SCISSORS STONEのどれか
 # @enemy_action 敵の手 上記同
 def result(res,your_action,enemy_action)
  if WIN==res then
   @ctr = @ctr + 1
  end
  @next_action = @pattern[@ctr % 1]
  
  if enemy_action != @pattern[0] && enemy_action != @pattern[1] then
   @next_action = enemy_action
   @foul_ctr = @foul_ctr + 1
  end
 end
 #最後に出力させるコメント 引数からどのオブジェクトが格納されるのかは上記参照
 def comment(state,your,enemy)
  if @foul_ctr > state.count / 4 then
   print state.count,"中 ",@foul_ctr,
   "回も期待に添わない手を出してくるあなたって卑怯ね\n"
   print "そして・・・"
  end
  if your.score > enemy.score then
   puts "私の勝ち"
  else
   puts "まいったおrz"
  end
 end
end


#今回のルール元ネタによる
# http://satoshi.blogs.com/life/2007/03/post_16.html
#Score.new(paper,scissors,stone) 
win = Score.new(500,200,0)
lose= Score.new(0,0,0)
draw= Score.new(0,0,0)

Prisoners_Dilemma = State.new(win,lose,draw,1000)

Prisoners_Dilemma.fight(Zyan.new,ZyaZyan.new)

Prisoners_Dilemma.fight(Zyan.new,DKingyo01.new)

Prisoners_Dilemma.fight(ZyaZyan.new,DKingyo01.new)

#todo 総当たり戦とかランキング出力とか出来るね。
# それから自分の手の引数から勝ち負けの手を返すメソッドとか?

*1:なので思考ルーチン側が配列を用意して今までの敵の手を保存してパターンを解析したり事も可能。

*2:これを井の中の蛙と言う。追記:何故かアホなルーチンだったのに敵なしだった訳は勝敗チェックルーチンがバグっていたからです。(爆)

2007-03-28 ジャン拳 V.S. ジャジャン拳

[][]ジャン拳 V.S. ジャジャン拳 ジャン拳 V.S. ジャジャン拳 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 を含むブックマーク ジャン拳 V.S. ジャジャン拳 - プログラミングの作業に何の価値も見出せなくなってしまったd金魚による日記 のブックマークコメント

Powered by dKingyo Visual Basic | コンパイラ | Cisco技術者 | アルゴリズム | オープンソース


http://satoshi.blogs.com/life/2007/03/post_16.html

より・・・

自分でも解けそうだったのでやってみました。


このルールを見る限り

  • 強い方>弱い方
    賞金比率
    
    といった形で表すと
    チョ>パ>グ>チョ>パ ...
    2 :5:0:2 :5 ...
    
    といった関係
  • 負けてもペナルティーマイナス)がないという事
  • 賞金の合計額は相手との競争でない事
  • 問題中の条件で「大切なのは試合中に見えるのは相手が何を出したかだけです。」

が要点だと感じました。


賞金の比率を見ると500:200なので

パーで50%の確率で勝ちつづけた場合とチョキで勝ちつづけた場合

250:200

となるのでチョキで1回勝つより賞金額が高い。

それを2回も続けないとパーで50%の確率で勝った賞金額に届かない。

よって、チョキは絶対に出さない。

という戦略をとります。(名付けてグーパー交互戦略


相手も自分も最高額の賞金を手に入れたいと思うならば

自分がパーで1000回勝つ。	自分は500000円。相手は0円
両者ともパーで500回勝つ。	自分は250000円。相手は250000円
自分がチョキで1000回勝つ。自分は200000円。相手は0円
自分がグーで1000回勝つ。	自分は0円。	相手は0円

からこの戦略が最もであるのは明白でしょう。

強いて問題を挙げるならばこの条件を相手サイドもルールから理解しているかと言う事です。


だけど、この手の問題を考える時必ず、抜け穴があるはずだ!!!と考えてしまうのです。


ちょっと考えた結果

  • 相手が賞金なんて関係ナシにランダムに手を選ぶような機械であったり
  • 相手がずっとチョキだけを出す主催者サイドの手先であったり
  • 負けると挽回不可能なペナルティーがあったり
  • 賞金の合計額は相手との競争で相手より賞金が多くないとその賞金は帳消しであったり
  • 「試合中に見えるのは相手が何を出したかだけです。」から何を出したかという結果を見ても相手が戦略の意図を理解できなかったり
  • 相手が何を出したか知ることが出来なかったり
  • 自分がパーのときに相手がチョキを出してペースを乱してしまったり

した場合はこの戦略は使えません。


ちなみにこの問題は

http://d.hatena.ne.jp/yaneurao/20070326

のような問題を思い出して、この手の考え方を使用してみました。


前回行った「かめかめ算」の時にはC++プログラムを掲載したので今回はRubyで掲載してみます。

続きを読む

#usr/local/bin/ruby
=begin
一番高い金額の手で交互に勝ち負けをするといったアルゴリズム
=end

paper = 500
scissors = 200
stone = 0

count = 1000


arr = Array.new
win_score = Array.new

class Element
 def initialize(_id,_value)
  @id = _id
  @value = _value
 end
 attr_accessor :id, :value
 def print_name
  case(id)
  when 0
   print "パー" 
  when 1
   print "チョキ"
  when 2
   print "グー"
  end
 end
end

et = Array.new
t = Element.new(0,paper)
et.push(t)
t = Element.new(1,scissors)
et.push(t)
t = Element.new(2,stone)
et.push(t)

arr =[paper,scissors,stone]
score_rank = [0,1,2]
win_score = [paper * count,scissors * count,stone * count]

#0:paper 1:scissors 2:stone
arr.sort!{|a, b| -(a <=> b)}
for i in 0..2 do #score rank sort
 for j in 0..2 do
  if et[j].value == arr[i] then
   score_rank[i] = et[j].id
  end
 end
end

lose = [0,1]
lose[0] = score_rank[0]
lose[1] = score_rank[0] == 0 ? 2 : score_rank[0] - 1

for i in 0..1 do
 et[lose[i]].print_name
 if 0==i then
  print ""
 end
end
puts " を交互に出せばよい"
sc = ( win_score[lose[0]] ) / 2
print "自分、相手の賞金額は","#{sc}","\n"
exit


追記:あえて最初に書くのも無粋かと思ったけど、これって一種の行動心理テストに近いものがあるなーと・・・ってのは勘違いか^^;

Program | Debug | dKingyo Utility Toolkit | library | D言語 | 御本とか | 備忘録 | テクニック | WayBack | 格言 | 英語 | 他力本願 | news | software |

デースケドガー