Arantium Maestum

プログラミング、囲碁、読書の話題

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

Thinking Functionally with Haskell勉強メモ: 第4章問題3

Exercise J 以下のものの意味を考え、間違っているものを見つけよ: map f . take n = take n . map f リストの先頭からからn個の要素を取ってfを適用するのと、リストのすべての要素にfを適用してできた新しいリストの先頭からn個の要素を取るのは等しい。…

Effective C++勉強メモ: Item 23 Non-Member Non-Friend関数をNamespaceで管理しよう

前回の項目でカプセル化の重要性について書いてあったが、そのカプセル化を最大に実現するためには、内部実装に触れることのできる面積を最小化する必要がある。 つまり、メンバ関数、フレンド関数といった「クラス内部のデータメンバに直接アクセスできる関…

Thinking Functionally with Haskell勉強メモ: 第4章問題2

Exercise F data List a = Nil | Snoc (List a) a というリストの別定義があったとする。 headとlast関数を定義せよ: last :: List a -> a last (Snoc xs x) = x head :: List a -> a head (Snoc Nil x) = x head (Snoc xs x) = head xs toListとfromListを…

ClojureとQuilでClifford Attractor

昔のProcessing Advent Calendarをいろいろ漁っていたらこんな記事があった: qiita.com 上記の記事の冒頭の絵は で表されるアトラクターである。 以下の参考サイトにはもっと例が載っている。 Clifford Attractors まさにClojureのiterate関数の使いどころ…

Effective C++勉強メモ: Item 22 データメンバは黙って`private`

クラス内のデータはpublicでもprotectedでもなくprivateにしよう。という話。 ポイントは三つ 構文の統一 データアクセスレベルのコントロール カプセル化 構文の統一 オブジェクトのAPIはすべて関数(か演算子)になり、a.somethingだったかa.something()だ…

ClojureとQuilでいろいろ降らせてみた

前回の元記事の作者の方がこのような記事をQiitaに挙げていた: qiita.com 前回のコードは基本的に形を座標リストとして表してしまえばあとは同じ関数でデータ作成・描画・アップデートができるので、とりあえずいろいろ降らせてみた。 Quil -L7gXIMMKuYC2kS…

ClojureとQuilで桜を吹雪かせてみた

こういう記事を読んだ: blog.livedoor.jp とても面白そうだったのでひさしぶりにQuilで再現して遊んでみよう、と思ったら意外と色々忘れていてえらく時間がかかった。 とりあえず結果: Quil -L7dtRVx3FipAGAAMkGE Runボタンクリックで桜吹雪が見えるはず。…

Effective C++勉強メモ: Item 21 Pass-by-存在しないオブジェクトへのReferenceしてはいけない・・・

前回の項目を理解するとなんでもPass-by-Referenceしたくなるが、ReferenceはそもそもちゃんとReferenceを返した先でも存在し続けるオブジェクトのものでなければならず、その条件が満たせないことも多い。という項目。 例えばAクラスにoperator*を定義して…

Thinking Functionally with Haskell勉強メモ: 第4章問題1

Exercise A null :: [a] -> Bool null [] = True null _ = False という定義を null = (==[]) と変えても大丈夫か?という問題。 実際使ってみると大丈夫そうなのだが: Prelude> null = (==[]) Prelude> null [] True Prelude> null [1] False Prelude> nul…

本日のvim道 2018.3.14

vim

今日はウィンドウの分割関連。知ってるといえば知ってるけど指に染み込んでないコマンド群。未だにtmuxの画面分割とどっちを使うべきか悩むが・・・ C-w [sv]でウィンドウをパネル分割 とりあえずウィンドウ分割関連はC-wで始まる。 C-w sで上下に(横長に)…

Thinking Functionally with Haskell勉強メモ: 第4章3 zipWithとmerge sortの実装

zipWith ふたつのリストから一要素ずつ取って関数を適用するzipWith関数: zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys zipWith f _ _ = [] この定義はちょっと面白い。再帰を書く場合、いつも停止条…

Effective C++勉強メモ: Item 20 Pass-by-Const-Reference

Pass-by-valueとpass-by-const-referenceのどちらか迷った時は大抵pass-by-const-referenceを選ぼう、という項目。 void printName(MyObj o) { std::cout << o.name(); } void printName(const MyObj& o) { std::cout << o.name(); } 前者がpass-by-value、…

Thinking Functionally with Haskell勉強メモ: 第4章2 concat/map/filter、functorと自然変換、同一性の証明

リストに対する処理の性質・法則、Functorに対するの一般化、性質の証明法についてメモ: まずはconcat、map、filterの定義: concat :: [[a]] -> [a] concat [] = [] concat (xs:xss) = xs ++ concat xss map :: (a -> b) -> [a] -> [b] map _ [] = [] map …

Effective C++勉強メモ: Item 19 クラス・デザインは型デザイン

新しいクラスを宣言・定義するのは、C++の型システムの拡張に他ならず、型デザインなので本来簡単なことではない。という項目。 以下のことに気をつけるべき: 新しい型のオブジェクトの生成・破棄方法 初期化と代入の関係 Pass-by-valueの意味 型の性質上取…

Thinking Functionally with Haskell勉強メモ: 第4章1: List Comprehensionの定義

