第16回 Ruby 勉強会@関西

Posted by okkez Fri, 15 Jun 2007 16:05:00 GMT

行ってきました。 第16回 Ruby 勉強会@関西

RubyKaigi2007レポート

ちょっと参加者の数が少ないような気がしたので外に探しに行っている間に終わってた。「Ruby」っていう関数型言語の話が聞けたので良かったかなぁ。写真とかどれくらい使われたのか全然把握してない。

丸投げシリーズ: Ruby + Win32OLE + Adobe Illustrator

折紙で豆本を作るのはサービスが開始されたら実際に使ってみたい。何かのカンファレンスとかのときに配ると楽しそう。

Win32OLEは私も愛用してます。主に Excel に入力されたデータを加工してソースコードにするという感じです。

初級者向けレッスン

例外とメソッドについて。量は多かったけど、ほぼ時間通りに説明できたと思う。

今回もサカイさんに喋ってもらう。今回も漢字の読みを間違っていたので緊張していたのでしょう。演習課題はみんな出来ていたようで、今回の難易度設定はちょうどよかったみたいです。

スライド、配布資料、解答は明日か明後日くらいにアップします。

# 最近、妙に疲れてるのです。

30分で分かる継続の使い方

継続の使い方がやっとわかったような気がしました。けど、使わないだろうな。 というか恐くて使えない。

懇親会についてはmixiで。

Posted in |

Integer to RomanNumeral in Erlang 2

Posted by okkez Wed, 06 Jun 2007 13:52:00 GMT

Haskell で書いたのを参考に書き直してみた。 なんとなく Haskell っぽくなった?

convert.erl
-module(convert). -compile(export_all). -import(lib_misc,[p/1]). old_roman_unit(1000) -> "M"; old_roman_unit( 500) -> "D"; old_roman_unit( 100) -> "C"; old_roman_unit( 50) -> "L"; old_roman_unit( 10) -> "X"; old_roman_unit( 5) -> "V"; old_roman_unit( 1) -> "I". i2r(Num) -> lists:flatten(i2r(Num, [1000, 500, 100, 50, 10, 5, 1])). i2r(_,[]) -> []; i2r(Num, [H|T]) -> lists:duplicate(Num div H, old_roman_unit(H)) ++ i2r(Num rem H, T).

Posted in , |

Integer to RomanNumeral in Haskell 2

Posted by okkez Wed, 06 Jun 2007 12:16:00 GMT

ちょっとだけ改善してみたのでまた公開しておく。

コマンドライン引数を一つ受け取って10進数をローマ数字に変換してくれる。

使い方

$ runghc convert.hs 10 #=> X $ runghc convert.hs 999 #=> DCCCCLXXXXVIIII
convert.hs
import System import Numeric main = do cs <- getArgs let [(n,_)] = readDec $ head cs putStrLn $ i2r n old_roman_unit :: Int -> Char old_roman_unit n | n == 1000 = 'M' | n == 500 = 'D' | n == 100 = 'C' | n == 50 = 'L' | n == 10 = 'X' | n == 5 = 'V' | n == 1 = 'I' | otherwise = 'Q' i2r :: Int -> String i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] i2r2 :: Int -> [Int] -> String i2r2 _ [] = [] i2r2 n (u:us) = replicate (n `div` u) (old_roman_unit u) ++ i2r2 (n `mod` u) us

Posted in |

Integer to RomanNumeral in Haskell

Posted by okkez Tue, 05 Jun 2007 16:47:00 GMT

意味があるかどうかわからないけど、なんとなく書いてみた。

戦略は Erlang の場合と同じ。なんとなく Erlang の時よりすっきりしている気がしなくもない。

convert.hs
main = putStrLn $ unlines $ map i2r [1..4999] old_roman_unit :: Int -> Char old_roman_unit n | n == 1000 = 'M' | n == 500 = 'D' | n == 100 = 'C' | n == 50 = 'L' | n == 10 = 'X' | n == 5 = 'V' | n == 1 = 'I' | otherwise = 'Q' -- 本当は例外?を投げたい気がする i2r :: Int -> String i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] [] i2r2 :: Int -> [Int] -> String -> String i2r2 _ [] str = str i2r2 n (u:us) str = i2r2 (n `mod` u) us (str ++ replicate (n `div` u) (old_roman_unit u))

最後の行がちょっと微妙な気がする。誰か Haskell っぽく書くとこうなるってのを教えてくれるとうれしい。

今度逆も書いてみる。

Posted in | コメントはありません |

RomanNumeral to Integer in Erlang

Posted by okkez Sun, 03 Jun 2007 00:22:00 GMT

昨日、帰宅後に書いた奴の逆バージョン。

D(500), L(50), V(5) が複数ある場合のチェックは抜けてるけど大体できたので書いておく。

to_integer
r2i(Str) -> [H|T] = [1000, 500, 100, 50, 10, 5, 1], {Matched, Unmatched} = lists:partition(fun(X) -> [X] =:= old_roman_unit(H) end, Str), check(Str, Matched), lists:sum(lists:map(fun({Num, L}) -> Num * length(L) end, r2i(T, Unmatched, [{H, Matched}]))). r2i([], _, L) -> L; r2i([H|T], Str, L) -> {Matched, Unmatched} = lists:partition(fun(X) -> [X] =:= old_roman_unit(H) end, Str), check(Str, Matched), r2i(T, Unmatched, [{H, Matched}|L]). check(Orig, L) -> if length(Orig) < length(L) -> false; true -> case lists:all(fun({X,Y}) -> X =:= Y end, lists:zip(lists:sublist(Orig,1,length(L)),L)) of true -> true; false -> throw('ArgumentError') end end.

