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

備忘としてのメモを記載

2018-09-01から1ヶ月間の記事一覧

aux関数 少しまとめ

前からの結果が必要(回数を数えるcount, 経路を覚えとくpathList) ー> 補助関数を使う ー> countなどを引数として渡す(引数の意味はコメントに書いておくこと) 結果が複数あるもの ー> 結果が出たらaccに詰めて、引数として渡す ー> 最後にaccを返せば出…

reduceでいろいろつくる

reduceにもなれてきたからjavascriptの配列のメソッドをreduceで書いてみた let isDivided2 = el => { return el % 2 == 0 } let square = el => { return el * el } // every arr1.every(isDivided2) arr1.reduce((acc, cur) => (isDivided2(cur) ? acc : f…

ナイト巡回問題

お気楽 OCaml プログラミング入門ナイト巡回問題を解く。 ナイトの動けるマスをリストとして作っちゃえば深さ優先探索でできる。 だからこの前のやつの終了条件を少しいじればおk /* 3行4列盤 */ let adjacent = [ [5, 7], [6, 8], [3, 7], [2, 8, 10], [9…

魔法陣

お気楽 OCaml プログラミング入門魔法陣を解く。 魔法陣ではマスが9つで異なる数字を入れていく。 よって全パターンは9! これをフィルターで削っていく。この方針でやったところ9!を求めるとスタックオーバーフローが起こってしまった。 8!だと起こらなか…

パターンマッチングとreduce

listを受け取ったときの定石2つ 1,パターンマッチング 先頭のみで処理が完結するとき2,reduce(fold_left) 先頭以外の要素にも同様の処理をする必要があるとき図にしてみると、このreduceの使い方はパターンマッチングを複雑にしただけだね 先頭だけで済む「…

nを指定できる順列

let permutation = (num, lst) => { let rm = (n, l) => List.filter(el => n != el, l); let rec aux = (num, lst, acc) => switch (num) { | 0 => [List.rev(acc)] | _ => lst |> List.fold_left( (acc2, el) => acc2 @ aux(num - 1, rm(el, lst), [el, ..…

深さ優先探索 改良

意味がわかりやすいように若干改良 let depth_first_search = (start, goal) => { /* auxは 通ってきた道のり:list(int) と 現在地:int を受け取る */ let rec aux = (curPos, pathList) => switch (curPos == goal) { | true => [List.rev([curPos, ...path…

深さ優先探索

お気楽 OCaml プログラミング入門 let adjacent = [ [1, 2], /* A */ [0, 2, 3], /* B */ [0, 1, 4], /* C */ [1, 4, 5], /* D */ [2, 3, 6], /* E */ [3], /* F */ [1] /* G */ ]; let depth_first_search = (start, goal) => { let rec aux = pathList => …

パイプライン演算子

ocamlにはパイプライン演算子があって、これを使うとメソッドぽく扱える let test = [1, 2, 3, 4] |> List.map(x => x * 2) /* [2,4,6,8] */ |> List.filter(x => x mod 3 == 0); /* [6] */ let ( |> ) x f = f x ocaml的にはこういうことらしい。 これもカ…

ReasonMl 次の目標

バックトラック法を使っていろいろやる 99 problemsを解いてみる

8クイーン問題 できた!!

やっと8クイーン問題ができた(たぶん) /* lstの要素すべてがfを満たせばtrue */ /* isSafeでクイーンチェックに使用 */ let rec all = (f, lst) => switch (lst) { | [] => true | [_, ...rest] => f(lst) == true ? all(f, rest) : false }; /* リストを…

8queen問題

追記2 el = [1,2,3,4,5,6,7,8] だとして 今の値±(リストのidxの差)だと斜めにいるとみなせるから これをコードにしたらできそう追記2終わり追記 だめだ よく理解してないからできないのだろう 他のサイトを参考に実装しよう 追記終わり お気楽 OCaml プログ…

nCr コンビネーション

nCr = n-1Cr-1 + n-1Crn人からr人を選ぶ = hさんを選び、残りのn-1人からr-1人を選ぶ => n-1Cr-1 + hさんを選ばないで、残りのn-1人からr人を選ぶ => n-1Cr let add_to_each = (num, lst) => List.map(el => [num, ...el], lst); let rec combination = (r…

javascriptに宇宙船演算子がほしい

宇宙船演算子とは こんなやつ大小の比較が楽にできる。 これがあればjavascriptのsortのcompareとかが楽にかける。 reasonmlのパターンマッチングとも相性抜群だと思うんだけどなー。 javascriptにも導入されてほしいなー。

プログラミング略語

ocamlを使っていて出てきた略語のまとめ。aux 原語 :auxiliary 意味 :補助 使い方:補助関数の名前acc 原語:accumulator 意味:蓄積 使い方:再帰関数で引数として次に情報を渡すとき、rest_resultとかと同義、reduceのpreはこれhd 原語:head 意味:先頭…

順列 reasonml

let add_to_each = (num, lst) => List.map(el => [num, ...el], lst); let rm = (x, l) => List.filter((!=)(x), l); /* 目的:与えられたリストの順列を求める */ /* permutations2: list(int) => list(list(int)) */ let rec permutations2 = lst => swit…

順列

順列をocamlで実装しようとしてる。 紙にかけば求められるし、考え方(アルゴリズム)はわかるはずなのにコードにできない。考えをコードにできるぐらいまではできるようになりたい。

マージソート

ReasonMlによるマージソートの実装。 今まではよくわかんなかったけど、マージソートの意味がやっとわかった。 /* 目的:2つのリストを受け取ってくっつける */ /* merge: list(`a) => list(`a) => list(`a) */ /* 先頭の要素同士を比較して、小さい方を前に…

再帰

再帰には先頭再帰と末尾再帰がある。先頭再帰は最後まで呼び出してから帰ってくる。 シンプルでデータの流れがわかりやすい。末尾再帰は後ろを呼び出ながらデータを渡す。 データを引数として渡すから少し複雑になる。 でも、スタックオーバーフローが起こら…