2017年11月11日土曜日

Project Euler 第5問

Q.
2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.
では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.

A.
考え方としては候補の数のうちより大きい数の約数になるものを除外したものの積を求めるか?
1..10だと
6x7x8x9x10=... 上手くいかない
構成する数を素因数分解して各素数の出現回数の最大を掛けるか?

解説を見てしまった。
結局、これは各々の数の最小公倍数を順に求めるということに置き換わるようだ

n=1;(1..20).each{|i| n = n.lcm(i)};puts n か? 答えは232792560

まあ妥当な考え方ではあるが数学的な基本に至らない自分が悲しい


Project Euler 第4問

Q.
左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.

A. 下記より906609を得た

kouho=[]
999.downto(100) do |i|
999.downto(100) do |j|
next if (i*j).to_s != (i*j).to_s.reverse
kouho.push i*j
break
end
end
puts kouho.max

Project Euler 第3問

Q.
3195 の素因数は 5, 7, 13, 29 である.

600851475143 の素因数のうち最大のものを求めよ.

A. 下記より 6857を得た
target = 600851475143
insu=[]
taisho=target
kouho=3
while kouho * kouho <= target do
while taisho % kouho == 0 do
insu.push kouho
taisho /= kouho
end
kouho +=2
end
puts insu if target != insu.inject(:*)
puts insu.max

2017年11月10日金曜日

Project Euler 第2問

Q.2
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

fib = Enumerator.new do |y|
  a, b = 0, 1
  loop do
    y << a
    a, b = b, a + b
  end
end
を使うようだ。

答えは9227464みたいだ。
でも
http://www.geocities.jp/oraclesqlpuzzle/csharp/csharp-euler-answers.html
を見るとこの半分が答えみたいだ。

ちょっと様子を見る。

Project Euler 第1問

Q.1
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

今後、プロジェクト オイラーをrubyで解く

A.1
(1...1000).select{|x| x % 3 ==0 || x % 5 ==0}.inject(:+)
でもとまる。答えは 233168 (らしい)



例のベンチマークを手持ち主要言語のC#とjavaでやってみた。

まずはmandelbrotの描画
java:  80-105mSぐらい
C# : 198-210mSぐらい
 ※先回の言語たちの最速AccessVBの828mSよりは4-10倍速い
続いて挿入ソート
java: 40-52mSぐらい
C# : 60-80mSぐらい
 ※先回の言語たちの最速ActiveBasicの1000mSよりは15-25倍速い

総じてjavaの方が1.5から2倍ぐらい高速なようだ。

もっとOOPしてきたときにどうなるかは分からないが書き易さは殆んど同じで
コピペで小さなFormを書くならC#の方が若干書きやすいかなって差。
javaの方が例外の処理に対してうるさい感じ。
macでも書けることやjava9の事をかんがえると java ≒ or > c#って感じ

当面はnetbeans + javareplで遊ぶ

2017年11月5日日曜日

古代BASIC系ベンチマーク対決

エントリーするBASIC達
1)99BASIC
2)N88互換BASIC for Win95
3)MBASIC86
4)VBA on Access2010
5)ActiveBASIC424
6)N88BASIC on Anex86
7)ruby 2.33
※rubyは参考値 f-basic on eFMR-50は開くのも馬鹿馬鹿しいのでナシ

ベンチマークするソフト
1)マンデルブロ集合描画(640x400 上限回数100)
2)挿入ソート 10000要素
  計測用のデータはテキストファイルで用意する。
  ruby で (1..10000).to_i.shuffle.each{|i| puts i} > リダイレクトで作成する。

上記のエントリーで2種目を予選として実施してみた。
※F-BASIC on eFMR-50とActiveBasic262は書類選考で脱落って感じ。
 freeBasicは日本語が不得手でエントリーできず。

結果としてソートも種類を持たせずに挿入ソート1本とした。
まあ上記で予選って感じですわ。

---- 結果発表 ----
    名    称              |  挿入ソート (要素数 10000) |  マンデルブロ集合 (640x400)
---------------------+-------------------------------+--------------------------------
99Basic                 | 53 sec                              | 14 sec
Access VBA           | 6.99sec                            | 0.828sec
N88Basic on Anex  | 3442 sec                          | 981sec (16分21秒)
ruby 2.33              | 5.35 sec [oop 1.33sec]      | 9.63 sec (DxRuby利用)
activeBasic4.24     | 1sec 流石はコンパイラ        | 2.04sec 割りと優秀
N88互換Basic        | 1000要素で 96sec クソが! | 3844 sec (64分4秒)
MBasic86              | 1000要素で 38sec              | 1859 sec (30分59秒)
---------------------+-------------------------------+--------------------------------
---- 総評 ----
99Basicはリファレンス的に割りと良い感じ
AccessのVBAは使い慣れているし安心感もあって良い感じ
N88Basic on Anexは特別参加的な感じであるが今回でもう良いかな
ruby は次期標準言語だと思っているけど相応しい速度でありました。
arrayをオープンクラスで拡張するとなお速くなるなどOOP的な架け橋になる
activebasicは割りと小さな実行ファイルを吐けるしコンパイルもそこそこ速くて意外と使えるヤツ
N88互換Basicはダメポ!特にfiles等の命令がないとか、エラーメッセージが無いとか、[]を配列参照に使えなくて元祖N88Basic非互換とか([]を使うとエラー吐かずに死ぬとか考えられないくらい互換を謳うにはお粗末な出来)、目的のファイルなくても落ちるみたいだし、超!遅いし、去ね。
MBasic86はN88互換よりはマシな気もするけどもう良いかって感じ予定実行時間が1/100に成るはずの1000要素のソートで96secとか38secとかマンデル描画で30分以上でAnex上のN8BASICに軽く負けているって存在価値ナシ、特に互換の1時間以上ってもはやゴミ!

決勝進出はactiveBasic,VBA,99Basic,rubyの4者だと思うけど、ベンチはもう良いかって感じ。結局行番号を使うBASICでまだまともに使える感じなのは99Basicのみ。
今後はTPOに応じて使うのみ。

dosvaxj3が更新されていた。

 最近、エミュレータ系をあまり触っていなかったのだけど久しぶりに見てみたらタイトルのようにdosvaxj3が更新されていた。 on emulatorでセルフにcなどのソースを書いて実行するのに母艦側の特定のフォルダをドライブとしてマウント出来たり普通に母艦のimeで漢字が入力でき...