「def」を含む日記 RSS

はてなキーワード: defとは

2007-10-14

pythonクラスを使ったけど

class BTree:
    def __init__(self, node_info=None):
        self.root = BNode(node_info)
        self.left = None
        self.right = None

    @classmethod
    def printNode(self, n):
        print "%s " % n.info,

    def walk(self, node = self.root, Execute=BTree.printNode):
        ... ...

walkメソッドは引数エラーがでる。selfがわかんないみたい。name 'self' is not defined

そりゃそうか、実行時にselfが決まるんだから。でもname 'BTree' is not definedになるのは何故?

2007-09-25

プログラム学習

http://anond.hatelabo.jp/20070924220240

最初の頃は単なる知識を得る作業だから仕方ない。つまらないが、最初に知識をかき集めるその方法が一番効率がいいから、テキストはそういう構成になっている。面白いのは、手元に材料が一通り揃ってから、「この課題を解決せよ、手段は問わない」という類の問題が出される段階になった時。

2chプログラミング板の宿題スレに一時期住んでたんだけど、一番面白いと思った課題は「迷路を解くプログラムを作れ。実装方法はいっさい問わない。速いプログラムほど良いとする」というもの。「迷路は壁=1、通路=0みたいなテキストデータで与えられ、入り口と出口は壁に隣接…」みたいな仕様だけは与えられたが、それ以外何もなし。

解決方法を考えるのは楽しいし、自分にできない事をやってくれるプログラムというのはコンピュータが自分で考えているみたいで妙に愛着が湧く。

プログラムにやらせたい作業が見つからない、というのは多分想像力の欠如でもなんでもなく誰もが通る道。実際、日常生活でそんな機会はなかなか無い。

自分の場合、Perlwebサイト関連ツールを作るところから始めたかな。フォームに入力した内容が追加されていくだけの簡単な日記帳とか、後はカウンターとか、そんなものをチマチマ作る事から始めた。ほとんどはもう使ってないが、タブ区切りテキストデータhtmlのtableに直すスクリプトは地味に今でもしょっちゅう使う。

2chdatを読み込ませて書き込み数の遷移を出すプログラムhttp://www.tv2ch.info/?3 みたいなの)も、時間辺りの書き込み数データテキストで書き出すところまで作ったな(Excelコピペしてグラフツールを使えばこのサイトのようなグラフが書ける所まで)。テキスト周りの処理が出来るならば簡単に書ける。

あとは、Ragnarok Onlineで時間辺りダメージを最大にするためにはどのようにステータスを成長させれば良いかの算出をプログラムにやらせたりもした。あり得るステ振り全てに対し総当り探索。(分かる人だけに注釈を入れると職業ハンターで、算出値は鷹ダメージ込み。敵のdefに応じてダメージが変わってくるんで複数パターン出した)

ネトゲだと、某ゲームでアイテムの相場入力すると、儲かりそうな生産レシピを出力してくれるプログラムも書いた。書いたが、打ち込むべきデータを集めるのが面倒すぎて使用は断念した。

総当りで思い出したが、HTMLで色見本を書き出すプログラムも書いた。http://www.tohoho-web.com/wwwcolor.htm の216色見本みたいなのをプログラムで生成させた。

教科書でやった課題は、ソートプログラムくらいかな。アルゴリズムの流れだけ理解したら、教科書を閉じてそのアルゴリズムを自力で実装する。写経は面倒でやれなかった。

2007-07-11

めいろさくせーぷろぐらむつくってみたー

http://anond.hatelabo.jp/20070711013155

人待ちの間暇だったから作ってみたよー。

さっくり作ったから無駄が多い気がするけど、とりあえず動いた。

全体が埋まったかどうかの判定をしないでひたすらまわしまくってるし、なんか綺麗な形じゃないけど、とりあえず投稿しちゃうよ!

これ綺麗な形にするの結構難しいんじゃないかな。面白いね。

