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

備忘としてのメモを記載

2018-01-01から1年間の記事一覧

インデントにこだわってみる

今までインデントはデフォルトのままスペース2つを使っていた。 たまたまスペース4つのコードと触れる機会がありそっちになれるとスペース4つのほうが読みやすい気がしてきた。ということでスペース4つに変更してみる。あとスペース4つだと横に長くなるから1…

プログラミングができるとは

プログラミングってすごいスキルが必要なのかと思ってたけどそうじゃないのかも。 問題を適切な要素に分解して、こんがらがらずにできれば大概のものは作れるかも。 (フロントエンドの話です)となると作り始める前に全体像を把握するのがとても大切な気が…

rails-apiを使う

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

javascriptのpushの戻り値に注意

javascriptでuniqメソッドを実装してみようしたら動かなかった let uniq = arr => { return arr.reduce((acc, cur) => { return acc.includes(cur) ? acc : acc.push() }, []) } 理由:pushの戻り値は新しい配列ではなく、その配列の長さだから let arr = ['…

カリー化

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

javascriptを使って関数型プログラミングを学ぶ

半分ぐらい読んだ。 序盤のラムダ計算から関数型プログラミングを説明するところはとても良い。 ただ、中盤ではjavascriptに無理やりパターンマッチングを導入し説明している。 ここのせいでコードが読みづらいし、直感的にわかりにくくなってる。「javascri…

プログラミング英単語3

predicate 意味:述語日本語の述語には2つ意味がある 1つ目は主語と述語。動詞とほぼ同義。 2つ目は数学用語の述語。 こっちの意味は 変数 x の値を定めることで真偽を判定することができる主張を 『 述語 』 という。 命題論理と述語論理プログラミングに…

mapとreduce

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

再帰の使い方まとめ

1,漸化式を表現する // f(n)をf(n-1)を使って表せたら再帰関数は作れる // a(0) = 3 // a(n) = 2 * a(n-1) -1 let rec a = n => switch (n) { | 0 => 3 | _ => 2 * a(n - 1) - 1 }; // 1からnまでの総和 // sum(0) = 0 // sum(n) = n + sum(n-1) // 素数判定…

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 != …

プログラミング英単語

extract 抜き出す、取り出すextract(n, lst) lstからn番目だけ抜き出す 例) extract(3, ["a","b","c","d","e"]) = ("c", ["a","b","d","e"])

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を返せば出…

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…