Life Goes On

まあまあだけど楽しんでる方です

Project Euler

59問目

http://projecteuler.net/index.php?section=problems&id=59 XOR関数によって暗号化された文章がある。キーには英語の小文字3文字を繰り返した文字列を用いている。この文章を復号化し(元の文章は一般的な英単語から成っている)、そのASCIIコードの和を求…

58問目

http://projecteuler.net/index.php?section=problems&id=58 1から始まる数を時計回りにらせん状に配置していく。四隅の数のうち素数の占める割合が最初に10%未満になるのは、一辺の長さがいくつのときか求める。 若干遅いので、もう少し上手いやり方がある…

56問目

http://projecteuler.net/index.php?section=problems&id=56 a, b 自然数 ab の各桁の数字の和の最大値を求める。 問題文の通りです。 import Data.Char main = print $ euler056 99 99 euler056 :: Integer -> Integer -> Int euler056 ma mb = maximum $ m…

57問目

http://projecteuler.net/index.php?section=problems&id=57 √2は以下のように連分数展開できる。 1 + 1/2 = 3/2 = 1.5 1 + 1/(2 + 1/2) = 7/5 = 1.4 1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666... 1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379... …

55問目

http://projecteuler.net/index.php?section=problems&id=55 47は逆順にして足すと 47 + 74 = 121 で回文となる。349は 349 + 943 = 1292, 1292 + 2921 = 4213, 4213 + 3124 = 7337 と3回の操作で回文となる。196のように何度操作しても回文にならない数(Ly…

53問目

http://projecteuler.net/index.php?section=problems&id=53 1 ≤ n ≤ 100の n に対して、nCr が百万を超えるものがいくつあるか数える。 素直に求めます。 main = print $ euler053 100 euler053 :: Integer -> Int euler053 m = length $ filter (> 1000000…

54問目

http://projecteuler.net/index.php?section=problems&id=54 ポーカーの手を二人分千組含むファイルから、一人目のプレイヤーが勝つ組がいくつあるかを求める。 それぞれの手についてワンペアは1点、ロイヤルフラッシュは9点といった点数をつけ、その大小を…

52問目

http://projecteuler.net/index.php?section=problems&id=52 125874は2倍すると251748となり、元の数と同じ数字で構成されている。同様に2倍、3倍、4倍、5倍、6倍した数が全て同じ数字で構成されるような数を求める。 6倍しても桁数が変わらないことから、元…

51問目

http://projecteuler.net/index.php?section=problems&id=51 56003は3桁目と4桁目の数字を置き換えると、56003, 56113, 56333, 56443, 56663, 56773, 56993と7つの素数を構成する。同様に一部の数字を置き換えることで8つの素数を構成する数のうち、最小のも…

50問目

http://projecteuler.net/index.php?section=problems&id=50 41 = 2 + 3 + 5 + 7 + 11 + 13は6つの連続する素数の和として表現できる。百万未満の素数で、最も長く連続する素数の和となるものを求める。 連続する素数の和が百万未満で、長さが最も長くなると…

48問目

http://projecteuler.net/index.php?section=problems&id=48 11 + 22 + 33 + ... + 10001000の下10桁を求める。 僕は何もしてません。 main = print $ euler048 1000 10 euler048 :: Integer -> Int -> String euler048 m n = reverse $ take n $ reverse $ …

49問目

http://projecteuler.net/index.php?section=problems&id=49 1487, 4817, 8147のように、(i)どれも素数で、(ii)それぞれの数が他の数の並べ替えとなっている、4桁の等差数列を見つけ、それを繋げた12桁の数を求める。 手順は↓の通り。間違ってはいませんが、…

47問目

http://projecteuler.net/index.php?section=problems&id=47 2つの素因数を持つ数が最初に2つ連続するのは14 = 2 × 7、15 = 3 × 5のときである。4つの素因数を持つ数が最初に4つ連続するとき、その最初の値を求める。 素因数分解を行うのですが、そのと…

46問目

http://projecteuler.net/index.php?section=problems&id=46 Christian Goldbachは、「素数でない奇数は全て、平方数の2倍と素数の和として表せる」と予想したが、これは誤りだった。この予想を満たさない最小の数を求める。 どう表現するかというところはあ…

45問目

http://projecteuler.net/index.php?section=problems&id=45 五角数でも六角数でもある三角数のうち40755の次の数を求める。 六角数は三角数に含まれるので、五角数でかつ六角数のものを求めれば十分だったようです。そんなこととは知らず、真面目に求めてし…

