Hatena::ブログ(Diary)

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

2011-07-03

rubyの car,cdr もしくは haskellにおける head tail last init

rubycar,cdr もしくは haskellにおける head tail last initについて

haskellにおける head tail lastはそれぞれ

>> [1, 2, 3, 4, 5].first
=> 1
>> [1, 2, 3, 4, 5].drop(1)
=> [2, 3, 4, 5]
>> [1, 2, 3, 4, 5].last
=> 5

だとおもう。でもなんかinit(最後の要素をのぞく)がmodule Enumerableになさそう。

>> module Enumerable ; def init ; self.take(self.size-1) ; end; end
=> nil
>> [1, 2, 3, 4, 5].init
=> [1, 2, 3, 4]

なんでないのかな。せめて drop_from_last(n)みたいなのでもあればいいのに…(last->behindかな?)

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

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

2010-10-02

project euler 18 67

最後の二行を 左を合わせてzipWith (+)したものと 右を合わせてzipWithしたものを比較し残りのものと置換して最後までやる

上からたどる方法は配列でも使わないと無理、速度的にも無理だけど・・・


main = print $ g a67

g x | length x==1 = x
    | otherwise   = g ((init (init x)) ++ [zipWith max (zipWith (+) (last x) (last (init x))) (zipWith (+) (tail (last x)) (last (init x)))]\
)

a0=[[3],
    [7,4],
    [2,4,6],
    [8,5,9,3]]

a18=[[75],
   [95,64],
   [17,47,82],
   [18,35,87,10],
(略)

リストを最後から参照するのだからfoldr の出番だな。

main = print $ g a67
f x = foldr1 f2 x
f2 x y = zipWith max (zipWith (+) x y) (zipWith (+) x (tail y))

だいぶすっきりした。

GHCiでも1秒未満で計算する


そうか、再下行のでかい方と足せば大丈夫なんだ

f' x = foldr1 f3 x
f3 x y = zipWith (+) x (zipWith max y (tail y))

ということはこれワンライナーになるな。

main = print $ foldr1 f4 a67 where f4 x y= zipWith (+) x (zipWith max y (tail y))

すげぇ。

2009-12-31

rubyにてメールヘッダを連想配列に加工する

pop3やimapをアクセスする場合にはメールヘッダの解析をライブラリがやってくれるんだがfetchmail,procmailにてメールを加工するときに適当なライブラリが存在していないし、そこら辺にも転がっていない。

ので作った。

open("mail.txt").read=~/\A(.*?)\n\n(.*)\Z/m
head,body=$1,$2
head=head.split(/\n/).map{|i|i[0]+i}.join("\n")[1..-1].split(/\n[^\s]/).map{|i|i.split(/\n\s\s/).join("")}
head=Hash[*head.map{|i|i=~/^(.*?):\s(.*)$/;[$1,$2]}.flatten]

これでOK、最後の行を消すと連想配列でなくヘッダをぶんりしたものになる。三行目の/\n\s\s/を/\n\s/にすると改行+空白を原文のままにする。

使い方。

p head["To"]
p head["Subject"]
####デコードしたい場合
require 'nkf'
p NKF.nkf("-w",head["Subject"])

2009-06-01

ubuntu9.04に外部fontを追加しデフォルトフォントにするには

meiryoKeGothicなどの外部フォントをubuntu9.04に追加する。

今までは~/.fonts/以下にインストールしていたが他ユーザにも適用できるようにする。

フォントをインストール

$ cd /usr/share/fonts/truetype/
$ sudo tar xzvf ~/ttf-ms.tgz
$ ls ttf-ms
meiryoKeGothicB.ttc  meiryoKeGothic.ttc

まあ、/usr/share/fonts/truetypeにディレクトリを掘ってttfフォントを置けばOK

デフォルトにする

/etc/fonts/conf.avail/69-language-selector-ja-jp.confを書き換える

$ sudo sed -re "s/IPAMonaPGothic/MeiryoKe_PGothic<\/string>\n\t\t\t<string>IPAMonaPGothic/" -e "s/IPAMonaGothic/MeiryoKe_Gothic<\/string>\n\t\t\t<string>IPAMonaGothic/" -i /etc/fonts/conf.avail/69-language-selector-ja-jp.conf

以下のようになっていればOK

<fontconfig>

	<match target="pattern">
		<test qual="any" name="family">
			<string>sans-serif</string>
		</test>
		<edit name="family" mode="prepend" binding="strong">
			<string>MeiryoKe_PGothic</string>
			<string>IPAMonaPGothic</string>
			<string>IPAPGothic</string>
			<string>VL PGothic</string>
			<string>Sazanami Gothic</string>
			<string>Kochi Gothic</string>
		</edit>
	</match> 
	<match target="pattern">
		<test qual="any" name="family">
			<string>serif</string>
		</test>
		<edit name="family" mode="prepend" binding="strong">
			<string>IPAMonaPMincho</string>
			<string>IPAPMincho</string>
			<string>Sazanami Mincho</string>
			<string>Kochi Mincho</string>
		</edit>
	</match> 
	<match target="pattern">
		<test qual="any" name="family">
			<string>monospace</string>
		</test>
		<edit name="family" mode="prepend" binding="strong">
			<string>MeiryoKe_Gothic</string>
			<string>IPAMonaGothic</string>
			<string>IPAGothic</string>
			<string>VL Gothic</string>
			<string>Sazanami Gothic</string>
			<string>Kochi Gothic</string>
		</edit>
	</match> 
</fontconfig>

最後にfc-listででも確認とっておけばOK