class Maze
	class Box
		WALL = 0
		LOAD = 1
		def initialize(state = LOAD)
			@state = state
		end
		def is_wall?
			return true if @state == WALL
			false
		end
		def is_load?
			return true if @state == LOAD
			false
		end
		def set_wall
			@state = WALL
		end
		def set_load
			@state = LOAD
		end
	end
	TOP = 10
	RIGHT = 11
	BOTTOM = 12
	LEFT = 13
	def initialize(height = 100, width = 60)
		@height = height
		@width  = width
		@data = Array.new
		self.fillbox
		@counter = 1000
		@root = Array.new
	end
	def choose_random
		return rand(@width-3)+1, rand(@height-3)+1
	end
	def choose_direct
		t = rand(4)+10
		return t
	end
	def move(x, y, t)
		new_x = x
		new_y = y
		case t
		when TOP
			new_y -= 1
		when RIGHT
			new_x += 1
		when BOTTOM
			new_y += 1
		when LEFT
			new_x -= 1
		end
		return new_x, new_y
	end
	def make_load?(x, y)
		return false if x < 0 or y < 0 or x > @width-1 or y > @height-1
		return false if @data[x][y].is_load?
		true
	end
	def dead_end?(x, y, t)
		case t
		when TOP
			if make_load?(x-1, y) and \
				 make_load?(x-1, y-1) and\
				 make_load?(x, y-1) and\
				 make_load?(x+1, y-1) and\
				 make_load?(x+1, y) then
				 return false
			end
		when RIGHT
			if make_load?(x, y-1) and \
				 make_load?(x+1, y-1) and\
				 make_load?(x+1, y) and\
				 make_load?(x+1, y+1) and\
				 make_load?(x, y+1) then
				 return false
			end
		when BOTTOM
			if make_load?(x-1, y) and \
				 make_load?(x-1, y+1) and\
				 make_load?(x, y+1) and\
				 make_load?(x+1, y+1) and\
				 make_load?(x+1, y) then
				 return false
			end
		when LEFT
			if make_load?(x, y+1) and \
				 make_load?(x-1, y+1) and\
				 make_load?(x-1, y) and\
				 make_load?(x-1, y-1) and\
				 make_load?(x, y-1) then
				 return false
			end
		end
		true
	end
	def check_all?(stack)
		for i in TOP..LEFT do
			return false if !stack.include?(i)
		end
		true
	end
	def extend(x, y)
		@data[x][y].set_load
		check_stack = Array.new
		loop do
			t = choose_direct
			check_stack << t
			new_x, new_y = move(x, y, t)
			if enable_new_point?(new_x, new_y)
				if !dead_end?(new_x, new_y, t) then
					@root << ["ex", new_x, new_y, t]
					extend(new_x, new_y)
					break
				end
			end
			break if check_all?(check_stack)
		end
	end
	def enable_new_point?(x, y)
		return false if x<=0 or y <= 0 or x > @width-1 or y > @height-1
		return false if @data[x][y].is_load?
		true
	end
	def _make
		x = y = 0
		loop do
			x, y = choose_random
			break if @data[x][y].is_load?
		end
		@root << [x,y]
		extend(x, y)
	end
	def make_goal
		x = @width - 2
		y = @height - 1
		for i in 1..@width-3
			if @data[x-i][y-1].is_load? then
				@data[x-i][y].set_load
				break
			end
		end
	end
	def make_start
		for i in 1..@width-3
			if @data[i][1].is_load? then
				@data[i][0].set_load
				break
			end
		end
	end
	def make
		self.fill_all
		x, y = choose_random
		@root << [x,y]
		@data[x][y].set_load
		extend(x,y)
		while(!is_fill?) do
			_make
		end
		make_goal
		make_start
		self
	end
	def is_fill?
		@counter -= 1
		return true if @counter < 0
		false
	end
	def fillbox
		for i in 0...@width do
			@data[i] = Array.new
			for j in 0...@height do
				@data[i][j] = Box.new
			end
		end
	end
	def fill_all
		for i in 0...@width do
			for j in 0...@height do
				@data[i][j].set_wall
			end
		end
	end
	def output
		for i in 0...@height do
			for j in 0...@width do
				if @data[j][i].is_wall? then
					print "#" 
				else
					print " "
				end
			end
			print "\n"
		end
	end
end

Maze.new(30, 30).make.output

## output

# ############################
#  ##    # #     ##    #     #
##    ##   ## ## #  ##   ### #
### #  ###  #  #   #### ###  #
#   # ## ## ## ### #  #  #  ##
### #  #  #  #   #### ## # ###
##  ## ## ## ###   #  ## #   #
#  ### #  #   #### # ##  ## ##
# ## #   ####    #    # ###  #
#  # ###  # #### # ## # #   ##
##     ## #      #  ### ######
######  ### #######   ###    #
#    ##   ###   # # #   ## # #
# #######  #  # # # ###  ### #
#   # # ##   ##   #   ##   # #
### #    ######## ########   #
#   # ## ##     #    #     ###
# ### ##  ## ##   ##   ##### #
#      ##  # #  #  ###  #    #
# ######## # #####   ## # # ##
#       ## #  #  #####  # #  #
####### #  ## # ## #   ## ## #
##    ### ###   ##   ####### #
#  ##  ##   ## ##  ###    ## #
# ####  ###  # #  ## # ##    #
#  # ##   ## # # ###    ######
## #  # #  # # #   ## #    ###
#    ## ## #   # #  # # ##  ##
# # ##  ##   # # ##   #  ##  #
########################### ##

