« Project Euler 用のモジュールを改訂しました。 | トップページ | またまた「FizzBuzz」 »

2011年3月18日 (金)

柔軟な発想

 電気系出身者さんの問題(こんな問題, ぱっと解けますか. - とある電気系出身者のいんでっくす)が面白そうで、Haskell で関数を書いてみようとしたんですが、要素数は多い順に、要素自体は小さい順に見ていかなくてはならなくて、なかなかいい方法を考えられませんでした。
 そしたら、こちらのブログ(Haskell卒業!)に同じ話題が載っていて、"negate" という関数が使われていました。

 "negate" は考えつきませんでした!
 確かに "negate" を使って要素数をマイナス扱いにしてしまえば、要素数と要素自体をタプルにして昇順に並べることで簡単に扱えます。

 ということで、次のようなコードを考えてみました。

import Data.List (sort, group, insert) eatingOrder :: [Int] -> [Int] eatingOrder xs = loop xs'  where   xs' = sort [(negate $ length x, head x) | x <- group $ sort xs]   loop [] = []   loop ((len, x) : xs)    | len == -1 = x : loop xs    | otherwise = x : loop (insert (len + 1, x) xs) main :: IO () main = print $ eatingOrder [0,1,1,1,2,2]
 GHCi で確認したところでは、思ったように動いてくれるようです。

 それにしても、「要素数を負の整数として扱う」という発想ができるような柔軟な頭が欲しいなぁと思うのでした。

« Project Euler 用のモジュールを改訂しました。 | トップページ | またまた「FizzBuzz」 »

Haskell」カテゴリの記事

コメント

ゴメンナサイ、TopCoderで比較的使われているっぽいテクをパクりました...
私1人では思いつかなかったでしょう...

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/51151751

この記事へのトラックバック一覧です: 柔軟な発想:

« Project Euler 用のモジュールを改訂しました。 | トップページ | またまた「FizzBuzz」 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