Haskellでは Prelude> [1..5] [1,2,3,4,5] Prelude> [(+1) x | x <- [1..5]] [2,3,4,5,6] のように[a..b]と[f x | x <- xs]といった簡単にリストを作成できる記法がサポートされている。 後者は特に便利で Prelude> [x*y | x <- [1..10], x `mod` 2 == 0, y …

Thinking Functionally with Haskell勉強メモ: 第3章続続 integer/floatとInteger/Float

3.149 :: Fractional a => a This type and the earlier type Num a => a for 42 explains why we can form a legitimate expression such as 42 + 3.149, adding an integer to a floating-point number. Both types are members of the Num class and all …

Effective C++勉強メモ: Item 18 間違った使い方をしにくいインタフェース

リソース管理の部分は少し後回しで、項目をいくつか飛ばして18番目。 いいインタフェースとは、という項目で大きく分けて: 引数をClass/Struct化 インタフェースは統一しよう 戻り値にスマートポインタを使おう 上記三点の話題が挙がっている。 引数をClass…

本日のvim道 2018.3.11

vim

Visual modeでo 三種のVisual modeのどれにいる場合でも、oを打つと今いるのと反対側の選択範囲の端を変更することができる。選択範囲の開始地点が間違っていたからと一々Visual modeを切って初めから選択する必要がなくなる。 Normal modeで[dycv][ia][wspbB

ナップサック問題

蟻本から: 重さと価値が, の物体n個から、重さの総和がWを超えない部分集合の最大の価値を求める。 解法としてはメモ化か: def solve(vs, ws, W): def max_v(i, max_w, memo = {}): if i >= len(vs): return 0 if (i, w) in memo: return memo[i, max_w] i…

Fence Repair問題

POJ/蟻本から 3253 -- Fence Repair 蟻本の解説がすごく面白かった。 板を切ることを二分木の枝分かれと考えて、最終的に切られた板一片にかかったコストは板の長さX二分木における深さ。 そう考えると、長さが短い板ほど深くするのが正しいことがわかる。の…

Best Cow Line問題

POJ/蟻本から: 3617 -- Best Cow Line ある文字列の左右どちらかの端から文字を1個ずつ取って、lexical orderが最小になる文字列を作成する、という問題。 最初は舐めていたのだが、bacbなどを正しく処理するためには先読みが必要になる。 しかしbbbbbacbbb…

区間スケジューリング問題

蟻本から。 n個の作業がある。 各作業は開始時と終了時が決まっており、同時に二つの作業をすることはできない。 作業をどう選べば、完了した作業数を最大化できるか。 かなり有名な貪欲法の問題。ポイントは、開始時や長さではなく、終了時を基準に選んでい…

Effective C++勉強メモ: Item 12 Copyメンバ関数を自分で書く場合は気をつける

オブジェクトのコピー関連のメンバ関数は(C++11より前の場合)Copy ConstructorとCopy Assignmentの二つ。(C++11以降はMove関連のものも・・・) これらはコンストラクタとデストラクタと合わせて、コンパイラがデフォルトで書いてくれる、という話は以前の…

Thinking Functionally with Haskell: 第2章再読 TypeとType Classメモ

Type関連で混乱してきたので、ちょっと一旦第2章に戻ってメモをまとめていく。 "In Haskell every well-formed expression has, by definition, a well-formed type. Each well-formed expression has, by definition, a value." まず、式には型と値がある…

本日のvim道 2018.3.9

vim

vim力向上の一環で「これ使ってなかったけど、意識的に使っていきたいな」と思ったコマンドをちょこちょこメモっておこうと思う。 Normal modeでf{char}とt{char} 今いる行の次の{char}の位置、あるいはその前の位置まで飛ぶ。;を押すとその次の{char}まで飛…

Effective C++勉強メモ: Item 11 自己への代入に気をつけよう

例えばBオブジェクトがprivateデータメンバとしてAオブジェクトへのポインタを保持しているとする: class A {}; class B { private: A* pa; public: B& operator=(const B& rhs) { delete pa; pa = new A(*rhs.pa); return *this; } }; 上記のようなoperato…

Effective C++勉強メモ: Item 10 Assignmentの戻り値

operator=は*thisを返すようにしよう、という話。 x = y = z = 15という構文が可能なのは、右から評価されていくoperator=が左辺のオブジェクトを返しているから。 ただの慣習だが、よっぽどの理由がない限り従うべき慣習である。 個人的にも異論はない。

Thinking Functionally with Haskell勉強メモ: 第3章続 Type? Type Class?

Thinking Functionally with Haskellに”all numbers are instances of the type class Num”とあるが、”all number types are instances of the type class Num”の間違い?— zehnpaard (@zehnpaard) 2018年3月8日 というわけで第3章を読み返していて腑に落ち…

Effective C++勉強メモ: Item 9 virtual関数をコンストラクタ・デストラクタから呼ぶな

C++のコンストラクタは、まず最下層のベースクラスのものが呼び出されて、順次初期化されていって最終的に実際に作成されるオブジェクトのコンストラクタの処理が走る、という流れになる。 class A { public: A(); virtual void init(); }; A::A() { init();…

迷路の最短路問題

蟻本から。 スタート、ゴール、壁、通路が'S', 'G', '#', '.'で表されている二次元配列の地図で、スタートからゴールまでの最短経路(必ず存在する)の長さを返す。 ざ・BFS。 import itertools as it def solve(map_): def neighbors(i,j): dirs = ((i+i1, …