はてなキーワード: defとは
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になるのは何故?
http://anond.hatelabo.jp/20070924220240
最初の頃は単なる知識を得る作業だから仕方ない。つまらないが、最初に知識をかき集めるその方法が一番効率がいいから、テキストはそういう構成になっている。面白いのは、手元に材料が一通り揃ってから、「この課題を解決せよ、手段は問わない」という類の問題が出される段階になった時。
2chのプログラミング板の宿題スレに一時期住んでたんだけど、一番面白いと思った課題は「迷路を解くプログラムを作れ。実装方法はいっさい問わない。速いプログラムほど良いとする」というもの。「迷路は壁=1、通路=0みたいなテキストデータで与えられ、入り口と出口は壁に隣接…」みたいな仕様だけは与えられたが、それ以外何もなし。
解決方法を考えるのは楽しいし、自分にできない事をやってくれるプログラムというのはコンピュータが自分で考えているみたいで妙に愛着が湧く。
プログラムにやらせたい作業が見つからない、というのは多分想像力の欠如でもなんでもなく誰もが通る道。実際、日常生活でそんな機会はなかなか無い。
自分の場合、Perlでwebサイト関連ツールを作るところから始めたかな。フォームに入力した内容が追加されていくだけの簡単な日記帳とか、後はカウンターとか、そんなものをチマチマ作る事から始めた。ほとんどはもう使ってないが、タブ区切りテキストデータをhtmlのtableに直すスクリプトは地味に今でもしょっちゅう使う。
2chのdatを読み込ませて書き込み数の遷移を出すプログラム(http://www.tv2ch.info/?3 みたいなの)も、時間辺りの書き込み数データをテキストで書き出すところまで作ったな(Excelにコピペしてグラフツールを使えばこのサイトのようなグラフが書ける所まで)。テキスト周りの処理が出来るならば簡単に書ける。
あとは、Ragnarok Onlineで時間辺りダメージを最大にするためにはどのようにステータスを成長させれば良いかの算出をプログラムにやらせたりもした。あり得るステ振り全てに対し総当り探索。(分かる人だけに注釈を入れると職業はハンターで、算出値は鷹ダメージ込み。敵のdefに応じてダメージが変わってくるんで複数パターン出した)
ネトゲだと、某ゲームでアイテムの相場を入力すると、儲かりそうな生産レシピを出力してくれるプログラムも書いた。書いたが、打ち込むべきデータを集めるのが面倒すぎて使用は断念した。
総当りで思い出したが、HTMLで色見本を書き出すプログラムも書いた。http://www.tohoho-web.com/wwwcolor.htm の216色見本みたいなのをプログラムで生成させた。
教科書でやった課題は、ソートプログラムくらいかな。アルゴリズムの流れだけ理解したら、教科書を閉じてそのアルゴリズムを自力で実装する。写経は面倒でやれなかった。
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 # ############################ # ## # # ## # # ## ## ## ## # ## ### # ### # ### # # #### ### # # # ## ## ## ### # # # ## ### # # # # #### ## # ### ## ## ## ## ### # ## # # # ### # # #### # ## ## ## # ## # #### # # ### # # # ### # #### # ## # # ## ## ## # # ### ###### ###### ### ####### ### # # ## ### # # # ## # # # ####### # # # # ### ### # # # # ## ## # ## # # ### # ######## ######## # # # ## ## # # ### # ### ## ## ## ## ##### # # ## # # # ### # # # ######## # ##### ## # # ## # ## # # ##### # # # ####### # ## # ## # ## ## # ## ### ### ## ####### # # ## ## ## ## ### ## # # #### ### # # ## # ## # # # ## ## # # ### ###### ## # # # # # # ## # ### # ## ## # # # # # ## ## # # ## ## # # ## # ## # ########################### ##
剰余不可より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)
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" }
想定していた回答はこんなの
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 が気に入ったのでこなたあげます っ(=ω=.)