morris555's diary

高校生のブログです。

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]], isPalindromic x]

思いついたままに書いたので、総当りで、しかもmaximumを使ってるので遅いですね。

でも、思いついたままに書いて答えが出せちゃうところがHaskellのいいところですね。

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 `div` t)

main = print . maximum . unfoldr fac $ 600851475143

こんな感じだったかな?

今までunfoldrなんて使ってなかったのでとても勉強になりました。

それにしてもunfoldrって便利ですね。

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 EulerHaskellでやっていこうかと思います。

本題

今回はProblem 1なのでここに書くほどのものでもないですが…

main = print . sum $ [x | x <- [1..999], x `rem` 3 == 0 || x `rem` 5 == 0]

こんな感じに書いてみました。

未満ってその数を含まないんだよね?

まあ一問目は簡単でしたね。

おわりに

これからなるべく更新する予定なのでお願いします。(忘れなければ…

haskellでGUIを一行で

HaskellでGUIこの記事のプログラム(簡単にしたもの)をdo記法を使わずに書いてみたいと思います。

import Graphics.UI.Gtk;main = initGUI >> windowNew >>= \window -> onDestroy window mainQuit >> widgetShowAll window >> mainGUI

強引に一行にしました。

なんかあんまり美しくないですね。

import Graphics.UI.Gtk
 
main = initGUI >> windowNew >>= \window -> onDestroy window mainQuit >> widgetShowAll window >> mainGUI

まだこっちのほうが綺麗ですね。

最近は練習で一行で書いたりしてるけど無理に一行で書かないほうが簡単に書けますね。

まあ自分用のメモ程度に書いたのでこのくらいですね。

誰かネタをください

追記

前の記事と同じものをやろうと思ったら

import Graphics.UI.Gtk

main = initGUI >> windowNew >>= \window -> set window [windowTitle := "Hello",windowDefaultWidth := 200,windowDefaultHeight := 50] >> labelNew Nothing >>= \label -> labelSetText label "Hello, World!" >> containerAdd window label >> onDestroy window mainQuit >> widgetShowAll window >> mainGUI

こうなります。

やりたいことを順番に書けばできるって、haskell素敵ですね

一行で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..100]

こんな感じです。ちょっとはhaskellを使えるようになってきたかな(?)

ネタがないのでこのくらいで許してください。

数値型についてのメモ

haskellで失敗したので自分用メモを。

簡単な計算するだけだったのですが……

調子に乗って

test :: Int -> Int

こんな型宣言をしたので大きな数の計算ができなくて

ただの凡ミスです(泣)

-- (1)
test :: Integer -> Integer
-- (2)
test :: (Num a) => a -> a

このどちらかにすればいいみたい(?) ←結局は同じ形になりますが…

(1)は普通の方法です。Integerは精度無制限なので大丈夫ですね

(2)の方を使うと小数も扱えるので便利だけど、整数しか計算できないときにエラーが出ないので使えないのかな。(調査の必要あり)

Num型はどんな数値でも(?)受け付けるので使うときには注意が必要かと思いました。

pythonだと型とかあまり意識してなかったので注意ですね。