/ 最近 .rdf 追記 設定 本棚

log[2011-02-22]



20110222() 客の意識『半額を買って悪いから<言い換えはナイスだけど俺の意識は違うワゴンセールに限らずーパーやコンビニのすかすかの棚って残飯あさりしてるみたいで購入意欲が減退するそれ「他の客が買わなかったものなわけだししかも後者は半額でもないっして半額の商品を買うことがうしろめたいなんてことはないそれからそれから古い商品を寄せ集めるのはうまくないそれは安いものを探してる人には役立つけどその商品を必要としていてなおかつすぐに消費することがわかってる人(俺だ)にとっては見つけにくくなってる


20110220() tDiaryrecent_listが特定の条件で動かない話>[tDiary-devel] SAFE=1recent_list が動かない そういえば昔recent_list.rbを書き直したことがあった>20090114p01 多分に実験的な方法でだけど……自分で書いたものながらいま読むh.fetch(k){loaded_months[k]}の行の意図が不可解だったよく読むとこれは diariesに新しいアクセサを追加しているわかりやすく書き直すとこういうこと>h.fetch("yyyymmdd"){loaded_months["yyyymm"]} うまくないなあ


20110217() 「ロジクール ワイヤスマウス M515を発売< ポイM515の底面にあトラッキングセンサー部分は…(中略)…マウスの動作不良の原因になりがちな繊維やホコリトの毛などがセンサー部分に入り込むのを防ぎます「マウスを握る手を検知した時にだけ駆動させる省エネセンサーが内蔵されておりソファの上などで起こりうる意図しないマウスの動きを防ぐとともに…(後略)どちらも MX610に対して持っていた不満点だ良い


20110213() 「青空が降る少年」が「恋しさと せつなさと 心強さとと同じくらい好きだ

最終更: 2011-02-20T21:45+0900

[ProjectEuler] Q58, Q59, Q60

 Q58

10%未満っていうのは絶妙なポイトなのかな全然 9%未満に落ちない

def prime? x
	return false if x < 2
	return true if x == 2
	quo, rem = x.divmod(2)
	return false if rem == 0
	t = 1
	while t < quo
		t += 2
		quo, rem = x.divmod(t)
		return false if rem == 0
	end
	return true
end

x, t = 1, 0
primes_on_diagonals = 0
loop{
	t += 2
	3.times{
		x += t
		primes_on_diagonals += 1 if prime? x
	}
	x += t
	puts "#{primes_on_diagonals} primes out of #{2*t+1} (#{100*primes_on_diagonals/(2*t+1)}%, side length=#{t+1})"
	exit if 100 * primes_on_diagonals / (2*t+1) < 10
}

 Q59

  1. 暗号化キーの長さが 3文字なのがわかってるので数列を 3列に並べて各列を眺める
  2. 英単語には eが一番使われるとか単語では theが再頻出だとかの統計データがあるらしい(と書いてあるのを何度も目にしたが実際のデータは見たことがな)
  3. 文章なら文字としてはスペースが一番多いはずだ
  4. 単語で theが一番多いならtheの前後の空白は右下に向いて(11列目)(22), (12列目)(23), (13列目)(21) の並びで現れるはずだ
  5. というかんじでマジックナンバーが出てきた
  6. 問題文のサマリUsing a brute force attack, can you ...って書いてあるしまった
encrypted_text = [79,59,12,...,22,73,0,0] # last 2 elements are padding.
text = ""
0.step(encrypted_text.size-1, 3){|i|
	text += (encrypted_text[i+0] ^ (71 ^ " "[0])).chr
	text += (encrypted_text[i+1] ^ (79 ^ " "[0])).chr
	text += (encrypted_text[i+2] ^ (68 ^ " "[0])).chr
}
text.chop!.chop! # remove padding
puts text
puts "sum: #{text.bytes.inject(:+)}"

 Q60

  1. 素数二つ(A,B)に分割できてローテトしても素数な素数(AB,BA)a set of 2 primes (A,B)
  2. (AX,XA),(BX,XB)1の条件を満たす 2 sets of 2 primes が見つかるa set of 3 primes (A,B,X)
  3. (AY,YA),(BY,YB),(XY,YX)1の条件を満たす 3 sets of 2 primesが見つかるa set of 4 primes (A,B,X,Y)
  4. (AZ,ZA),(BZ,ZB),(XZ,ZX),(YZ,ZY)1の条件を満たす 4 sets of 2 primesが見つかるa set of 5 primes (A,B,X,Y,Z)

