エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

C++

覚書 join.h

#ifndef __JOIN_H__ #define __JOIN_H__ #include <sstream> #include <iterator> template<class Iterator> std::string join(Iterator begin, Iterator end) { std::ostringstream io; for(Iterator i = begin; i != end; ++i) { io << *i; } return io.str(); } template<class Iterator, class Sep> std::string join(I…</class></class></iterator></sstream>

C++のクラスをNIFでElixirにバインドしてみた

C++ のライブラリを Elixir から利用したくなりました。 NIF を使った単純な関数の呼び出しは実装したことがあるのですが、オブジェクトを利用するようなケースは試したことがなかったので、今回調べてみました。 NIF環境の用意 elixir_make counter_nif Mak…

C++ による NIF ことはじめ

使い慣れている言語が C++ なので、ここでは C++ で説明しますが基本的に C 言語でも同じように記述できるはずです。 というか、世の中の NIF の説明は圧倒的に C 言語が多い。 詳細の解説は置いておいて。コードを書いてから呼び出せるところまでを順にたど…

標準入力、標準出力、標準エラーをコードでリダイレクトする

C++

cstdio と iostream が混ざっているのが少々座りが悪いのですが。iostream からファイルディスクリプタを取得できればよいのですが仕様上は仕組みが用意されていないようなので、cstdio を利用しています。 #ifndef REDIRECT_H__ #define REDIRECT_H__ #incl…

C++で整数値を返したり文字列を返したりする

#include <string> #include <iostream> template<int N, bool is_string> struct this_is_a_int_or_string; template<int N> struct this_is_a_int_or_string<N, false> { typedef int value_type; static const value_type value = N; }; template<int N> struct this_is_a_int_or_string<N, true> { typedef std::string…</n,></int></n,></int></int></iostream></string>

Fiddle を掻き鳴らしてみる

library fiddle (Ruby 2.3.0) *.dllや*.soなど、ダイナミックリンクライブラリを扱うためのライブラリです。 Ruby は痒い所に手が届く便利な言語だと知ってはいましたが、こんなに便利になっているとは思いませんでした。と、いうわけで。 Fibonacci Number …

libRSVG と Cairo を使って SVG から PDF を生成しためも

それぞれのサイト。 Projects/LibRsvg - GNOME Wiki! cairographics.org 今回参照したドキュメント。 Cairo: A Vector Graphics Library: cairo_t Cairo: A Vector Graphics Library: PDF Surfaces RsvgHandle: RSVG Libary Reference Manual Error Reportin…

QRコードを生成したときのめも

QRencode で QR コードを生成し、Magick++(ImageMagick の C++ API)で画像ファイルに保存してみた、ときのめも。 QRencode: Main Page Magick++, C++ API @ ImageMagick この二つのライブラリは、Mac の場合、 Homebrew でインストールできます。 ソースコ…

かっこで括られたトークンを取り出す