2007-07-01

[] 増田Readerのデザイン(案)

左ペインには再読込するたびにに更新される目次(カテゴリーに基づく、括弧内は記事数)
↓         カテゴリーソートされた記事が表示される右ペイン
abc(640)| ■Title
bcd(512)| 
cde(256)|
def(128)|
efg(064)|                   | トラックバック(0) | **:**
fgh(032)|
    | ■Title
    |
    |
    |                   | トラックバック(0) | **:**

2007-06-12

増田Readerデザインイメージ

左ペインには再読込するたびにに更新される目次(カテゴリーに基づく、括弧内は記事数)

↓         カテゴリーソートされた記事が表示される右ペイン

abc(640)| ■Title

bcd(512)| 

cde(256)|

def(128)|

efg(064)|                   | トラックバック(0) | **:**

fgh(032)|

     | ■Title

     |

     |

     |                   | トラックバック(0) | **:**

2007-05-11

http://anond.hatelabo.jp/20070511021557

剰余不可より100回ループ不可、てほうが制限としては面白いかもね。

まあそれは再帰するだけの話で

$arr = [nil,"Fizz","Buzz","FizzBuzz"]
def fzbz(i)
	f = ((i%3) == 0) ? 1 : 0
	f |= ((i%5) == 0) ? 2 : 0
	$arr[0]=i
	puts $arr[f]
	fzbz(i+1) if i<100
end

fzbz(1)

これを変形すると、条件判断&ループ禁止が書けるな。

$arr = [nil,"Fizz","Buzz","FizzBuzz"]
$f3 = [1,0,0]
$f5 = [2,0,0,0,0]
def fzbz(i)
	f = $f3[i%3]
	f |= $f5[i%5]
	$arr[0]=i
	puts $arr[f]
	([lambda{|i| fzbz(i+1)}, lambda{}])[i/100][i]
end

fzbz(1)

C言語でも関数ポインタで書けるので、Rubyの特権ではない。

2007-05-10

偽FizzBuzz問題

http://anond.hatelabo.jp/20070508170219

「%(剰余演算子)使用禁止」みたいな話があったので、逆に無駄馬鹿っぽいプログラムが出てくると、どれくらい間抜けな「剰余を求める関数」になるか見てみたい。

……いざ間抜けに作ろうとすると、それはそれで難しい。

#!ruby -Ks

# 3で割り切れるなら0を返す
# 割り切れないときは各桁の数を足した数字が返ってくるけど、再帰用だから気にしないでね><
def mod3_equal_zero(i)
  s = i.to_s
  num = 0
  s.split('').each {|c|
    num += c.to_i
  }
  if (num > 9) then
    num = mod3_equal_zero(num)
  end
  num=0 if num == 3 || num == 6 || num == 9
  num
end

# 5で割り切れるなら0を返す
def mod5_equal_zero(i)
  s =i.to_s
  i=0 if s[-1,1] == "0"
  i=0 if s[-1,1] == "5"
  i
end

# メイン
(1..100).each{|i|
  str =""
  str += "Fizz" if mod3_equal_zero(i) == 0
  str += "Buzz" if mod5_equal_zero(i) == 0
  str = i.to_s if (str == "") 
  print str,"\n"
}

2007-05-08

みんなアタマやわいね

想定していた回答はこんなの

def setr(a,k,str)
	a[k-1] = str if a[k-1]==nil && k<=100
end

res = Array.new(100)
(1..100).each{|i|
	setr(res,i   ,i.to_s)
	setr(res,i*3 ,"Fizz")
	setr(res,i*5 ,"Buzz")
	setr(res,i*15,"FizzBuzz")
}

print res.join("\n")

http://anond.hatelabo.jp/20070508173455 が気に入ったのでこなたあげます っ(=ω=.)

2007-02-08

一方Rubyは全てをオブジェクトにすることを選んだ

テンプレートなんて概念すらない

def add(x,y)

 x+y

end

p add(1,2) # => 3

p add("1","2") # => "12"

http://anond.hatelabo.jp/20070208115307

ログイン ユーザー登録
ようこそ ゲスト さん