プロジェクトオイラーの第5問解く前に素因数分解しないといけなさそうなので、とりあえず素因数分解の処理だけ書いてみました。
1~10の整数の素因数分解した結果リストを表示
【ソース】
object soinsubunkai{
def main(args:Array[String]) :Unit = {
println((1 to 10).toList.map(getSoinsu(_)))
}
def soinsu(lst:List[Int],moto:Int,waru:Int):List[Int] =
if(moto>waru) {if (moto%waru==0) soinsu(lst:+waru,moto/waru,waru)
else soinsu(lst,moto,waru+1)} else {lst:+waru}
def getSoinsu(num:Int):List[Int] =
if(num>1) soinsu(List(),num,2) else (List())
}
【処理結果】
List(List(), List(2), List(3), List(2, 2), List(5), List(2, 3), List(7), List(2, 2, 2), List(3, 3), List(2, 5))
2011年7月5日火曜日
2011年6月26日日曜日
オイラープロジェクトを解く~Project Euler Problem4 数字の回文?
投稿者
j-chon
タグ
Project euler,
Scala,
技術情報
クリアーo(´д`)o
You are the 87527th person to have solved this problem.
ミスりまくった。問題良く読もう・・・
にしても、なれればループより書くの早いね!
【前提】
Scalaで解く!
【問題】
素因数分解の問題
【解法】
本当は、x*(100 to 999)をフィルターした結果のmaxをリストにして再度maxにしたかったけど、
空っぽのListにはmaxなどのメソッドは使えないらしく、エラーになる。
まあ、ループしてるわけではないのであまり処理速度は変わらない気がするけど・・・
本当は、x*(100 to 999)をフィルターした結果のmaxをリストにして再度maxにしたかったけど、
空っぽのListにはmaxなどのメソッドは使えないらしく、エラーになる。
まあ、ループしてるわけではないのであまり処理速度は変わらない気がするけど・・・
object euler4 {
//全部展開するのは無駄すぎるので没にしたソース
// def main(args:Array[String]) :Unit =
// println((100 to 999).toList.map(x=>(100 to 999).toList.map(y=>x*y)).flatten.filter(x=>checkKaisu(x)).max)
// def chekDigit(lst:List[Char]) :List[Char] =
// if(lst.length > 1 && lst.head==lst.last) chekDigit(lst.init.tail) else lst
// def checkKaisu(num:Long) :Boolean =
// if(chekDigit(num.toString.toCharArray.toList).length < 2) true else false
def main(args:Array[String]) :Unit =
println((100 to 999).toList.map(x=>(100 to 999).toList.map(y=>x*y).filter(z=>checkKaisu(z))).flatten.max )
def chekDigit(lst:List[Char]) :List[Char] =
if(lst.length > 1 && lst.head==lst.last) chekDigit(lst.init.tail) else lst
def checkKaisu(num:Long) :Boolean=
if(chekDigit(num.toString.toCharArray.toList).length < 2) true else false
}
2011年6月10日金曜日
オイラープロジェクトを解く~Project Euler Problem3 素因数分解
投稿者
j-chon
タグ
Project euler,
Scala,
技術情報
クリアーo(´д`)o
You are the 92046th person to have solved this problem.
一発で解けた・・・良かった。
でも、もっと綺麗にかけないものか・・・
【前提】
Scalaで解く!
【問題】
素因数分解の問題
http://projecteuler.net/index.php?section=problems&id=3
【解法】
object euler3 {
def main(args:Array[String]) :Unit = println(warikire(600851475143L,2))
//割り切れるかどうか繰り返し判定していく関数
def warikire(i:Long,k:Long):Long={
if(i>k) {
if (i%k==0)
{
println(k)
warikire(i/k,k)
} else {
warikire(i,k+1)
}
}
else k
}
}
You are the 92046th person to have solved this problem.
一発で解けた・・・良かった。
でも、もっと綺麗にかけないものか・・・
【前提】
Scalaで解く!
【問題】
素因数分解の問題
http://projecteuler.net/index.php?section=problems&id=3
【解法】
object euler3 {
def main(args:Array[String]) :Unit = println(warikire(600851475143L,2))
//割り切れるかどうか繰り返し判定していく関数
def warikire(i:Long,k:Long):Long={
if(i>k) {
if (i%k==0)
{
println(k)
warikire(i/k,k)
} else {
warikire(i,k+1)
}
}
else k
}
}
2011年6月9日木曜日
オイラープロジェクトを解く~Project Euler Problem2
投稿者
j-chon
タグ
Project euler,
Scala,
技術情報
クリアーo(´д`)o
You are the 確認し損ねた…th person to have solved this problem.
【前提】
Scalaで解く!
【問題】
http://projecteuler.net/index.php?section=problems&id=2
【解法】
object euler2 {
def main(args : Array[String]) : Unit =
{
println(fibonacci(4000000).map(x=>if(gusu(x)) x else 0).sum)
}
def fibonacci(max:Int) :List[Int]= {
addNext(List(1,2),max)
}
/**
* リストにリストの最後から2番目と最後の数値を足した値を返す。
*/
def addNext(lst : List[Int],max :Int) :List[Int] =
if((lst.init.last + lst.last) < max) {addNext(lst :+ (lst.init.last + lst.last),max)} else {lst}
def gusu(i:Int)=i/2==i.toDouble/2
}
You are the 確認し損ねた…th person to have solved this problem.
【前提】
Scalaで解く!
【問題】
http://projecteuler.net/index.php?section=problems&id=2
【解法】
object euler2 {
def main(args : Array[String]) : Unit =
{
println(fibonacci(4000000).map(x=>if(gusu(x)) x else 0).sum)
}
def fibonacci(max:Int) :List[Int]= {
addNext(List(1,2),max)
}
/**
* リストにリストの最後から2番目と最後の数値を足した値を返す。
*/
def addNext(lst : List[Int],max :Int) :List[Int] =
if((lst.init.last + lst.last) < max) {addNext(lst :+ (lst.init.last + lst.last),max)} else {lst}
def gusu(i:Int)=i/2==i.toDouble/2
}
2011年6月3日金曜日
フィボナッチ数の偶数番目の項の合計値を求める。
投稿者
j-chon
タグ
Project euler,
Scala,
技術情報
Project Euler Problem1 の問題を読み間違えてしまった・・・
もったいないのでメモ
Scalaでフィボナッチ数の偶数番目の項の合計値を求める。
※ほんとは偶数の項の合計を求める・・・o(´д`)o
object euler_2 {
def main(args : Array[String]) : Unit =
{
println(fibonacciNew(4000000))
println(fibonacciNew(4000000).sum)
}
def fibonacciNew(max:Int):List[Int] = addNextNext(List(2),1,max)
/**
* リストに一個飛ばしでフィボナッチ数を追加する。
*/
def addNextNext(lst : List[Int],before :Int,max :Int) :List[Int] =
if((lst.last * 2 + before) < max) {addNextNext(lst :+ (lst.last * 2 + before),lst.last + before ,max)}
else {lst}
}
もったいないのでメモ
Scalaでフィボナッチ数の偶数番目の項の合計値を求める。
※ほんとは偶数の項の合計を求める・・・o(´д`)o
object euler_2 {
def main(args : Array[String]) : Unit =
{
println(fibonacciNew(4000000))
println(fibonacciNew(4000000).sum)
}
def fibonacciNew(max:Int):List[Int] = addNextNext(List(2),1,max)
/**
* リストに一個飛ばしでフィボナッチ数を追加する。
*/
def addNextNext(lst : List[Int],before :Int,max :Int) :List[Int] =
if((lst.last * 2 + before) < max) {addNextNext(lst :+ (lst.last * 2 + before),lst.last + before ,max)}
else {lst}
}
フィボナッチ数の求め方
Scalaでフィボナッチ数を求める
object fibonacci{
def main(args : Array[String]) : Unit =
{
println(fibonacci(100))
}
def fibonacci(max:Int) :List[Int]= {
addNext(List(1,2),max)
}
/**
* リストにリストの最後から2番目と最後の数値を足した値を返す。
*/
def addNext(lst : List[Int],max :Int) :List[Int] =
if((lst.init.last + lst.last) < max) {addNext(lst :+ (lst.init.last + lst.last),max)}
else {lst}
}
object fibonacci{
def main(args : Array[String]) : Unit =
{
println(fibonacci(100))
}
def fibonacci(max:Int) :List[Int]= {
addNext(List(1,2),max)
}
/**
* リストにリストの最後から2番目と最後の数値を足した値を返す。
*/
def addNext(lst : List[Int],max :Int) :List[Int] =
if((lst.init.last + lst.last) < max) {addNext(lst :+ (lst.init.last + lst.last),max)}
else {lst}
}
2011年5月30日月曜日
オイラープロジェクトを解く~Project Euler Problem1
投稿者
j-chon
タグ
Project euler,
Scala,
暇つぶし
初クリアーo(´д`)o
You are the 147887th person to have solved this problem.
【前提】
Scalaで解く!
【問題】
http://projecteuler.net/index.php?section=problems&id=1
【解法】
object euler_1 {
def main(args : Array[String]) : Unit =
print((1 to 999).toList.map(x=>check(x)).sum)
def warikire(i:Int,k:Int)=
i/k==i.toDouble/k.toDouble
def check(i:Int):Int=
if (warikire(i,3) || warikire(i,5)) i else 0
}
You are the 147887th person to have solved this problem.
【前提】
Scalaで解く!
【問題】
http://projecteuler.net/index.php?section=problems&id=1
【解法】
object euler_1 {
def main(args : Array[String]) : Unit =
print((1 to 999).toList.map(x=>check(x)).sum)
def warikire(i:Int,k:Int)=
i/k==i.toDouble/k.toDouble
def check(i:Int):Int=
if (warikire(i,3) || warikire(i,5)) i else 0
}
2011年5月29日日曜日
EclipseでScala
NetBeansのプラグインがどうしても上手くインストールできなかったので結局Eclipseでやることに。
1.プラグインは以下のパスからダウンロード
http://www.scala-ide.org/
2.オレンジ色のボタンをクリックするとプラグインダウンロード用のサイトパスがクリップボードに
保存される。
あとは、Eclipseのプラグインインストールサイトに追加すればOK
と思ったけど、またエラー・・・
当分、Scalaはテキストで開発します・・・
と、思ったけど最新が2.9Beta版やったので、一個前の安定版をダウンロードしてみることに。
http://download.scala-ide.org/update-1.0.0-milestones-2.8.1.final
そしたら上手くいきました。
とりあえず、eclipseでやっとこう。
1.プラグインは以下のパスからダウンロード
http://www.scala-ide.org/
2.オレンジ色のボタンをクリックするとプラグインダウンロード用のサイトパスがクリップボードに
保存される。
あとは、Eclipseのプラグインインストールサイトに追加すればOK
と思ったけど、またエラー・・・
当分、Scalaはテキストで開発します・・・
と、思ったけど最新が2.9Beta版やったので、一個前の安定版をダウンロードしてみることに。
http://download.scala-ide.org/update-1.0.0-milestones-2.8.1.final
そしたら上手くいきました。
とりあえず、eclipseでやっとこう。
NetBeansのインストールとScalaプラグイン
結局このやり方は上手くいきませんでした・・・
Scala CoreプラグインをインストールしようとしたらRats Parser(org-netbeans-libs-xtc-1.15.nbm)のバージョンが1.4だからだめというメッセージが表示されてインストールできない。
インストールしているのは1.5なんですけど。
というわけで調査中
----------------------------------------------------------------------------------
よく考えたらNetBeans使ったことなかった。
Scalaプラグインの精度がEclipseよりいいらしいのでインストールしてみた。
※Scalaの開発環境構築は以下の記事参照
http://baseballandse.blogspot.com/2011/05/scala.html
1.NetBeansの本家サイトからダウンロード
http://netbeans.org/index.html
3.ライセンス条項、JUnitのインストール共にチェックを付けて実行
4.IDEのインストールパスと、インストール済みのJDKのパスを確認
5.インストール開始!
6.NetBeansをインストールしたら、Scalaのプラグインをダウンロードして解凍する。
http://sourceforge.net/projects/erlybird/files/nb-scala/6.7v1/
7.ダウンロードしたファイルを選んでインストールする。
プラグインの追加をクリックする。

