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

備忘としてのメモを記載

ocaml

深さ優先探索っぽい順列

reasonMlによる順列 まぁまぁきれいにできた気がする。 終了条件と次のノードのとこをいじればいろいろできるよう抽象化できた。 let permu = (count, lst) => { let isFinished = acc => List.length(acc) == count; let getNextNode = (cur, l) => List.fi…

抽象度が低いほうがわかりやすい(reduce)

それぞれの要素に対してした処理をまとめるにはreduceが良いと前書いたけど mapとconcatでも書ける場合はこっちのほうがよい。抽象度が低いから理解しやすい。 reduceは何でも出来ちゃうからイメージしづらい。追記 jsとocamlでconcatの意味が違かった ocaml…

カリー化

カリー化とは 「引数を複数受け取る関数」を「引数を段階的に受け取る関数」に分解する let add = (n, m) => { return n + m } let addCurry = n => { return m => { return n + m } } //呼び出し方 add(3,4) addCurry(3)(4) これだけだとあんまり利点を感じ…

mapとreduce

抽象度 reduce > mapどう使い分ける map 配列の各要素に関数を当てた配列を返すとき 注目するのはその要素に何をするかだけ (map_sqrt : list(int) => list(int), map_mod2 : list(int) => list(bool) )reduce 1,配列をなにかに変換するとき (sum : list(i…

99 problemについて

途中からだいぶ数学チックになってきた。 ちょっと飛ばそう。 あとコードが汚い気がする。 Q31,素数か判定する関数の答え let is_prime = n => { let n = abs(n); let rec is_not_divisor = d => d * d > n || n mod d != 0 && is_not_divisor(d + 1); n != …

99 problems Q14,15,18

# duplicate ["a";"b";"c";"c";"d"];; - : string list = ["a"; "a"; "b"; "b"; "c"; "c"; "c"; "c"; "d"; "d"] これはそのままhdを2回追加すれば良いだけだから簡単。 ただこれの回数が可変になると一気に変わる。 # replicate ["a";"b";"c"] 3;; - : strin…

RWO 中断

全体をさらっと見てみて求めていたものと違う気がする。 ocamlの仕様を知って何かを作りたいわけではないから、詳細いらないや。 あとツールを作るところも別に魅力を感じなかった。ということでRWOは中断し99 probolemsを解く。

Real World OCaml を読み始める

Prologueを読んだ。 気が向いたら少しずつ読んでこう。ocamlを学ぶと他の言語を使っていても役に立つ考え方が身につくよ。 part1はocamlの基礎 part2はコマンドラインツールから非同期通信まで便利なツールを作るよ part3はコンパイラのシステムを説明するよ…

aux関数 少しまとめ

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

ナイト巡回問題

お気楽 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…

プログラミング略語

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) */ /* 先頭の要素同士を比較して、小さい方を前に…

reduceって思ったより有能?

reuceの仕組みを理解したら予想以上に便利な関数な気がしてきた。mapやfilterもreduceでかけるよね。 書いてみよう。

ocaml入門

ocaml入門の中で評価が高かったらパラっと見てみた。 うーん、あんまし面白くないなー。 これがocamlの1冊目の本だったら学びたいとは思わないなー。パラっと見ただけなのでもう少ししっかり呼んでから感想書こう。

reasonと戯れる2

ひたすらreasonで練習問題を解く。 思ったよりも時間がかかるが楽しい。今月中に終わらせたい。

reasonと戯れる

let rec insert = (lst: list(int), n: int): list(int) => switch (lst) { | [] => [n] | [first, ...rest] => switch (first < n) { | true => [first, ...insert(rest, n)] | false => [n,...lst] }; }; let rec insSort = (lst: list(int)): list(int) =…

ocamlにはreturnがない

ocamlにもreasonにもreturnがない 最後に評価したのがそのまま帰る rubyと一緒

reasonというプログラミング言語

ocamlって面白いなー javascriptに若干似てるなー とか思ってたらocamlをjavascriptっぽくかけるreasonって言語があることを知った。ocamlの考え方のままjavascriptと同じようにかけるからいいと思う。 いくつか例 ocamlだと let add1 = func x -> x+1 {name…