自分で作った lib_misc:p/1 がかなり便利。Ruby の Kernel#p というか Ruby1.9 の Kernel#tap ぽく使える。

Erlang勉強会#1

Posted in |

Integer to RomanNumeral in Erlang

Posted by okkez Sat, 02 Jun 2007 16:50:00 GMT

Erlang 勉強会#1の宿題ができたので公開。

to_roman_numeral
-module(math). -export([i2r/1,to_s/2]). -import(lib_misc,[p/1]). old_roman_unit(N) when N =:= 1000 -> "M"; old_roman_unit(N) when N =:= 500 -> "D"; old_roman_unit(N) when N =:= 100 -> "C"; old_roman_unit(N) when N =:= 50 -> "L"; old_roman_unit(N) when N =:= 10 -> "X"; old_roman_unit(N) when N =:= 5 -> "V"; old_roman_unit(N) when N =:= 1 -> "I". i2r(Num) -> [H|T] = [1000, 500, 100, 50, 10, 5, 1], {Div, Mod} = {Num div H, Num rem H}, lists:flatten(i2r(Mod, T, to_s(old_roman_unit(H),Div))). i2r(_,[],Str) -> Str; i2r(Num, [H|T], Str) -> {Div, Mod} = {Num div H, Num rem H}, if Div > 0 -> i2r(Mod, T, Str ++ to_s(old_roman_unit(H), Div)); true -> i2r(Mod, T, Str) end. to_s(C, Num) -> if Num > 0 -> lists:map(fun(_) -> C end,lists:seq(1,Num)); true -> [] end.

ダサい部分はたくさんあるけど自力で書いたのが偉いと思ったので公開。エラーメッセージの読み方がなんとなくわかってきたような気がする。

ついでに。

lib_misc
-module(lib_misc). -export([p/1]). p(X) -> io:format("~p~n",[X]), X.

こんな感じで使う。 関数の途中の値を知りたいときに使うと便利かも?

sample
to_s(C, Num) -> if Num > 0 -> lib_misc:p(lists:map(fun(_) -> C end,lists:seq(1,Num))); true -> [] end.

Posted in | コメントはありません |

How do I send trackback?

Posted by okkez Sat, 02 Jun 2007 00:11:00 GMT

99 bottoles of beer

まずは自分の記事にトラックバック?

Posted in |

99 bottles of beer

Posted by okkez Mon, 28 May 2007 15:07:00 GMT

なんとなく思い立って Haskell で書いてみた。 FizzBuzz と余り変わらない感じですね。

99 bottles of beer
main = putStr $ unlines [sing x | x <- reverse [1..1000]] sing :: Int -> String sing n = unlines [ (show n) ++ bottle n ++ " of beer on the wall" ,(show n) ++ bottle n ++ " of beer" ,"Take one down and pass it around" ,(show $ n - 1) ++ (bottle $ n - 1) ++ " of beer on the wall"] bottle :: Int -> String bottle n | n == 1 = " Bottle" | otherwise = " Bottles"

Posted in |

xyzzy で矩形編集

Posted by okkez Mon, 28 May 2007 10:54:00 GMT

Emacs で C-x r t や C-x r d で矩形編集できるのを知ったので(多分他にもある)xyzzyにもあるはずと思って探してみたらあったので .xyzzy に設定した。

.xyzzy
(global-set-key '(#\C-x #\r #\d) 'delete-rectangle) (global-set-key '(#\C-x #\r #\t) 'string-rectangle)

他には kill-rectangle とか yank-rectangle とか設定すると便利そうな感じはしたけどちょうど割り当てたいキーがなかったので今回は見送った。

FizzBuzz

Posted by okkez Sat, 26 May 2007 02:03:00 GMT
Haskell
import System main = putStr $ unlines [fb(x) | x <- [1..100]] fb n | n `mod` 15 == 0 = "FizzBuzz" | n `mod` 5 == 0 = "Buzz" | n `mod` 3 == 0 = "Fizz" | otherwise = show n
Erlang
-module(fizzbuzz). -export([fizzbuzz/0,fb/1]). fizzbuzz() -> [ fb(X) || X <- lists:seq(1,100)]. fb(N) when N rem 15 =:= 0 -> "FizzBuzz"; fb(N) when N rem 5 =:= 0 -> "Buzz"; fb(N) when N rem 3 =:= 0 -> "Fizz"; fb(N) -> N.

Erlang の方の動かし方。(インストールは略)

  • erl シェルを起動
1> c(fizzbuzz.erl). %=> コンパイル {ok,fizzbuzz} 2> fizzbuzz:fizzbuzz. %=> 関数呼び出しの括弧は必要 ** 1: illegal expression ** 3> fizzbuzz:fizzbuzz(). [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26, "Fizz", 28, 29|...] %=> リストの出力は省略される 4>

Posted in | コメントはありません |