morioXのCraftお勉強日記 RSSフィード

2007-05-24

[] ソーティングその1・バブルソート  ソーティングその1・バブルソート - morioXのCraftお勉強日記 を含むブックマーク

教科書の問題だけやっているのも、ちょっと受身過ぎるかな、ということで、今後は、有名なソーティングアルゴリズムHaskellで書いてみることにする。

今回のテーマバブルソート。Cなんかの教科書で、簡単かつ遅いソーティングの決定版みたいな扱いをされているアルゴリズムを選んでみた。

bubbleSortAsc :: [Int] -> [Int]

bubbleSortAsc xs

 | tail xs == [] = xs

 | otherwise = [head $ smallHeadList xs] ++ (bubbleSortAsc $ tail $ smallHeadList xs)

 where

  smallHeadList :: [Int] -> [Int]

  smallHeadList xs

   | tail xs == [] = xs

   | head xs < (head $ smallHeadList $ tail xs) = xs

   | otherwise = [head $ smallHeadList $ tail xs] ++ [head xs] ++ (tail $ smallHeadList $ tail xs)

ちなみに、bubbleSortAsc は、リスト内の数字を昇順で並べ直すバブルソート関数。smallHeadList は、リスト内の最小の数字をバブルソートのやり方でリストの最後に移動させる関数。処理のイメージはこんな感じ。

[5, 3, 2, 1]

→ [1, 5, 3, 2]

→ [1] ++ [5, 3, 2]

→ [1] ++ [2, 5, 3]

→ [1] ++ [2] ++ [5, 3]

→ [1] ++ [2] ++ [3, 5]

→ [1] ++ [2] ++ [3] ++ [5]

→ [1, 2, 3, 5]

こんな風に再帰を使いまくっても、バブルソートと呼べるのか、ちょっと不安になってきた。どうしてもfor文にiとかjとか添字をつけてループさせるイメージが抜けないんだよなあ。

JagneshwarJagneshwar2012/05/03 07:59Thniknig like that shows an expert at work