これ とか これ の入力になっている (A)(BC)(DEF)のような文字列から括弧の中にある文字列を取り出したい、というのが動機。 まわせ! Bouwkamp!! 横へな2016.2.6 問題 ESM オフラインリアルタイムどう書く 拡大版 · GitHub Ruby def tokenize(s, left, right…

diff を清書する、加えて gem にする

気がつけば。diff を実装してから7年も経っていました。 diffをつくる(3) -後編 - エンジニアのソフトウェア的愛情 案の定、考え方がかなり頭から抜けて行ってしまっているのですが、当時 diff について詳しい記事を書かれていた方がいらっしゃって、加えて…

駒の移動できる位置をビット演算で求める

C++

King's Vallery というゲームがあります。 キングスバレー「King's Valley」公式ページ これの駒の移動できる位置をビット演算で求めてみようと思います。細かくは、一手目は家臣駒を動かさないといけないとか、家臣駒は King's Vallery に入れないとかあり…

修練がてら DFA をいろんな言語で書いてみた

アンダースタンディング コンピュテーションを読んでいます。アンダースタンディング コンピュテーション ―単純な機械から不可能なプログラムまで作者: Tom Stuart,笹田耕一,笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディア: 大型本…

型システム入門

型システム入門 −プログラミング言語と型の理論−作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男出版社/メーカー: オーム社発売日: 2013/03/26メディア: 単行本(ソフトカバー) クリック: 68回この商…

いかにして表計算の列名をつくるか・補遺

先日Rubyで書いたものをRuby以外のメジャーどころの言語でも実装してみます。 桁上がりで1文字戻す Ruby 再掲。 def column_names(n) result = '' begin result = (n % 26 + 65).chr + result n = n / 26 - 1 end while n >= 0 result end C++ #include <string> st</string>…

Lispを作ってみる、ただしC++テンプレートで

なんか、こじらせた。 これだけではLispになりませんが、もだった材料はそろうみたいなので、できそうな気がします。たぶん。 #include <iostream> // 等値 template<typename T, typename U> struct Eq { static const bool condition = false; }; template<typename T> struct Eq<T, T> { static const bool con</t,></typename></typename></iostream>…

文字列をリンクトリストにする、ただしC++テンプレートで

C++でテンプレートを使っていると、ときどき、文字列をテンプレートに渡したくなるときがあります。 ですが残念なことに、文字列をテンプレート引数にすることはできません。 // こういうことをやってみたい! (けど、できない) template<const char* S> struct Str { // </const>…

畳み込み、ただしC++テンプレートで

// リンクの終端 struct Nil {}; // 左畳み込みテンプレート template<template<typename, typename> class Operator, typename N, typename Sequence> struct Foldl { static const int value = Foldl< Operator, Operator<N, typename Sequence::head>, typename Sequence::tail >::value; }; // 左畳み込みテンプレ</n,></template<typename,>…

遅延評価if

C++のテンプレートで。 Haskellのばあい 基本に立ち返って、まずはHaskellのばあい。 Haskellは基本的に遅延評価なので、不適切な式が含まれていても評価されないのであれば全体としては正しく評価してくれます。 ここでinfinityを評価してしまうと無限再帰…

会議の時間

c++

第20回 先日、「オフラインリアルタイムどう書く」が開催されました。今回で20回目でした。コンスタントに優良なお題と、みんなで集まって解くという場を提供され続けていることに尊敬と感謝の念を抱くばかりです。…。とはいえ、いまだにオフラインリアルタ…

Steinhaus–Johnson–Trotter algorithm の実装

Steinhaus–Johnson–Trotter algorithm - Wikipedia, the free encyclopedia Permutation.h #ifndef PERMUTATION_H #define PERMUTATION_H #include <vector> class Permutation { public: Permutation(int* begin, int* end); bool isIdentity() const; Permutation&</vector>…

8x8のビット行列を転置する

C++

@Nabetani さんが主催されてい「オフラインリアルタイムどう書く」のシリーズ。 3月まではオンラインで投稿させてもらっていたのですが、4月以降いろいろと余裕がなくなってしまい、すっかり遠のいてしまっていました。なのですが。なにやら参加のラブコール…

N個の要素に分割する

C++

文字列とか配列とかを指定した個数に分割するもの。 あとで使う予定。まずは道具を研ぐのが主義。 最後の要素は端数になります。 まずはC++で。 イテレータのヴェクタを返します。分割したあとのm番目の要素の開始位置と終了位置がヴェクタの要素のm番目とm+…

エントロピー符号をステートマシンで解く

お題。 オフラインリアルタイムどう書く第8回の参考問題 - Qiita この問題は、名前が示す通り、エントロピー符号で符号化されています。 エントロピー符号 - Wikipedia と、いうことは。一定の手順を踏むことで復号が可能ということになります。 と、いうこ…

プログラミングの攻めと守り

周回遅れ。すでに第9回の参考問題が出題されているという状況で第8回の参考問題を解くという。 オフラインリアルタイムどう書く第8回の参考問題 - Qiita 以下、コード。コードの全体はGitHubに格納しています。 #include <iostream> #include <sstream> #include <string> static const </string></sstream></iostream>…

バックトラッキング、C++で、Prologも、Haskellでも

「第7回オフラインリアルタイムどう書くの問題」を解いていて気がついたこと、学んだことを明日のじぶんのために、記録。 のんびり座りたい 〜 横へな 2013.2.2 いろいろ問題をコネているうちに、この問題はパタンマッチングで解けることに気がつきました。…

2点を対角の頂点とする矩形の内側の点を判別せよ

「オフラインリアルタイムどう書く第6回の参考問題 - Qiita」は前回一度解いていますが、別の方法――対象となる点をすべて数え上げるという方法で解く場合のお話。この問題では判定が必要な点の個数は10×10のたかだか100とわかっているので、こういう力技法で…

プログラムコードの、ひとつ上の視点で

今年の後半は、鍋谷さんが主催されている「オフラインリアルタイムどう書く」にオンラインで非リアルタイムで参加させてもらいました(参加というか、勝手にコード書いてアップしてただけですが)。以前にも書きましたが、鍋谷さんが出題される問題の難易度…

組み合わせ(combination)と部分列(subsequence)

備忘録。 Combination - Wikipedia Subsequence - Wikipedia C++で vector以外でキチンと動作するか、まだ確かめてないです。 combination #ifndef COMBINATION_H #define COMBINATION_H #include <vector> #include <iterator> template<typename iterator_t> void combination(iterator_t begin, i</typename></iterator></vector>…

組み合わせ(数学の) 〜 combination

C++で ベクタから指定した個数の要素を持つ部分集合のベクタを生成します。 #include <vector> template<typename T> struct Combination { typedef std::vector<T> source_type; typedef std::vector<source_type> values_type; Combination(const source_type& source, int n) { std::vector<int> v(</int></source_type></t></typename></vector>…

ビットテトリス

Bit Tetris 〜 横へな 2012.7.25 今度もオンライン上だけでの参加になりました。 ネタのリサイクルになりますが、Qiitaに投稿したものをブログにも投下しときます。 第二回 オフラインリアルタイムどう書く その1 - Qiita 第二回 オフラインリアルタイムどう…