インストールボタンをクリックする。
以上。
Scala CoreプラグインをインストールしようとしたらRats Parser(org-netbeans-libs-xtc-1.15.nbm)のバージョンが1.4だからだめというメッセージが表示されてインストールできない。
インストールしているのは1.5なんですけど。
というわけで調査中
----------------------------------------------------------------------------------
よく考えたらNetBeans使ったことなかった。
Scalaプラグインの精度がEclipseよりいいらしいのでインストールしてみた。
※Scalaの開発環境構築は以下の記事参照
http://baseballandse.blogspot.com/2011/05/scala.html
1.NetBeansの本家サイトからダウンロード
http://netbeans.org/index.html
2.インストーラを実行する。
3.ライセンス条項、JUnitのインストール共にチェックを付けて実行
4.IDEのインストールパスと、インストール済みのJDKのパスを確認
5.インストール開始!
6.NetBeansをインストールしたら、Scalaのプラグインをダウンロードして解凍する。
http://sourceforge.net/projects/erlybird/files/nb-scala/6.7v1/
7.ダウンロードしたファイルを選んでインストールする。
プラグインの追加をクリックする。


以上。
2011年5月6日金曜日
Scala 素数判定と√
√nはmath.sqrt(n)とのこと。
これを利用して、素数かどうか判定する関数を作成する。
素数=2以上√n以下の整数で割り切れない自然数(のはず)なので、
割り切れるかどうかを判別する関数を作成。
⇒2以上√nのリストを上記関数でチェックする。
⇒割り切れる数がなければ素数。
-----------------------------------------
//割り切れるかどうか判定する関数
def warikire(i:Int,k:Int)=i/k==i.toDouble/k.toDouble
//素数判定関数
def sosu(i:Int)=(2 to math.sqrt(i).toInt).exists(warikire(i,_))==false
sosu(10)
Boolean = false
sosu(13)
Boolean = true
-----------------------------------------
(a to b)でa以上b以下の整数のリストを取得できる。
このリストに対して、warikire関数を満たすメンバーが存在するかどうかチェックする。
存在しない場合、existsの結果がfalseで帰ってくるので、false==falseとなった場合に、
sosu関数の結果としてtrueを返す。
てな仕組み。
関数型言語、かなり面白い・・・
これを利用して、素数かどうか判定する関数を作成する。
素数=2以上√n以下の整数で割り切れない自然数(のはず)なので、
割り切れるかどうかを判別する関数を作成。
⇒2以上√nのリストを上記関数でチェックする。
⇒割り切れる数がなければ素数。
-----------------------------------------
//割り切れるかどうか判定する関数
def warikire(i:Int,k:Int)=i/k==i.toDouble/k.toDouble
//素数判定関数
def sosu(i:Int)=(2 to math.sqrt(i).toInt).exists(warikire(i,_))==false
sosu(10)
Boolean = false
sosu(13)
Boolean = true
-----------------------------------------
(a to b)でa以上b以下の整数のリストを取得できる。
このリストに対して、warikire関数を満たすメンバーが存在するかどうかチェックする。
存在しない場合、existsの結果がfalseで帰ってくるので、false==falseとなった場合に、
sosu関数の結果としてtrueを返す。
てな仕組み。
関数型言語、かなり面白い・・・
Scalaで偶数判定
偶数かどうかを判定する関数
-----------------------------------------
(定義)
def gusu(i:Int)=i/2==i.toDouble/2
(使用例)
gusu(4)
res1: Boolean = true
-----------------------------------------
-----------------------------------------
(定義)
def gusu(i:Int)=i/2==i.toDouble/2
(使用例)
gusu(4)
res1: Boolean = true
gusu(4)
res2: Boolean = false
2011年5月4日水曜日
Scalaのセットアップ
ScalaがJavaのランタイムで動くと聞いたので、やってみることに。
関数型オブジェクト指向言語らしい
1.以下のサイトからダウンロード
http://www.scala-lang.org/downloads
2.圧縮ファイルを解凍する。
3.解凍したファイルをCドライブ直下とかに置く
4.例のごとく、binまでのパスを環境変数のpathに設定する。
例)
C:\Program Files\Common Files;C:\Ruby\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\scala_SDK\bin
5.コマンドプロンプトで"scala"を実行。
対話型の入力モードになる。
print("Hello World")
と入力してEnterで
Hello World
と表示される。
1+2と入力しEnterで
res0: Int = 3
と表示される。
6.「
ちなみにAPI集は以下のページ
http://www.scala-lang.org/api/current/index.html
関数型オブジェクト指向言語らしい
1.以下のサイトからダウンロード
http://www.scala-lang.org/downloads
2.圧縮ファイルを解凍する。
3.解凍したファイルをCドライブ直下とかに置く
4.例のごとく、binまでのパスを環境変数のpathに設定する。
例)
C:\Program Files\Common Files;C:\Ruby\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\scala_SDK\bin
5.コマンドプロンプトで"scala"を実行。
対話型の入力モードになる。
print("Hello World")
と入力してEnterで
Hello World
と表示される。
1+2と入力しEnterで
res0: Int = 3
と表示される。
6.「
Ctrl-D」か「
:quit
を入力」で終了
※exitでもOKぽい。
ちなみにAPI集は以下のページ
http://www.scala-lang.org/api/current/index.html
登録:
投稿 (Atom)