btwhqjebtwhqje2012/05/05 15:373ljczA , [url=http://tucwbhcojcfm.com/]tucwbhcojcfm[/url], [link=http://gblgqbtcbqnq.com/]gblgqbtcbqnq[/link], http://lciamwxiyftl.com/

2007-05-18

[] Fizz-Buzz問題を解いてみたよ。  Fizz-Buzz問題を解いてみたよ。 - morioXのCraftお勉強日記 を含むブックマーク

詳細はこちら。ちなみに問題の概要は以下のとおり。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

残念ながら2分で解けずorz。初級Haskellプログラマへの道遠し。まだまだ修行が必要だな。

今回は、久々にGHC-6.6でやってみたので、main関数付き。

main = do putStr $ printFizzBuzz 100


printFizzBuzz :: Int -> String

printFizzBuzz m

 | m > 1 = numCheck m ++ "\n" ++ printFizzBuzz (m - 1)

 | m == 1 = numCheck m ++ "\n"

 | otherwise = "Out of range."


numCheck :: Int -> String

numCheck n

 | (mod n 15) == 0 = "FizzBuzz"

 | (mod n 5) == 0 = "Fizz"

 | (mod n 3) == 0 = "Buzz"

 | otherwise = show n

もっとシンプルにできないものかなー。

タナカコウタナカコウ2007/05/23 12:31こんにちは。(mod n 15) == 0 = "FizzBuzz"ですが、。
(mod n 3) && (mod n 5) == 0 = "FizzBuzz" で置き換え可能でしょう。ガードは上から適用されますので。では。

morioXmorioX2007/05/24 02:57(mod n 3) && (mod n 5) == 0 = "FizzBuzz"にしようかどうかも、実はちょっと悩みましたが、ガードの適用結果も変わらないようですし、見てすぐわかる式を書きたかったのでこちらにしました。深い意味はないです・・・。

MickeyMickey2012/01/06 11:47A piece of eurditoin unlike any other!

tubiyobctubiyobc2012/01/06 19:11BdhT79 <a href="http://nrymatmbjghw.com/">nrymatmbjghw</a>

mbidsntmbidsnt2012/01/07 23:317x2L8x , [url=http://fysgsoryrwwv.com/]fysgsoryrwwv[/url], [link=http://sztsetdtmxpt.com/]sztsetdtmxpt[/link], http://rnmetgwmnazy.com/

mfjjyjqodycmfjjyjqodyc2012/01/09 22:35yZVup3 <a href="http://yeaujcinxmyz.com/">yeaujcinxmyz</a>

pdszckqduwpdszckqduw2012/01/11 03:19trOpaH , [url=http://qqwdupodgzvx.com/]qqwdupodgzvx[/url], [link=http://azhfywdegtyd.com/]azhfywdegtyd[/link], http://gatkrqluagkr.com/

2007-03-13

[] Parsecを使ったログファイルの解析方法の確立 (1日目)  Parsecを使ったログファイルの解析方法の確立 (1日目) - morioXのCraftお勉強日記 を含むブックマーク

id:morioX:20070201:p2参照。とりあえず、ログファイルの解析、ということでやってみたいことを以下に列挙してみる。

  • 特定の法則で記述されている文字列があった場合、「あったよ!」とメッセージを出す。
  • 特定の法則で記述されている文字列があった場合、これを別の文字列に変換する(特にこれをHaskellでなんとかしたい)。
  • X行目、Y列目の文字列を扱う。
  • ログ内の日本語メッセージを扱えるようにする(できるのか?)。

とりあえずはこんなところかな。

MonuMonu2012/07/24 09:31Fiindng this post has solved my problem

nqullinjlnqullinjl2012/07/25 02:20PHcgri <a href="http://crgdekdtwivx.com/">crgdekdtwivx</a>

elxadrelxadr2012/07/26 19:08XCw5g4 <a href="http://yqrmsqywnuer.com/">yqrmsqywnuer</a>

2007-01-14

[] EclipseFPを導入  EclipseFPを導入 - morioXのCraftお勉強日記 を含むブックマーク

http://eclipsefp.sourceforge.net/

Haskell向けのIDE環境は、Visual HaskellとEclipseFPの2つがメジャーらしい。僕は、普段からVisualStudioよりもEclipseをよく使うので、EclipseFPを入れてみることにした。大まかな手順は下記の通り。

  1. Eclipse 3.2.1 をダウンロードインストール(今回はAll-In-One Eclipse 3.0.1を使用)
  2. GHC 6.6 をダウンロードインストール(既に導入済みなので省略)
  3. Hugs Version September 2006 をダウンロードインストール(既に導入済みなので省略)
  4. Haddock 0.8 をダウンロードインストール
  5. EclipseFP(Eclipse向けプラグイン)をダウンロード
  6. Eclipse にEclipseFPを導入(features, pluginディレクトリの内容をまるごとコピー)
  7. Eclipse を起動
  8. Eclipse 画面上の[fp]アイコンクリックし、Hugs, Haddock, GHCのPATHを設定(初期設定はコマンド名なので、ちゃんと絶対パスで設定してあげるのが望ましい。ウィンドウ下部にExceptionメッセージが表示されなくなればOK)
  9. Eclipse 上でHaskellプロジェクトを作成し、正常に動作することを確認する。

使ってみて分かったEclipseFPの特徴を以下に記す。

コンテンツアシストに若干の不満はあるものの、マイナー言語Haskell向けのプラグインなのによくぞここまで、というのが正直な感想。おかげで勉強中のトライ&エラーが格段に楽になった。Visual Haskellと違ってLinux上で完結できるのもとてもありがたい。今後はこれを使って勉強することにしよう。

2007-01-09

[] Wikibooksモナドの説明(1日目)  Wikibooksのモナドの説明(1日目) - morioXのCraftお勉強日記 を含むブックマーク

http://en.wikibooks.org/wiki/Programming:Haskell_monads

モナドを学ぶのに役立つ!とHaskellerの皆様がこぞってご推薦するWikibooksのページを読んでみることにしました。やっぱりこのページも英語なのがしんどいですが・・・。

まずは、1ページ目の「Haskell/Understanding monads」。これだけでもかなりお腹いっぱいのボリュームですが、とりあえず読んでみます。

今日は、State Monadの前あたりまで。(英語を読むのにてこずっているものの)説明自体はとても分かりやすく、おぼろげながらモナドがどんなものかが、掴めてきたように思います。特にBind (>>=)を説明するまでの話の展開が素晴らしい、と感じました。とりあえず、基本となる以下の定義に関する抵抗感は無くなってきたように思います。

(>>=) :: m a -> (a -> m b) -> m b