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

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

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…