院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

ruby

魔法陣

魔法陣を解く 順列をすべて作ってから、魔法陣を満たすかチェックしてる。 対称解、枝切りなどは何も行っていない。 単純な全探索。rejectって書いた覚えないなって思ったらselect notのことか。 フォーマッター使うと勝手に変換されるのか def magicSquare …

O(2^n)を全探索

各要素を選ぶか、選ばないかの問題を全探索で解く O(2^n)かかるが、とりあえずここまでをぱっと作れることが大切引数にiを使って、i番目の要素を選ぶことを表現する この書き方よく見るから覚えよう (個人的にはnを引数で渡して、マイナスしていきたいけど…

ナイト巡回問題

3×4の盤面でのナイト巡回問題 お気楽 OCaml プログラミング入門次のノードがわかる問題の全探索は ぱっとできるようになった気がする # 隣接リストバージョン $adjList = [ [5, 7], [6, 8], [3, 7], [2, 8, 10], [9, 11], [0, 6, 10], [1, 5, 11], [0, 2], […

最長増加部分列(LIS)

螺旋本読んでもLISがわかんなかった。 以下のページがとてもわかり易かった。 最長増加部分列・最長共通部分列 [いかたこのたこつぼ]誤解してたこと ・Lは昇順に並んでいるから、これが最長増加部分列になると思ってた。 ・そうじゃなく、異なる長さの増加部…

メモ化と動的計画法

# 素直にフィボナッチ def fib_normal(n) return 1 if n == 0 || n == 1 fib_normal(n - 1) + fib_normal(n - 2) end # メモ化 # 再帰の結果を配列に保存 # あくまで再利用がメイン $memo = [] def fib_memo(n) return $memo[n] = 1 if n == 0 || n == 1 ret…

ヒープソート

def build_heap(arr) (arr.length / 2 - 1).downto(0) do |i| sift_down(arr, i) end arr end def heap_sort(arr) build_heap(arr) result =[] (arr.length - 1).downto(0) do |i| arr[0], arr[i] = arr[i], arr[0] result.push(arr.pop) sift_down(arr, 0) …

ヒープの操作

配列で表現された2分ヒープに対しての操作 完全2分木は配列で表現できる def deleteMin_heap(arr) arr[0] = arr.pop # 最後尾をrootへ sift_down(arr, 0) end # i番目の要素を適切な位置まで下げていく def sift_down(arr, i) leftIdx = 2 * i + 1 rightIdx …

素数を求める

## エラトステネスのふるいを用いて素数を求める def getPrime(num) return [2] if num == 2 return [2, 3] if num == 3 rootPrime = getPrime(Math.sqrt(num).floor) eratosu(rootPrime, num) end ## エラトステネスのふるい ## rootPrime:numの平方根より…

順列、組み合わせ

数Aの確率と同じで、すべてを数え上げれば解ける。 数え上げの手段として順列、組み合わせがある。 だから、これらでコードをさらっと書けるようにすれば、ほとんどの問題は解けるはず。 その上で実行時間、スタックオーバーフローなどの問題が生じたら違う…

関数と参照渡し

関数: ・引数を渡すと戻り値を返すもの ・外部の変数から影響を受けない(引数が同じなら戻り値も同じ) ・外部の変数に影響を与えない(グローバル変数などを変更しない)これだとインスタンスや配列などのオブジェクトを更新(状態の変更)ができない そ…

参照渡しと値渡し

magazine.rubyist.net値渡し: 変数の値のコピーを渡す。 もとの変数とは関係ない。 関数の出力は引数のみに依存。 副作用がない関数が作れる。参照渡し: 変数のメモリ番地を渡す。 変更するともとの変数も変わる。 副作用が起こる。参照の値渡し: 変数の…

ruby 2次元配列の作り方

rubyでの2次元配列の作り方 注意しないと同じオブジェクトを参照しちゃう。 以下やり方 ary = Array.new(3).map{Array.new(3,0)}

プログラミング力をつける

もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問作者: 増井敏克出版社/メーカー: 翔泳社発売日: 2018/02/19メディア: 単行本(ソフトカバー)この商品を含むブログ (4件) を見るプログラミング力をつけるためにやってみる。 いきなり…

javascript、rubyでの競プロはバージョンに注意

就活でのwebプログラミングテストの対策としてAtCorderを使っていた時の話。・rubyはバージョンが2.3.3 配列のsumメソッドが実装されていない。・node.jsはバージョンが5.12 便利なメソッドはバージョン6から実装されてるからほとんど使えない。 就活でのweb…

pugは一度使ったら抜けられない

初めは気持ち悪いと思っていたpugだけど、一度使ったらpugなしじゃ生きていけなくなった。 タイプ量が少ない、読みやすい、修正しやすいrailsにはslimっていうpugとほぼ同じ文法のがある。 これ使うとeachとかがめっちゃきれいに書ける。 erbで頑張ってたの…

rails-apiを使う

フロントはvue.jsを使いたいからサーバはdbだけでいいやと思ったのでrails-apiを使ってみた。 クロスオリジンとか出てきていろいろ詰まった。 これだけでイイ、Rails5でAPIサーバを作るときのCORS設定 ここを参考にしたら動いた。とりあえず、これでいろいろ…

真偽値

rubyの真偽値 偽 - nil, falseのみ 真 - 偽以外javascriptの真偽値 偽 - null, false, undefined, 0, NaN, ""(空文字) 真 - 偽以外javascriptで下記のように書いたときの注意点 if (hoge) { ... } ・hoge=0もfalseになる ・hoge=""はfalseだが、hoge=[]とhog…

パーフェクトruby

流し読みした。 浅く広いリファレンスと言った感じ。 読みやすく、細かい知識もつきいい感じ。とは言え少し単調で飽きやすい。 プロを目指す人のためのほうが流れがあって読みやすい。深く知りたいなら 黒魔術ならメタプログラミング メソッドの辿り方ならベ…

rubyで数独 実装3

もう少し綺麗にできたから全体載せてリファクタリングは終了 class Sudoku def initialize @condition = Sudoku_condition.new @proc = 0 #debugで工程数を表示 end def solve(string) grid_new = make_grid(string) print_grid( solve_sub(grid_new) ) end …

rubyで数独 実装2

前回のやつのSudoku_conditionクラスを少しリファクタリング pをcur_cellにしたりほかも若干変えた class Sudoku_condition def initialize end def no_violation?(grid, cur_cell, v) row_any?(grid, cur_cell, v) && column_any?(grid, cur_cell, v) && sq…

rubyで数独 実装

前回のrubyで数独の本を参考に実装したもの。 自分が読みやすいように書き換えたり、クラスを導入したりした。 Sudoku_conditionクラスの中身は読むのすら面倒だったから本の内容そのまま。 ここ読むだけでもこの本のコードがどのくらい読みにくいかわかると…

rubyで数独

現在読んでいる最中参考にはなりそうなんだけど、コードが読みづらい ネストが無駄に深かったり、collect使ってたりが微妙に読みづらい 自分らしく書き換えながら読んでる他人のコードでもサラッと読めるようになりたいなー

rubyで人工無能

読みやすい文章とコードでとてもわかり易い。 この本は人工無能(chatbot)を題材として取り上げているが コードが美しい かつ cliで動くように書かれているから rubyでちょっとしたことを楽にしたいとか思ってる人にも参考になりそう。短いコードだけど委譲や…

ヒープソート

まず、失敗作を def heap(array,n) return if n<=0 parent = (n - 1) / 2 # 親の位置 if array[n] > array[parent] array[n], array[parent] = array[parent], array[n] end heap(array,parent) end def heap_sort(array,sorted) return sorted << array.shi…

ダックタイピング

オブジェクト指向設計実践ガイドを読む。 まだこれを読めるレベルまで到達できてないっぽいから読むの終わり。 ただ、ダックタイピングについての例が分かりやすかった。 # はじめの段階 class Trip attr_reader :bicycle, :customers, :vehicle def prepare…

2次元配列とeach

2次元配列とeachについて参考にしたリンク二次元配列は1回のeachで回せる - 【旧】PerlerのRuby日記->はてなブログに移行しました array = [[1,2], [3,4],[5,6]] array.each do |v1, v2| puts v1, v2 end 多次元配列の中身をeach_with_indexで展開する | Rub…

2次元配列をハッシュで整理

2次元配列でデータだけ与えられて、それをわかりやすく整理する方法 class Hoge def initialize(data) @data=[] data.each_with_index do |(v1, v2), i| @data[i] = {first: v1, second: v2} end end def print_data puts @data end end data=[[1,2],[3,4],[…

バブルソート

バブルソートも"後ろから前へ小さいもの"ではなく"前から後ろへ大きいもの"って考えたら ループの終了条件とかがだいぶわかりやすくなる気がする #バブルソート2 def bubble_sort(array) for k in 1...array.length for i in 0...array.length-k if array[i]…

クイックソート

クイックソートって両端から要素を調べて、入れ替えて..を繰り返すと思ってたけど pivotより大きいものと小さいもので分けちゃえばそんなことしなくて済むのか。 それに、こうした方が再帰の考えが使いやすい。 これなら実装できそう。 なっとくアルゴリズム…

upto,downtoの代替

Numericクラスにこんなメソッド追加したらどう class Numeric def to(num, &block) if self > num (num..self).reverse_each(&block) else (self..num).each(&block) end end end 5.to(8){|i| puts i} #=> 5,6,7,8 8.to(5){|i| puts i} #=> 8,7,6,5 #ちなみ…