44問目

http://projecteuler.net/index.php?section=problems&id=44 Pj+Pk と Pk-Pj がともに五角数であるような2つの五角数 Pj、Pk について、最小の|Pk - Pj|を求める。 解けたのですが、遅い…。これは何とかしないと。 改善案求む!! main = print $ euler044 …

43問目

http://projecteuler.net/index.php?section=problems&id=43 0から9の数字を1回ずつ使って作る数について1つ目の数字をd1、2つ目の数字をd2とするとき、d2d3d4が2で割り切れ、d3d4d5が3で割り切れ、d4d5d6が5で割り切れ、…、d8d9d10が17で割り切れるような数…

42問目

http://projecteuler.net/index.php?section=problems&id=42 英単語に対して、「SKY : 19 + 11 + 25 = 55」のように得点を計算する。約2000個の単語を含むファイルの中に、得点が三角数となる単語がいくつあるか求める。 これも問題をそのまま書き下すだけ。…

41問目

http://projecteuler.net/index.php?section=problems&id=41 もう一問。 1からnまでの数字を1回ずつ使って作った素数のうち、最大のものを求める。 大きいものから順に調べていって、最初に見つかったものを返します。 import Data.List main = print $ eule…

40問目

http://projecteuler.net/index.php?section=problems&id=40 0.123456789101112131415161718192021... のように自然数をつなげて作った小数のn番目の数字をdnとするとき、以下の値を求める。 d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000 これは…

39問目

三角形の周の長さp=120のとき、直角三角形になるような辺の組は以下の3通りある。 {20,48,52}, {24,45,51}, {30,40,50} 1000未満のpについて、組合せの数が最大となるものを求める。 a c で解を限定していますが、まだちょっと遅いです。制約条件が他にもあ…

38問目

192384576は、192×=192, 192×2=386, 192×3=576をつなげた数である。このように、ある数に1,2,..n(n>1)をかけた数をつなげて、1から9の数字が1回ずつ現れる数を作るとき、その最大のものを求める。 何の工夫もありませんが、問題を忠実に実装したら解けました…

37問目

3797→797→97→7、3797→379→37→3というように左右どちらから切り落としていっても全て素数となるような素数のうち、最初の11個を足し合わせる。 import Data.List main = print $ sum $ euler037 euler037 :: [Int] euler037 = take 11 $ filter truncatable $…

36問目

百万未満の数で、2進表記でも10進表記でも回文になるようなものを全て足し合わせる。 showIntAtBaseという関数を知らず、最初は自分で書いてしまいました。 import Data.Char import Numeric main = print $ sum $ euler036 999999 euler036 :: Int -> [Int]…

35問目

http://projecteuler.net/index.php?section=problems&id=35 197のように971,719と回転させても素数となるような素数が百万未満でいくつあるか求める。 素直に求めていきます。 import Data.List main = print $ length $ euler035 1000000 euler035 :: Int …

34問目

http://projecteuler.net/index.php?section=problems&id=34 各桁の数字の階乗の和が元の数と等しくなるような数を全て足し合わせる。 9の階乗は6桁なので、求める数は高々7桁だと分かります。(それ以上だと元の数の桁数が階乗の和の桁数より必ず大きくなる…

33問目

http://projecteuler.net/index.php?section=problems&id=33 49/98=4/8のように、分母と分子から同じ数字を除いても元の値と等しくなるような分数(1未満で分母と分子がともに2桁)を全て掛け合わせて、その分母を求める。 Ratioモジュールが便利です。 impo…

18問目再び

Project Euler - IMHO経由でEuler problems - HaskellWikiを知り、つらつら眺めてたのですが、以前に解いた18問目のもっとシンプルなコードが載ってました。 scanではなくfold、l(eft)ではなくr(ight)を使うのがポイントです。 ちょっと悔しい。 main = do…

32問目

http://projecteuler.net/index.php?section=problems&id=32 39 × 186 = 7254 のように、a × b = c の各数字を合わせると1から9の数字が1回ずつ現れる a × b を、すべて求める。 要件を満たすのは1桁×4桁、2桁×3桁のときなので、その範囲で全部調べます。 im…

31問目

http://projecteuler.net/index.php?section=problems&id=31 2ポンド(200ペンス)を1,2,5,10,20,50,100,200ペンスの硬貨で作るとき、何通りの組合せがあるか求める。 main = print $ euler031 [200, 100, 50, 20, 10, 5, 2, 1] 200 euler031 :: [Int] -> In…