Hatena::ブログ(Diary)

計算機と戯れる日々 このページをアンテナに追加 RSSフィード

2011-09-25

problem38

パンデジタル数になるのは 少なくともn<=9

連結される数はn=2のとき最初が4桁と次が5桁になるので 4999<x<9999 という軛がある。

面倒なので x<9999 , 2<=n<=10で実装すると

import Data.List

main = print $ maximum $concat $ map g [9..9999]

f::Int->Int->Int
f x y = read $foldl (++)  [] $map show $zipWith (*) [x,x..] [1..y]

g x = filter isPandigital $ map (x `f`) [2..9]

isPandigital x = "123456789" == ( sort $ show x)

concatしているところと isPandigital がちょっとダサイがまあいいでしょう。

Prelude Main> 932718654
(1.26 secs, 2637538728 bytes)

problem 40

着陸したら全く終わらなかった。


main = print $ p

p = map (d.(10^)) [0..6]

d x = (g 190000)!!(x-1)

g x = foldl f "" [1..x]
      where f x y = x++(show y)

ちょっとカンニングして以下。

Prelude Data.Char> product [digitToInt $ ([0..] >>= show) !! x | x<- take 7 $ iterate (*10) 1]
210
(0.06 secs, 132123632 bytes)

concatMapの実装がすごいんだろうなー なぜこんなに速いのか理解できない。

2011-09-17

problem 33

いまいち美しくない。

Prelude List> let f a b c d = ((a==c && (a*10+b)/(c*10+d)==b/d)||(a==d&&(a*10+b)/(c*10+d)==b/c)||(b==c&&(a*10+b)/(c*10+d)==a/d)||(b==d&&(a*10+b)/(c*10+d)==a/c))&&(b/=0&&d/=0)&&(a/=c&&b/=d) in  map product $ transpose [[x,y]|x<-[10..99],y<-[10..99], div x y<1,f (read [(show x)!!0]) (read [(show x)!!1]) (read [(show y)!!0]) (read [(show y)!!1])]
[387296,38729600]
it :: [Integer]
(0.20 secs, 124395232 bytes)

problem34

なぜ5桁以内かを言えていない。

Prelude List> let f x=foldr (*) 1 [1..x]; g x=x==(sum $ map (f.read.(:[])) $show x)  in sum [x|x<-[3..100000],g x]
40730
it :: Integer
(5.22 secs, 3383707256 bytes)

problem35

ローテート関数が見つからなかったので自作

Prelude Data.Numbers.Primes> let g (x,y) = y++x ;f::Int->[Int];f x = map (read.g.(`splitAt` (show x))) [1..((length.show) x)-1] in length [x|x<-[1..1000000],isPrime x,all isPrime $ f x]
55
it :: Int
(3.13 secs, 4809034056 bytes)

probelm36

基数変換がダサい

Prelude> let d2b x = if (div x 2)/=0 then (d2b (div x 2))++[mod x 2] else [mod x 2]  in sum [x|x<-[1..1000000],show x==reverse (show x),d2b x==reverse (d2b x)]
872187
it :: Integer
(1.20 secs, 877606456 bytes)

problem37

primesとtailsを使ったので楽にできた。

Prelude Data.List Data.Numbers.Primes> let f x= all (isPrime.read) $ filter (/=[]) $ tails (show x) ++ (map reverse (tails (reverse (show x)))) in sum $ take 11 [x|x<-primes,x>10,f x]
748317
it :: Integer
(4.51 secs, 2714735608 bytes)

2011-06-17

rubyでuniq -c

rubyでuniq -cをやる

>> [1,2,2,1,2,3,4,2,1,2,4,3,1,3].inject(Hash.new(0)){|r,i|r[i]+=1;r}
=> {1=>4, 2=>5, 3=>3, 4=>2}

最後にrを評価するのではまった。

>> {1=>2}[1]+=1
=> 3

だもんな…

別解

>> [4,1,2,2,1,2,3,4,2,1,2,4,3,1,3].group_by{|i|i}.map{|k,v|[k,v.size]}
=> [[4, 3], [1, 4], [2, 5], [3, 3]]

injectの勝ち

追記 2011/06/18 00:18:57:

$ ruby18 -vlne '(h||=Hash.new(0))[$_]+=1;END{for k,v in h do print k," ",v end}' A

ruby 1.8.7 (2008-10-14 revision 18426) [i686-linux]

yahoo 2

google 1

goo 1

msn 2

[ruby-list:45575

以前にメーリングリストであったらしい。

 (h||=Hash.new(0))[$_]+=1

これはすごいな。||= の使い方わすれてた。

2011-06-15

bashでmap

大量ファイルを操作するときには forは inの後を展開してから動作するために困ってた。

whileとreadを組み合わせれば 関数型言語のmapのように動作する。

$ seq 1 10 | while read i ; do echo $(($i+2)) ; done | while read i ; do echo $(($i*2)) ; done

まさにrubyのメソッドチェーン。ってrubyのほうが |を.にしただけだよな。

2011-03-27

kvm qemuにて ゲストwindowsから ホストsambaをマウントする

kvm qemuにて ゲストであるwindowsから、ホスト上のsambaをマウントするには

/etc/samba/smb.confに以下を追加

[mountpoint]
   comment = mountpoint
   path = /tmp/mountpoint
   guest ok = yes

ゲスト上のwindowsからはホストは 10.0.2.2なので まずcmdで ping 10.0.2.2 を確認した後

エクスプローラ->ツール->ネットワークドライブの割り当てにて \\10.0.2.2\mountpoint で終了。