指定された日の存在する週

cf. どう書く?org – 指定された日の存在する週

こんどは Ruby で。

require 'date'
y, m, d = ARGV.map{|arg| arg.to_i }
date = Date.new(y, m, d)
sunday = (date - date.wday)
(1..5).each do |d|
puts((sunday + d).strftime("%Y-%m-%d %a"))
end

実行。

^o^ >week.rb 2007 7 7
2007-07-02 Mon
2007-07-03 Tue
2007-07-04 Wed
2007-07-05 Thu
2007-07-06 Fri
^o^ >week.rb 2007 1 1
2007-01-01 Mon
2007-01-02 Tue
2007-01-03 Wed
2007-01-04 Thu
2007-01-05 Fri
^o^ >week.rb 2007 12 30
2007-12-31 Mon
2008-01-01 Tue
2008-01-02 Wed
2008-01-03 Thu
2008-01-04 Fri

条件を満たす行を取り除く

条件を満たす行を取り除く
 via http://d.hatena.ne.jp/gan2/20070706/1183708048

‘#’で始まる行を取り除く問題。すげーひさしぶりに Haskell で書いてみる。

module Main where

import System

f :: String -> Bool
f (h:tl) | h == '#' = False
          | otherwise = True

main :: IO ()
main = do fileName <- getArgs
          contents <- readFile (head fileName)
          putStr $ unlines $ filter f $ lines contents

実行。

^o^ >type sample.txt
hello!
# remove this
 # don't remove this
bye!
^o^ >runhaskell filterline.hs sample.txt
hello!
 # don't remove this
bye!

ファイルを1行ずつ処理するやり方を忘れててあせった。

追記:id:jmkさんからもらったアドバイスを追記しておこう。ありがとうございます。

f ('#':_) = False
f _ = True
  • 元のコードでは空行に対応できてない。
  • パターンマッチにはリテラルを使える。

ピラミッドを作る

どう書く?org – ピラミッドを作る

与えられた高さのピラミッドを作る

module Main where

import System

cjust :: Int -> String -> String
cjust w s | w <= length s = s
          | otherwise = margin ++ s ++ margin
  where
    margin = replicate ((w - (length s)) `div` 2) ' '

pyramid :: [String]
pyramid = map (flip replicate '*') [1,3..]

main :: IO ()
main = do h <- getArgs >>= return.read.head
          putStr $ unlines $ map (cjust (h*2-1)) $ take h pyramid

実行。

^o^ >runhaskell pyramid.hs 4
   *
  ***
 *****
*******
^o^ >runhaskell pyramid.hs 5
    *
   ***
  *****
 *******
*********
^o^ >runhaskell pyramid.hs 6
     *
    ***
   *****
  *******
 *********
***********
^o^ >runhaskell pyramid.hs 1
*
^o^ >runhaskell pyramid.hs 0

お,高さ0でもちゃんと動く。