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

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

Haskell

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

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

逆波蘭記法計算機

備忘録。 Haskell operate :: [Integer] -> String -> [Integer] operate (r:l:st) "+" = (l + r):st operate (r:l:st) "-" = (l - r):st operate (r:l:st) "*" = (l * r):st operate (r:l:st) "/" = (l `div` r):st operate stack t = (read t::Integer):st…

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

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

いかにして表計算の列名をつくるか・特別篇

Haskellでたわむれていると。 id:nobsun さんが実に軽快な解法をコメントに残してくださいました。 colns = concat cns where cns'@(_:cns) = [""] : [[c:ns | c <- ['A'..'Z'], ns <- nss] | nss <- cns' ] Qiita では、さらにエレガントな解を展開されてい…

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

おさらい。 いかにして表計算の列名をつくるか - エンジニアのソフトウェア的愛情 いかにして表計算の列名をつくるか・補遺 - エンジニアのソフトウェア的愛情 最終形態 先日、Haskellで無限長配列を生成する例を挙げました。再掲。 import Data.List(group)…

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

先日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>…

Filtering, then Mapping

Haskell evenTen = map (\n -> n * 10) . filter even Prelude> evenTen [1,2,3,4,5,6,7,8,9,10] [20,40,60,80,100] Ruby def evenTen(a) a.select{|n| n % 2 == 0}.map{|n| n * 10} end irb(main):004:0> evenTen [1,2,3,4,5,6,7,8,9,10] => [20, 40, 60, 8…

N個の要素に分割する・Haskell篇その2、あるいは8つのボール問題・Haskell篇

自主練の覚え書き的なエントリを先日書いたところ、コメントで有用な情報を頂くことができました。ありがとうございます。 畳み込み関数と展開関数 id:nobsun さんからは展開関数の存在を教えて頂きました。 展開関数とは 畳み込み関数と双対となる関数との…

N個の要素に分割する・Haskell篇

昨日やったことをHaskellでも。 実は。このやりかただとヨクナイ結果になることがあるのがわかっているのだけれども。そこは今はちょっと保留ということでご勘弁を。あとでおさらいする予定です。昨日のC++のコード自体にも不備があるし…。 ま。それはそれと…

バックトラッキング、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>…

左右がつながっている場合、左右の番兵はひとりで兼任できる

いつも絶妙で楽しい問題を提供してくださっている@Nabetaniさん。すでに第5回の募集と参考問題の公開が始まっています。興味のある方はぜひ参加して、また問題を解いてみてください。問題の絶妙さが実感できます。 第5回 オフラインリアルタイムどう書く : A…

HaskellのUnitTest、HUnitについて学ぶ

恥ずかしながら。ごく最近までHaskellにUnitTestのライブラリがあるのを知りませんでした。恥ずかしい。 調べてみたところ、思ったよりも簡単にUnitTestを書けることがわかったので、ちょっとまとめてみました。 間違いありましたらご指摘いただけるとたいへ…

論理型言語Prologと関数型言語Haskellを比較してみた

PrologとHaskellで同じ問題を解いてみました。Prologで同程度の問題を解けるくらいのプログラミングができたのは初かもしれない…。 お題は鍋谷さんが開催されている「オフラインリアルタイムどう書く」の第4回のお題を利用させてもらいました。 テトロミノ認…

ビットテトリス

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

「どう書く?」とつねに問う姿勢が大事、だと、思う。

第一回 オフラインリアルタイムどう書くの参考問題 - Qiita (via 鍋谷さんの参考問題: へなちょこ解答(Java) - 虎塚) こういう面白そうな話題は、まぜてくださいー。 あ、残念ながらオフラインのほうの参加はちょっと無理。ほんと残念ながら。 先に結果…

C++のtemplateが問題を解く

昨夜は @emattsan さんのLuaとIOの話から始まり、 @crashpon さん交えてアセンブラに寄り道しつつ、最後 @maccha がPrologについて熱く語り、その全てを @torazuka さんが熱心に聞く、という稀有な展開。オイラはその展開自体をメタに楽しんだw— あまのりょ…

キーブレイク処理とフィルタの関係について

前回のエントリで「ソースからシンクへとデータを流し続けるような場合」の例として、コンテナからシンクオブジェクトへとデータを流すコードを書きました。よくよく考えてみると、「コンテナそのものを渡すよりもイテレータで範囲を渡す方がよい(STLもこの…

Mapを使わないでSummary

おさらい。 リストを項目ごとに集計する - 日々常々 リストを項目ごとに集計するときのデータオブジェクトの使い方 - 虎塚 キー毎に値を集計する方法 - ひしだまの変更履歴 昨日(日付的には今日ですけど)、最後に「なんかよくわかんないんですけど、なんか…

「40 - 32 / 2 = 4!」新実装篇

前々々回、前々回の続きで、 前回考察した結果を元に実装。 C++ #include <iostream> #include <vector> #include <boost/format.hpp> #include <boost/lexical_cast.hpp> void print(int a, int b, int c) { const int m = (a - b) / c; const int n = a - b / c; std::cout << (boost::format("(%1% - %2%) / %3% = %4%"</boost/lexical_cast.hpp></boost/format.hpp></vector></iostream>…

「40 - 32 / 2 = 4!」Haskell篇

前回のつづき。どうにか動くものが書けました。前回同様、ここのコードはGitHubにも登録してあります。 ぢゃ、Haskellでは? 前回の最後で「書いているうちに、わけわかんなくなりました。Haskell篇は後日ということで…」と書きましたが、こんなコードではわ…

リハビリ(中略)lis.hsに書き直してみた、のつづき

さらに昨日のつづき。 AtomをShowのインスタンスにしてみました。これでshow関数が使えるようになりました。 ふだんは手っ取り早く「data Atom (中略) deriving Show」とやって終りにしていたので、改めてHaskellの基本を調べなおして書き直し。基礎練習、…

リハビリがてらにlis.pyをlis.rbに書き直してみたのをlis.hsに書き直してみた

先日のつづき。気持ちとしては。翌日にもアップしたかったものの。予想以上にはまることになり。とういうかHaskell忘れすぎ。脳のHaskell野の活動が弱くなってます。 一番ハマったのがシンボルにリストと実引数のリストから、辞書を作る式。 ss = [SYMBOL "x…

C/C++スタイルのコメントの除去 by Haskell

以前C++で書いたものをHaskellのParsecで。 まだテストしてないので間違えてるかもしれない。(2010/02/03追記:やっぱり間違えてた。quoteStringはエスケープしたダブルコーテーションをきちんと処理できない。修正版は後日) import Text.ParserCombinator…

Fizz Buzz by Haskell part2

もう一段階簡単にする方法をコメントで教えて頂きました。ありがとうございました。 fizz = cycle [ "", "", "Fizz" ] buzz = cycle [ "", "", "", "", "Buzz" ] fizzbuzz = zipWith max (map show [1..]) $ zipWith (++) fizz buzz 大小を比較できる要素か…

Fizz Buzz by Haskell

fizz = cycle [ "", "", "Fizz" ] buzz = cycle [ "", "", "", "", "Buzz" ] fizzbuzz = zipWith ( \ n s -> if s /= "" then s else (show n) ) [1..] $ zipWith (++) fizz buzz main = mapM_ putStrLn $ take 20 fizzbuzz もう一段階、簡単になりそうな気…

Cygwin/GLUTが使えない

昨日のコードをWindows/Cygwinでも動かそうとしてみた。が、リンクエラーになる。OpenGLやGLUTのライブラリのインストールに失敗したかと、インストールを何度もやり直すが解決せず。 どうにもわからないのでネットで検索をかけたら、id:mokeheheさんのブロ…

ポイントフリースタイル

投稿してしばらく経ってから、これは、 turnRight :: Direction -> Direction turnRight d = toEnum (((fromEnum d) + 1) `mod` 4) turnLeft :: Direction -> Direction turnLeft d = toEnum (((fromEnum d) + 3) `mod` 4) こう書けることに気がついた。 tur…

HaskellでOpenGL(再放送)

どう書く?orgに投稿したものにちょっと手を加えたものを、備忘録代わりにこちらにも投稿。 「event handlers」以下が、OpenGL/GLUTを使って時間経過とともに状況(表示)が変わるものを表示するプログラムを書くときのテンプレートになると思います。draw関数…

リストにおけるdo式

コメント欄で教えて頂きました(ありがとうございました)。コメント頂いた内容の繰り返しになりますが、理解した内容をなぞっておさらいしたいと思います。 まず、つまずいたのがこの部分。 k m m' = do { x <- m; xs <- m'; return (x:xs) } do式の理解が不…

「リストのリストにsequenceを適用すると直積が得られる」のはなぜか考える

教えてくれることを期待して思考停止しているようではダメダメなので、理解できるところまで考えてみる。基本に立ち返ると、sequenceのソースは次のようになっているのがここからわかる。 sequence ms = foldr k (return []) ms where k m m' = do { x <- m;…

リストのリストにsequenceを適用すると直積が得られる

どう書く?orgのお題より。リストのリストにsequenceを適用すると直積が得られる。 $ ghci Prelude> sequence [[1,2,3], [4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] Prelude> sequence ["abc", "def"] ["ad","ae","af","bd","be","b…

統計的に正しいランキングを行う方法をC++とかHaskellとかで書く

http://d.hatena.ne.jp/makiyamakoji/20090512/p1のコードを参考に(というか、ほとんど一緒ですが)C++で書き直してみた。 #include <algorithm> #include <stdexcept> #include <cmath> double calcNormalDistPercentile(double percent) { if((percent <= 0) || (1 <= percent)) { throw </cmath></stdexcept></algorithm>…

四元数

四元数が扱えるわけでないのだけれど、書いてみた。 意外と簡単だったんだけど、本当にこれでいいのだろうか? module Quaternion where data (RealFloat a) => Qtn a = Qtn { x::a, y::a, z::a, w::a } deriving Eq instance (RealFloat a) => Show (Qtn a) …

narioがMac OS Xでサクッと動いた

わたしが以前「遅い」と書いたことに対して、id:TTSYさんが「http://d.hatena.ne.jp/TTSY/20081202/p2」で言及してくださいました。 で、言及されていたとおりthreadDelayをコメントアウトしたところ、あっ!サクッと動いた! id:TTSYさん、ありがとうございま…

Kleisli

import Control.Arrow import Data.List return "hogehoge.txt" >>= readFile >>= return.lines >>= return.sort >>= return.unlines >>= putStrLn runKleisli (Kleisli readFile >>> arr lines >>> arr sort >>> arr unlines >>> Kleisli putStrLn) "hogeho…

ArrowLoop

今日はArrowLoopに挑戦。激しく混乱中。たとえば、基本的な例の loop (\(x,y)->(y,x:y)) 1 がどう動くのかは理解できるんですが、まだ自分が期待する結果が得られる式をうまく書くことができません。こちらで紹介されている例をみて「むむ、Yコンビネータと…

図説Arrow

これでいいのかな?教えて、偉い人。 f >>> g first f second f f *** g f &&& g left f right f f +++ g f ||| g 図はditaaで作成しました。

Arrowの正体が、まだ見えない

ファンクション倶楽部のイベントに参加してArrowの話を聞いてから、Arrowに関する文章を読んでいるのだけれど、いまだにArrowの正体がつかめない。 使い方はid:takkan_mさんが書かれたエントリとかで学べたんですが、背景にある考え方がまだ理解できてないみ…

narioをMac OS Xで動かした

試行錯誤の結果を紹介。 準備 おとといのエントリを参考に、GHC、SDL、HSDL、narioを準備してください。 SDLMain.m/.hの編集 SDLのエントリになるSDLMain.mとSDLMain.hをSDLのsrc/main/macosx/からコピーします。 エントリポイントをHaskellのプログラムから…

続々・narioをMac OS Xで動かす

動いた! でもメチャクチャ遅い。1.33GHzのPowerPCではしょうがないのかな。 仕切り直して、FFIを使って“Haskellのmain→SDLMain.mのエントリポイント→narioのエントリポイント”という順番に呼び出すように変更してみました。こんな感じ。 foreign import ccal…

続・narioをMac OS Xで動かす

FFIを使って、下の2行を呼んでやると、一応表示されるところまで来ました。 [[NSAutoreleasePool alloc] init]; [NSApplication sharedApplication]; しかし…。 イベントのフックができない。 どうやら、メインループになる[NSApp run]を呼んでやらないとい…

narioをMac OS Xで動かす

id:mokeheheさんが作られたゲームをMac OS Xで動かそうとしてみた。Haskellで敵を踏み潰したりするゲームを作ってみた - imHoライブラリを何度もインストールし直して、3日ほどかかってようやくビルドできた。もしかしたら、不要な手順があるかもしれません…

再帰定義

Scalaで再帰的に定義する方法がわからん、という話。Haskellで a = 0:[x+1 | x <- a] と書けるのをScalaに持っていって def a:List[Int] = 0::((for(i <- a) yield { i+1}) toList) と書くと、定義はできるんだけど実行するとStackOverFlowErrorがでる。わか…

Scalaに手を出す

性懲りもなく、また新しい言語に手を出しています。オブラブ夏イベントでプログラミングErlangをいただきました。プログラミングErlang作者: Joe Armstrong,榊原一矢出版社/メーカー: オーム社発売日: 2008/02/23メディア: 単行本(ソフトカバー)購入: 8人 …

環境変数の値を得る

テンポラリファイルを作るのに、テンポラリフォルダの値を得る必要に迫られて。 忘れないうちにメモメモ。 import System.Environment get_env :: [String] -> String -> IO String get_env [] d = return d get_env (s:ss) d = catch ( getEnv s ) ( \ _ ->…

行頭に引用記号をつける

引用記号に限らずですが。 例は、lsコマンドで一覧したディレクトリの内容に引用記号(>)をつける例です。 ls | ghc -e 'getContents >>= mapM_ putStrLn.map ((++) "> ").lines' 未来の自分のために解説。 getContentsで標準入力から文字列を取得 linesで文…

素数

Haskellの実装の例でよく出てくる素数の計算。こんな感じの。 import System.Environment primes = sieve [2..] where sieve (a:as) = a:(sieve [x | x <- as, x `mod` a /= 0]) -- コマンドラインで計算する素数の数を指定。 -- 指定がないときは10個まで計…