morris555's diary

高校生のブログです。

haskell

Xmonadの通知設定

通知に使っているxfce4-notifydが、勝手にフォーカスされてしまって邪魔だったので設定した。ついでに全てのワークスペースに表示されるように(ふぁぼ爆撃されたら…) import XMonad.Actions.CopyWindow myManageHook = composeAll [ className =? "Xfce4-not…

fromEnumについて

Twitterで流れてきたこれを見て、あれ?と思ったので調べてみましたfromEnum???数字ならその数字を、文字なら、文字コードを返すらしい。ghciで調べてみる Prelude> :t fromEnum fromEnum :: Enum a => a -> Intなるほど列挙型ならいいのかというわけで、…

Arch LinuxにXmonad入れた

メインで使ってるマシンにXmonadいれました。なぜか最近Ubuntuが不安定だったのでこのタイミングでArch Linuxに変えました。Arch Linuxのインストールはnetinstall版を使いたかったのですが、何故か有線より無線を優先して認識してしまったのでCoreの方を使…

FFIを使ってみよう

FFIを使ってHaskellからC++の関数を呼び出してみました。まずC++のコード #include <iostream> extern "C" { void hello() { std::cout << "Hello World!" << std::endl; } } 大切なのは「extern "C" {}」を忘れないことです。そしてHaskellは {-# LANGUAGE ForeignFun</iostream>…

Problem 22

Problem 22です。 import Data.List import Data.Maybe import Control.Applicative score = sum . map (fromMaybe 0 . flip lookup (zip ['A'..'Z'] [1..26])) main = do names <- (sort . list) <$> getContents print . (foldr (\(x, y) s -> s + x * y) …

Problem 21

Problem 21です。 import Data.List main = print . sum . filter isAmicable $ [1..10000] isAmicable n = n == (sumDivisors . sumDivisors $ n) && n /= sumDivisors n sumDivisors n = sum . filter (\x -> (n `mod` x) == 0) $ [1..n-1] 遅いです。

Problem 20

Problem 20です。 import Data.Char (digitToInt) main = print . sum . map digitToInt $ show . product $ [1..100] シンプルに計算するだけで簡単に出来ました。

Problem 19

今回は、Problem 19です。 import Data.Time.Calendar import Data.Time.Calendar.WeekDate main = print . length $ [d | d <- [fromGregorian y m 1 | y <- [1901..2000], m <- [1..12]], let (_, _, w) = toWeekDate d, w == 7] Haskellなら簡単でした。

Problem 18

Problem 18です。 import Control.Applicative group _ [] = [] group n xs = let (xs1, xs2) = splitAt n xs in xs1 : group (n+1) xs2 main = do input <- map read <$> (words <$> getContents) :: IO [Int] print . head . foldr1 max' $ group 1 input …

Problem 17

Problem 17は「1から1000までの数字をすべて英単語で書けば、全部で何文字になるか」という問題です。 nums1 = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fiftee…

Problem 16

ploblem 16は、「2^1000」の全ての桁の総和を求める問題です import Data.Char (digitToInt) main = print . sum . map digitToInt . show $ 2 ^ 1000 こんな感じ。簡単すぎてちょっと面白くなかった。

Problem 15

Problem 15です。20 × 20 のマス目の左上から右下までの最短ルートの数を求める問題です。 main = print $ product [21..40] `div` product [1..20] 高1の数学で習ったような気がしたので、記憶を頼りにやってみました。

Problem 14

Problem 14はいわゆる「コラッツの問題」ってやつです。 import Data.List (maximumBy) import Data.Ord (comparing) collatz 1 a = a collatz n a | even n = collatz (n `div` 2) (a + 1) | otherwise = collatz (3*n + 1) (a + 1) main = print $ maximum…

Problem 13

今回はProblem 13です。50桁の数字100個の総和の上10桁を求める問題ですね。 main = putStrLn . take 10 . show . sum $ num num = [ -- ここに50桁の数字100個 ] 見難くなるので数字は省略しましたが、100個のリストを作れば簡単でした。

Problem 12

Problem 12は500個以上の約数を持つ最小の三角数を求める問題です。 import Data.List (group) factorize 1 = [(1, 0)] factorize n = format . factorize' n $ 2:3:[x + y | x <- [6, 12 ..], y <- [-1, 1]] where factorize' n xs'@(x : xs) | n < x * x =…

Problem 11

Ploblem 11はタテ・ヨコ・ナナメの4つの連続する数字の積で最大のものを求める問題です。 main = print . maximum $ width ++ height ++ obil1 ++ obil2 calc xs ys = product $ zipWith ref xs ys where ref x y = nums !! y !! x width = [calc [x + n | n…

Problem 10

Ploblem 10です。200万以下の全ての素数の和を求める問題です。 primes = 2:primes' where primes' = 3:sieve 0 5 sieve i x = filter isPrime [x, x+2..p*p-2] ++ sieve (i+1) (p*p+2) where (ps,p:_) = splitAt i primes' isPrime x = all ((/=0).rem x) p…

Problem 8

今回こそProblem 8です。1000桁の数字から5つの連続する数字を取り出して その積を計算したときの最大の値を求める問題です。 main = print . getMax 0 $ getNum input getNum "" = [] getNum (c:cs) | c `elem` ['0'..'9'] = (read :: String -> Int) [c] :…

Problem 9

Problem 9です。「a + b + c = 1000となるピタゴラスの三つ組が一つだけ存在する. このa,b,cの積を計算しなさい」こんな問題ですね。 pythaNums n = [a * b * c | a <- [1 .. n `div` 3], b <- [a+1 .. n `div` 2], c <- [n - a - b], a * a + b * b == c * …

Problem 7

Problem 7は10001 番目の素数を求める問題です。 primes = 2:f [3,5..] where f (x:xs) = x:f [y | y <- xs, y `mod` x /= 0] main = print $ primes !! 10000 遅いです。素数を求めるのにもっと速い方法があるはずですが…まあ、色々な方法を探してみようか…

Problem 6

六日目でもう更新忘れるところでした(汗今回はProblem 6です。1~100の和の二乗と二乗の和の差を求める問題です。 main = print $ (sum [1..100]) ^ 2 - sum [x * x | x <- [1..100]] 和の二乗から二乗の和をひくだけです。ただの計算でした。

Problem 5

Problem 5は、最小公倍数を求める問題ですね。 main = print $ foldl1 lcm [2..20] 標準ライブラリにlcmがあるので簡単に求められますね。ちょっとつまらない気もしますが…まあいいでしょう。

Problem 4

4日目です。今回はProblem 4を…「3桁の数の積で表される回文数のうち最大のものはいくらになるか。」って問題ですね。 isPalindromic n = (show n) == reverse (show n) main = print . maximum $ [x | x <- [y * z | y <- [100..999], z <- [y..999]], isPa…

Problem 3

今回はProblem 3を…素因数分解の問題ですね。どこかでunfoldrを使った素因数分解を見た記憶があったので再現(?)してみました。 import Data.List fac x = case [y | y <- [2..x], x `mod` y == 0] of [] -> Nothing [t] -> Just (t, 0) (t:_) -> Just (t, x …

Problem 2

それでは今日はProblem 2を…400万までのフィボナッチ数列の偶数を足していく問題です。 main = print . sum . takeWhile (<=4000000) $ [x | x <- fb, even x] ] where fb = 1:2:[x + y | (x, y) <- zip fb (tail fb)] こんな感じかな?フィボナッチ数列も意…

Problem 1

はじめに 最近はネタがなく一ヶ月以上更新してなかったのでProject EulerをHaskellでやっていこうかと思います。 本題 今回はProblem 1なのでここに書くほどのものでもないですが… main = print . sum $ [x | x <- [1..999], x `rem` 3 == 0 || x `rem` 5 ==…

haskellでGUIを一行で

HaskellでGUIこの記事のプログラム(簡単にしたもの)をdo記法を使わずに書いてみたいと思います。 import Graphics.UI.Gtk;main = initGUI >> windowNew >>= \window -> onDestroy window mainQuit >> widgetShowAll window >> mainGUI 強引に一行にしました…

一行でFizzBuzz

こんな事は既にやってる人がたくさんいると思いますが…… putStrLn $ show $ map (let fizzBuzz x | 0 == (x `mod` 3) && 0 == (x `mod` 5) = "FizzBuzz" | 0 == (x `mod` 3) = "Fizz" | 0 == (x `mod` 5) = "Buzz" | otherwise = show x in fizzBuzz) [1..10…

数値型についてのメモ

haskellで失敗したので自分用メモを。簡単な計算するだけだったのですが……調子に乗って test :: Int -> Int こんな型宣言をしたので大きな数の計算ができなくてただの凡ミスです(泣) -- (1) test :: Integer -> Integer -- (2) test :: (Num a) => a -> a こ…

HaskellでGUI

はじめに 最近ネタがないのでネタづくりのためにhaskellでguiプログラミングをしてみました日本語の情報も意外にあったgtk2hsを使いました。 準備 ubuntuならとても簡単でした。 cabal install gtk2hs-buildtools cabal install gtk 基本的にはこれだけでOK…