1を満たす素数を発見しながらそれを使って1の集合から22の集合から33の集合から4要素をプロモトしていけばよさそう

# 寝る前にやる。

寝てしまった答えが出ない素数を分割するんでなく素数のペアを組み合わせて素数かどうか判定した方がいいかもしれないそろそろ身にしみて理解してきたけど素数って印象よりありふれ過ぎてる


 @2011-02-17

っとくらい時間がかかってもいーやって考えてたけど何日もかけても四つ組みが 7つと五つ組が 0個しか見つからないことがわかったので1分以内に答えを出すべくもうちっと考える

  1. 小中学生の頃に読んだ数字遊びの本から得た知識によれば10進表記の各桁の和が 3の倍数の数はそれ自体も 3の倍数だというだというwww
  2. 各桁の和を 3で割った余りが 0の素数は 3
  3. 各桁の和を 3で割った余りが 1の素数と 2の素数を組にするとそれをつなげた数は 3の倍数になってしまい素数ではなくなるので組にできない
  4. 各桁の和を 3で割った余りで素数を分類すると 5つ組みとして考えられるのは (0,1,1,1,1), (0,2,2,2,2), (1,1,1,1,1), (2,2,2,2,2)4パターンだ
  5. 3桁までの素数で総当たりしてみよう
  6. 見つからなかったので 4桁までで総当たり
def prime? x
	return false if x < 2
	return true if x == 2
	quo, rem = x.divmod(2)
	return false if rem == 0
	t = 1
	while t < quo
		t += 2
		quo, rem = x.divmod(t)
		return false if rem == 0
	end
	return true
end

set012 = [[],[3],[]]
require 'mathn'
Prime.new.each{|prime|
	break if 10000 <= prime
	dmod3 = prime.to_s.bytes.inject(0){|sum,byte| sum+byte-?0 } % 3
	set012[dmod3] << prime
}
set1, set2 = set012[1], set012[2]
set2[0] = 3
# set1 = [3,7,13,...]
# set2 = [3,5,11,...]

make_group_of_two = lambda{|set|
	pair = {}
	0.upto(set.size-2){|i|
		(i+1).upto(set.size-1){|j|
			if prime?("#{set[i]}#{set[j]}".to_i) and prime?("#{set[j]}#{set[i]}".to_i) 
				(pair[[set[i]]]||=[]) << set[j]
			end
		}
	}
	return pair
}
group1, group2 = make_group_of_two.call(set1), make_group_of_two.call(set2)

extend_group = lambda{|g|
	group = {}
	g.each_pair{|rest, last1s| # rest + one of last1s = group
		last1s.each{|last1|
			next1s = last1s
			gg, out = rest.clone, last1
			gg.size.times{|i|
				gg[gg.size-1-i], out = out, gg[gg.size-1-i]
				next1s &= g[gg]||[]
			}
			if ! next1s.empty?
				group[rest+[last1]] = next1s
			end
		}
	}
	return group
}
group1, group2 = extend_group.call(group1), extend_group.call(group2) # sets of 3 primes
group1, group2 = extend_group.call(group1), extend_group.call(group2) # sets of 4 primes
group1, group2 = extend_group.call(group1), extend_group.call(group2) # sets of 5 primes

printer = lambda{|rest, last1s|
	last1s.each{|last1|
		puts %[#{rest.inject(&:+)+last1}:\t#{rest.join("\t")}\t#{last1}]
	}
}
group1.each(&printer)
group2.each(&printer)

分単位の時間で答えはでたけどもその五つ組の合計が意外に大きくて10000以上の素数を組に加えても最小の組み合わせになりうる計算量の増大の仕方がひどくてこれ以上桁数を増やして試行するのは無理だというのに


 「だという わらわらわら@昨日

ゃないよね

q = a 0 + 10 a 1 + 10 2 a 2 + + 10 n a n ( a n は 0以上 9以下の整数) = ( a 0 + a 1 + a 2 + + a n ) + 9 a 1 + 99 a 2 + + ( 10 n - 1 ) a n

a0+a1+a2++an3の倍数の整数 q3の倍数です。

たしか 4の倍数についても同じような判定規則があった気がした忘れたけど

たしか 5の倍数についてもどこかの桁を見るだけで(


 @2011-02-19

4100を作るから下2桁だ510を作るから下1桁だけを見ればいい

 「計算量の増大の仕方がひどくて

一番時間を食ってるのは make_group_of_two. 異なる二要素の組み合わせということで n2-n 回の素数判定を行ってる素数判定自体も nの大きさに比例する(1:1ではないけど)ープを持っている大変なはずだ

とりあえず今の素数判定より賢い素数判定があるのはわかってるけどわからないので使ってない(:わかる =>って, 理解でき) 丁寧にコドを読んだらわかるかもだけどそれはチっぽい大学入試の数論関係の問題だって解答をチラ見したら誰だって理解できんだよ


20110212() テイラー展開とかマクローリン展開言葉は出てこなかったけど積分の演習問題として高校で出てきてた(ことを後に知った)コンピータ向けの計算だよね展開して多くの項を計算すればするだけ精度のいいπが求まると昨日の Q57から連想したんだけど平方根の計算はまた別っぽい手計算で平方根を求める方法は俺の時代の教科書からは消えてたよ消えてたといえば行列を使った回転も消えてたよ高校数学は新しく習う概念がバラバラのままなんだよ統合してよ///冪剰余 - Wikipediaっていう言葉があるのね(ギブアップした Q250) 「剰余n-進展開 (Wikipedia(ja):)」→p進数 - Wikipediaとんでもないところに飛んでしまった

最終更: 2011-02-13T04:35+0900

やばかった

7500の正の約数は何個ある

Fラン大学の実態:ハムスター速報

素因数の数を数えてしまってたその間違いに気づいたら今度は1って約数に数えるの?その数自身も約数のうち?なんて約数の定義が消えかかってる(補足素数の定義を思い出せば疑問は解け)

復習~

  1. 7500 = 5×5×5×5×3×2×2
  2. 約数は 5i×3j×2k (i=0,1,2,3,4, j=0,1, k=0,1,2) で表される(0乗が 1とか0の階乗が 1とか何気に落とし)
  3. 組み合わせは 5×2×3 = 30通り
  4. 重複はないので約数の数も 30
  5. たぶん

コメトに↑そのまんま書いてあった(変数名まで一緒)無駄なエトリになってしまった

最終更: 2012-12-12T02:17+0900

[tDiary] MathMLが使いたかったので>ひらくの工房 - tDiary XHTML化キ

  • HTMLドなんていらないから拡張子は xhtmlでなく htmlとか
  • \times より × って書きたいとか
  • <option selected="selected"> <input checked="checked"> みたいに属性名を省略してない HTMLもあるのよ置換しすぎないでとか

適当にカスタマイズして設置した

XHTML化キトの存在は投稿されたアナウスを読んで知ってたんだけどXHTML好きにもかかわらず今まで導入してなかったのは日記に数式を書く機会がなかったのと出力段階での文字列置換による XHTML化が乱暴に思えたから結局他に方法がないので目をつぶった

閲覧不可能になった日記がないか月別表示で全日記を表示してみたら 10か所くらい見つかったパターンは以下の通り

  • プラグインが埋め込む JavaScriptに含まれる & 記号
  • etDiaryスタイルがエスケープしてくれなかった本文中の & 記号
  • プラグイン記法( {{~}} )で直接埋め込んだ HTML片に含まれる & 記号

 JavaScript&

<script>タグの中であっても &&amp; と書かなければいけない不等号もでも if(a &amp;&amp; b) {} とか置換してしまったらアホだCDATAセクションを使う

scriptタグが解釈できないブラウザなんて PCを手に入れた当時から持ってなかったので

<script><!--
--></script>

なんて最初から書かなかったしXHTMLを知ってからは下のように書くことにしてる

<script>/*<![CDATA[*/
/*]]>*/</script>

コメトで囲うのは JavaScriptとして正しくあるためより字数の少ない行コメトにしないのはなにかでエラーになったからMSがリリースしてた JavaScriptを暗号化(難読化)するツールに <script>タグを含んだ HTMLァイルを通したときだったか……

 etDiary&

但し書きを付けても無駄HTMLと日本語は混ぜるな危険中途半端な HTMLの隠蔽は悪tDiaryスタイルと etDiaryスタイルより Wikiスタイル

 手書き HTML&

自業自得さすがにタグに挟まれた部分に &<, > を放置してたわけではない

<a href="ttp://hoge/script.cgi?a=b&c=d">
<img src="ttp://hoge/script.cgi?a=b&c=d">

すべてこの形の & がエラーになっていたHTMLを出力するスクリトでは属性値は機械的に必ず HTMLエスケープするようにしてるんだけど手書きだと上のような (X)HTMLは正しく見えてしまうのか忘れられてたこんなことがあるとやっぱりセミコロンで区切りたいねえ

それにしてもちらちら目に入る古い日記が恥ずかしくて死ねる読む人間もそもそも読める内容もないのであえて気づかぬふりで放置するけども


20110211()

最終更: 2011-02-12T22:42+0900

[ProjectEuler] Q56, Q57

 Q56

Bignumはできれば使いたくないa100未満なので 8桁ずつ

answer = [0, 0, 0] # sum, a, b
1.upto(99){|a|
	digits = "1"
	1.upto(99){|b|
		sum = 0
		carry = 0
		0.step(digits.size-1, 8) {|i|
			l, r = [0, digits.size-i-8].max, digits.size-i
			carry, digits8 = (digits[l...r].to_i * a + carry).divmod(100000000)
			digits8 = "00000000#{digits8}"[-8,8]
			digits[l...r] = digits8
			digits8.each_byte{|byte|
				sum += byte - ?0
			}
		}
		if carry != 0
			digits8 = carry.to_s
			digits = digits8 + digits
			digits8.each_byte{|byte|
				sum += byte - ?0
			}
		end
		if answer[0] < sum
			*answer = sum, a, b
		end
	}
}
p answer

 Q57

とかいいながら Bignum

count = 0
numer, denom = 1, 1
1000.times{
	numer, denom = numer + denom + denom, numer + denom
	count += 1 if numer.to_s.length != denom.to_s.length
}
p count

20110210() 「それは仕様ですってそんなに嫌いではない発言者にその宣言を遵守する意志があるのなら言われた方はその宣言を以て即座にその仕様(と手元の実装)に依存できるった方は修正の手間がないし挙動を変えて周囲(期待と実際の違いに気付いていなかった方の集団)を騒がせるおそれもないとはいえ一般に「仕様のわけねーだろバグだよバグって言いたくなるようなものに対し「これは仕様でしょうか?ってのも嫌みったらしく聞こえそうなので控えたい何回かやってるけど

最終更: 2011-02-10T23:58+0900

それは無理でし>クロネコヤ(金沢物流シスム支)

経過荷物受付02/1012:36金沢物流シスム支店
経過発送02/1012:36金沢物流シスム支店
最新配達完了02/1012:06○○センタ

受付は昨日のはずだこのせいで一切トラッキングができなくて今日着くのか明日着くのかがわからなかった時間帯指定で不在はくらいたくないでしょうに

最終更: 2011-02-11T00:59+0900

[SakuraEditor] SourceForge.net Repository - [sakura-editor] Revision 1887

Fix: 検索(ールバ)を使うとプラグインコマドが実行される(2)

検索ボックスのコドをほとんどコピーした自作ツールバーボタンもやばい気がするもののCBN_SELCHANGEはツールバーボタンで処理してるんだよね処理しなかったメッセージが誤った取り扱いを受けるということなんだろうわからないよん

>>log[2008-06-04-p01] 現在適用されているファイルタイプを表示/変更するツールバーボタン


20110209() カレーライスのライスは右か左答えはでてるんだろう右利きだから左にご飯があると1.スプーンをご飯に突き立てる2.右側からカレーを巻き込みながらご飯のブロックをすくい上げるという動作がスムーズに行えるななんて事を考えるんだけどっちゃけどっち向きでも食べられるし量が減ってくるとお皿に熱を奪われたくなくて縦向きに持って手前に寄せて食べてる

最終更: 2011-02-10T04:56+0900

[ProjectEuler] Q51, Q52, Q53, Q55

 Q51

ただただ手と CPUを動かすだけで精一杯(頭は役に立ってない)

primes = [2]
is_prime = lambda{|x|
	result = true
	primes.each{|prime|
		quo, rem = x.divmod(prime)
		if rem == 0
			result = false
			break
		end
		break if quo < prime
	}
	return result
}

# replace 2 digits or 3 digits. キ・メ・ウ・チ
def find_8_prime_family(a)
	return [] if a.size < 8
	a.map!{|x| x.to_s }
	h = Hash.new{|h,k| h[k] = [] }

	# 2 digits
	0.upto(a.first.size-3){|i|
		(i+1).upto(a.first.size-2){|j|
			h.clear
			a.each do |prime|
				if prime[i] == prime[j]
					h[prime[0...i]+prime[(i+1)...j]+prime[(j+1)...(prime.size)]].push prime
				end
			end
			h.each do |_,v|
				return v if v.size == 8
			end
		}
	}

	# 3 digits
	0.upto(a.first.size-4){|i|
		(i+1).upto(a.first.size-3){|j|
			(j+1).upto(a.first.size-2){|k|
				h.clear
				a.each do |prime|
					if prime[i] == prime[j] and prime[j] == prime[k]
						h[prime[0...i]+prime[(i+1)...j]+prime[(j+1)...k]+prime[(k+1)...(prime.size)]].push prime
					end
				end
				h.each do |_,v|
					return v if v.size == 8
				end
			}
		}
	}

	return []
end

x = 1
start = 0 # start of primes of a width.
loop {
	x += 2
	next unless is_prime.call x
	print "#{x}\r"
	if primes[start].to_s.length != x.to_s.length
		a = find_8_prime_family primes.last(primes.size-start)
		if ! a.empty?
			puts a.sort.join(" ")
			exit
		end
		start = primes.size
	end
	primes.push x
}

 Q52

桁数ごとに探索範囲を決めて総当たり

問題が xについても同じ数の組み合わせであることを求めてると思わなくてチックしてないけど結果的に x2x,3xなんかと同じ数字で構成されてた

digits = 10
loop {
	digits *= 10
	(digits/2).upto((digits*10-1)/6){|x|
		print "#{x}\r"
		x2 = (x*2).to_s.split(//).sort
		if [3,4,5,6].all?{|n|
			x2 == (x*n).to_s.split(//).sort
		} then
			puts [1,2,3,4,5,6].map{|n| x*n }.join(" ")
			exit
		end
	}
}

 Q53

浮動小数点数なんてファジーなものを使っちったよMath.sqrtの使用をこれまで頑なに避けてたのも結果が Floatになるからだったり

count = 0
23.upto(100){|n|
	cmb = 1.0
	1.upto(n/2){|r|
		cmb /= r
		cmb *= (n-r+1)
		count += (n-r == r) ? 1 : 2 if 1_000_000 < cmb
	}
}
p count

 Q55

問題文が難しかった3割ぐらいは推測

っけなく答えが出たので to_s.reverse.to_i みたいなのをなくすべく、Integer#reverse を自作してみたらかえって遅くなったし

class Integer
	# 負数については考えてない。
	def reverse
		x = 0
		this = self
		begin
			this, rem = this.divmod(10)
			x = 10*x + rem
		end while 0 < this
		x
	end
end

count = 0
10.upto(10_000-1){|x|
	is_lychrel = true
	50.times{
		x = x + x.reverse
		if x == x.reverse
			is_lychrel = false
			break
		end
	}
	count += 1 if is_lychrel
}
p count

20110208()

最終更: 2011-02-09T20:16+0900

[ProjectEuler] Q50

 Q50

  1. 100万未満の素数リトを作成
  2. トをコピーして作業領域とする
  3. コピーしたリトの要素に一つ右の位置の素数二つ右の位置の素数以下略を加えていき都度和が素数かどうか確かめる

時間がかかるので逐一進捗を表示してるこの問題に魔法の一手なんてあるのかね

primes = []
is_prime = lambda{|x|
	result = true
	primes.each{|prime|
		quotient, remainder = x.divmod(prime)
		if remainder == 0
			result = false
			break
		end
		break if quotient < prime
	}
	return result
}
2.upto(999_999){|x|
	primes.push x if is_prime.call x
}
puts "#{primes.size} primes under 1 million."

work = primes.dup
step = 0
primes_found = []
live_elements = work.size
while 0 < live_elements
	step += 1
	primes_found.clear
	live_elements = 0
	print "step #{step}\r"
	0.upto(work.size-1-step){|i|
		work[i] += primes[i+step]
		if work[i] < 1_000_000
			live_elements += 1
			primes_found.push work[i] if is_prime.call work[i]
		end
	}
	if primes_found.empty?
	elsif primes_found.size < 10
		puts "step #{step}: #{primes_found.join ' '}"
	else
		puts "step #{step}: #{primes_found.size} primes"
	end
end

魔法の一手はなくても……

  • 素数列の作成と和の評価を同時進行にできるかも
  • 作業領域の範囲の狭め方が下手
  • 奇数ステップ(偶数個の素数の和)は不要
  • 100万に近い素数は不要(それを一つ加えただけで 100万を超えるんでは項数を稼げな)
  • 項数の上限は求められる

答えを出した後でググるのが楽しいーラムは読んでないけど多分これ以上ないっていうような答えが書いてありそうで面白くなさそうな気がしてる(理解できない数学的知識が使われてたらprint XXXXXXX(answer); って書かれてるのと変わらないか)


20110207() 間違いさがし『コド メシン Aの背表紙COLD MEDICINE CAPUSULE Aって書いてある

最終更: 2011-02-09T01:05+0900

[ProjectEuler] Q47, Q48, Q49

 Q47

昨日よりちっとはマシになったかとアホすぎた素数判定を素因数の数を数える処理と一体化したでも 10秒以上かかります。

primes = [2]
have4primefactors = []

num_of_factors = lambda{|x|
	prime_factors = 0
	primes.each{|prime|
		quotient, remainder = x.divmod(prime)
		if quotient < prime
			prime_factors += 1
			break
		end
		if remainder == 0
			prime_factors += 1
			break if 4 < prime_factors
			x /= prime while x % prime == 0
			break if x == 1
		end
	}
	return prime_factors
}

x = 2
loop {
	x += 1
	print "#{x}\r"
	case num_of_factors.call(x)
	when 1
		primes.push x
		have4primefactors.clear
	when 4
		have4primefactors.push x
		p have4primefactors.first if have4primefactors.length == 4
	else
		have4primefactors.clear
	end
}

 Q48

恥ずかしいほどまっすぐで乱暴なスクリトだけどコンソールの表示も待てないくらいーウトで答えが出るんだから仕方がない

p (1..1000).inject(0){|sum,x| sum + x**x }

 Q49

  1. 4桁の素数リトを作る
  2. トから条件を満たす二つの素数を選ぶ
  3. 計算で求めた三番目の数(三つのうち一番大きい)が条件を満たすか調べる

10秒くらいかかります。

primes = []

is_prime = lambda{|x|
	result = true
	primes.each{|prime|
		quotient, remainder = x.divmod(prime)
		if remainder == 0
			result = false
			break
		end
		break if quotient < prime
	}
	return result
}

2.upto(9999){|x|
	primes.push x if is_prime.call x
}

primes_4digit = primes.last(primes.length - primes.rindex{|x| x < 1000 } - 1)
0.upto(primes_4digit.size-1){|i|
	p = primes_4digit[i]
#	next if p == 1487
	(i+1).upto(primes_4digit.size-1){|j|
		q = primes_4digit[j]
		r = q + q - p
		next if p.to_s.split(//).sort != q.to_s.split(//).sort or
		        q.to_s.split(//).sort != r.to_s.split(//).sort
		k = nil
		(j+1).upto(primes_4digit.size-1){|_k|
			if r == primes_4digit[_k]
				k = _k
				break
			elsif r < primes_4digit[_k]
				break
			end
		}
		if k
			puts "#{p} #{q} #{r}"
#			exit
		end
	}
}

20110206()

最終更: 2011-02-07T05:28+0900

[ProjectEuler] Q46, Q47

 Q46

squares[]はソト済みなのに .include?()でそれを活かせないのが不満

primes = [] # Omit 2. Even prime is not needed.
squares = [1]
def prime?(n)
	return false if 0 == n%2
	3.step(n/2, 2) {|x|
		return false if 0 == n%x
	}
	return true
end

x = 1
loop {
	x += 2
	squares.push((squares.size+1)**2) if squares.last < x
	if prime?(x)
		primes.push x
		next
	end
	print "#{x}\r"
	next if primes.any?{|prime| prime < x and squares.include?((x-prime)/2) }
	p x # answer
	break
}

 Q47

何の工夫もないのですんごく時間がかかる

def prime_gt2?(n)
	return false if 0 == n%2
	x, upper_bound = 3, n/2
	while x <= upper_bound
		upper_bound, remainder = n.divmod(x)
		return false if 0 == remainder
		x += 1
	end
	return true
end

primes = [2]
have4primefactors = []
have4primefactor = lambda{|x|
	num_of_factors = 0
	primes.each{|prime|
		if x % prime == 0
			num_of_factors += 1
			break if 4 < num_of_factors
			x /= prime while x % prime == 0
		end
	}
	return num_of_factors == 4
}

x = 2
loop {
	x += 1
	print "#{x}\r"
	if prime_gt2? x
		primes.push x
		have4primefactors.clear
	elsif have4primefactor.call(x)
		have4primefactors.push x
		p have4primefactors.first if have4primefactors.length == 4
	else
		have4primefactors.clear
	end
}

20110205()

最終更: 2011-02-05T10:26+0900

[ProjectEuler] Q14, 『珠玉のプログラミング, Collatz予想

っと前の日記から……

Q14

この漸化式『珠玉のプログラミングで見たどうして収束するのかわからなかった

log[2011-01-24] Q11, Q14, Q15, Q16, Q18, Q67, Q20, Q22, Q24, Q25, Q26

見たっていうのはコラム4の問題で

4.6問題

5.入力xが正の整数であるとき以下のループが終了することを示してください

while x != 1 do
  if xが偶数なら
    x = x/2
  else
    x = 3*x+1

これがまんコラッツの問題 - Wikipedia)と呼ばれる未解決の問題だということにd.y.d.を読んでいて気がついた本の巻末のヒトを読み直してみたらこんなことが書いてあるし

もしこの問題が解けたら近くの大学の数学科に急いで行って博士号を申請しましょう

ひどい()わからなくて当然だ遅刻学生が黒板の問題を宿題だと思って解いて提出したらそれは未解決問題だったとかいうのはお話の世界なんだから


20110203()

最終更: 2011-02-05T05:33+0900

[ProjectEuler] Q45

 Q45

無駄にこったねえ一瞬 JavaScriptで書こうとしたしたせいかlambda多用

generators = [
	lambda {
		n, tn = 1, 1
		lambda { n+=1; tn+=n; tn } # triangle numbers generator
	}.call,
	lambda {
		n, pn = 1, 1
		lambda { pn+=3*n+1; n+=1; pn } # pentagonal numbers generator
	}.call,
	lambda {
		n, hn = 1, 1
		lambda { hn+=4*n+1; n+=1; hn } # hexagonal numbers generator
	}.call
]
numbers = [1, 1, 1] # Ti, Pj, Hk
relations = "===" # Ti?Pj, Pj?Hk, Hk?Ti
actions = lambda {
	relation = lambda {|a,b|
		a==b ? '=' : a>b ? '>' : '<'
	}
	when_Nth_is_the_smallest = lambda {|i|
		lambda {
			numbers[i] = generators[i].call
			relations[i] = relation.call(numbers[i], numbers[(i+1)%numbers.size])
			j = (i-1) % relations.size
			relations[j] = relation.call(numbers[j], numbers[(j+1)%numbers.size])
			print "#{numbers[i]}\r"
		}
	}
	(0..2).map{|i| when_Nth_is_the_smallest.call(i) }
}.call
action_table = Hash.new {|h,rel|
	raise "missing action for '#{rel}'"
}
[
	["<<>", "<>>", "<=>", "=<>", "<>="], # when Ti is the smallest
	["><<", "><>", ">=<", "><="], # when Pj is the smallest (and Ti not)
	[">><", "<><", "=><"], # when Hk is the smallest (and the other not)
].each_with_index {|rels, i|
	rels.each {|rel| action_table[rel] = actions[i] }
}
action_table["==="] = lambda {
	puts numbers[0] # answer
	actions[0].call
}
loop {
	action_table[relations].call
}

相当な時間をかけて(求められていない)三番目の数字が出た>57722156241751


六角数は三角数なので三角数は無視できる五角数と六角数を並べて比較していくだ

Project Euler 45,46 - 桃の天然水

それがわからない


Hn = n(2n-1) = (2n-1)(2n)/2 = m(m+1)/2 = Tm (m = 2n-1)

nは自然数だからmは正の奇数になるTriangle Numbersの奇数番目が Hexagonal Numbers.(逆も) 言われたらそうかもねそれぞれの数列を眺めてたら気付くかもね(それが無理なのはわかって)